diff options
174 files changed, 6606 insertions, 6229 deletions
diff --git a/indra/cmake/run_build_test.py b/indra/cmake/run_build_test.py index fff78ecbe3..0f6967e42a 100644 --- a/indra/cmake/run_build_test.py +++ b/indra/cmake/run_build_test.py @@ -64,20 +64,20 @@ def main(command, libpath=[], vars={}):          # might not exist; instead of KeyError, just use an empty string.          dirs = os.environ.get(var, "").split(os.pathsep)          # Append the sequence in libpath -##         print "%s += %r" % (var, libpath) +        print "%s += %r" % (var, libpath)          dirs.extend(libpath)          # Now rebuild the path string. This way we use a minimum of separators          # -- and we avoid adding a pointless separator when libpath is empty.          os.environ[var] = os.pathsep.join(dirs)      # Now handle arbitrary environment variables. The tricky part is ensuring      # that all the keys and values we try to pass are actually strings. -##     if vars: -##         print "Setting:" -##         for key, value in vars.iteritems(): -##             print "%s=%s" % (key, value) +    if vars: +         print "Setting:" +         for key, value in vars.iteritems(): +             print "%s=%s" % (key, value)      os.environ.update(dict([(str(key), str(value)) for key, value in vars.iteritems()]))      # Run the child process. -##     print "Running: %s" % " ".join(command) +    print "Running: %s" % " ".join(command)      return subprocess.call(command)  if __name__ == "__main__": diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt index f0b4436df5..74b49b846e 100644 --- a/indra/llui/CMakeLists.txt +++ b/indra/llui/CMakeLists.txt @@ -60,6 +60,7 @@ set(llui_SOURCE_FILES      llmultisliderctrl.cpp      llnotifications.cpp      llnotificationslistener.cpp +    llnotificationsutil.cpp      llpanel.cpp      llprogressbar.cpp      llradiogroup.cpp @@ -147,8 +148,10 @@ set(llui_HEADER_FILES      llmultifloater.h       llmultisliderctrl.h      llmultislider.h +    llnotificationptr.h      llnotifications.h      llnotificationslistener.h +    llnotificationsutil.h      llpanel.h      llprogressbar.h      llradiogroup.h diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp index 8930e32055..b91c614424 100644 --- a/indra/llui/llbutton.cpp +++ b/indra/llui/llbutton.cpp @@ -48,7 +48,7 @@  #include "llfloaterreg.h"  #include "llfocusmgr.h"  #include "llwindow.h" -#include "llnotifications.h" +#include "llnotificationsutil.h"  #include "llrender.h"  #include "lluictrlfactory.h"  #include "llhelp.h" @@ -1106,7 +1106,7 @@ void LLButton::showHelp(LLUICtrl* ctrl, const LLSD& sdname)  	// display an error if we can't find a help_topic string.  	// fix this by adding a help_topic attribute to the xui file -	LLNotifications::instance().add("UnableToFindHelpTopic"); +	LLNotificationsUtil::add("UnableToFindHelpTopic");  }  void LLButton::resetMouseDownTimer() diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index 262afbe661..8cf65fe76a 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -66,27 +66,6 @@  // use this to control "jumping" behavior when Ctrl-Tabbing  const S32 TABBED_FLOATER_OFFSET = 0; -std::string	LLFloater::sButtonActiveImageNames[BUTTON_COUNT] =  -{ -	"Icon_Close_Foreground",	//BUTTON_CLOSE -	"Icon_Restore_Foreground",	//BUTTON_RESTORE -	"Icon_Minimize_Foreground",	//BUTTON_MINIMIZE -	"tearoffbox.tga",			//BUTTON_TEAR_OFF -	"Icon_Dock_Foreground",		//BUTTON_DOCK -	"Icon_Undock_Foreground",	//BUTTON_UNDOCK -	"Icon_Help_Foreground"		//BUTTON_HELP -}; - -std::string	LLFloater::sButtonPressedImageNames[BUTTON_COUNT] =  -{ -	"Icon_Close_Press",			//BUTTON_CLOSE -	"Icon_Restore_Press",		//BUTTON_RESTORE -	"Icon_Minimize_Press",		//BUTTON_MINIMIZE -	"tearoff_pressed.tga",		//BUTTON_TEAR_OFF -	"Icon_Dock_Press",			//BUTTON_DOCK -	"Icon_Undock_Press",		//BUTTON_UNDOCK -	"Icon_Help_Press"			//BUTTON_HELP -};  std::string	LLFloater::sButtonNames[BUTTON_COUNT] =   { @@ -195,6 +174,20 @@ LLFloater::Params::Params()  	can_dock("can_dock", false),  	header_height("header_height", 0),  	legacy_header_height("legacy_header_height", 0), +	close_image("close_image"), +	restore_image("restore_image"), +	minimize_image("minimize_image"), +	tear_off_image("tear_off_image"), +	dock_image("dock_image"), +	undock_image("undock_image"), +	help_image("help_image"), +	close_pressed_image("close_pressed_image"), +	restore_pressed_image("restore_pressed_image"), +	minimize_pressed_image("minimize_pressed_image"), +	tear_off_pressed_image("tear_off_pressed_image"), +	dock_pressed_image("dock_pressed_image"), +	undock_pressed_image("undock_pressed_image"), +	help_pressed_image("help_pressed_image"),  	open_callback("open_callback"),  	close_callback("close_callback")  { @@ -247,11 +240,11 @@ LLFloater::LLFloater(const LLSD& key, const LLFloater::Params& p)  	mDocked(false),  	mHasBeenDraggedWhileMinimized(FALSE),  	mPreviousMinimizedBottom(0), -	mPreviousMinimizedLeft(0), -	mNotificationContext(NULL) +	mPreviousMinimizedLeft(0) +//	mNotificationContext(NULL)  {  	mHandle.bind(this); -	mNotificationContext = new LLFloaterNotificationContext(getHandle()); +//	mNotificationContext = new LLFloaterNotificationContext(getHandle());  	// Clicks stop here.  	setMouseOpaque(TRUE); @@ -263,11 +256,9 @@ LLFloater::LLFloater(const LLSD& key, const LLFloater::Params& p)  	// prior rectangle to be used on restore.  	mExpandedRect.set(0,0,0,0); -	for (S32 i = 0; i < BUTTON_COUNT; i++) -	{ -		mButtonsEnabled[i] = FALSE; -		mButtons[i] = NULL; -	} +	memset(mButtonsEnabled, 0, BUTTON_COUNT * sizeof(bool)); +	memset(mButtons, 0, BUTTON_COUNT * sizeof(LLButton*)); +	  	addDragHandle();  	addResizeCtrls(); @@ -276,11 +267,11 @@ LLFloater::LLFloater(const LLSD& key, const LLFloater::Params& p)  	// chrome floaters don't take focus at all  	setFocusRoot(!getIsChrome()); -	initFloater(); +	initFloater(p);  }  // Note: Floaters constructed from XML call init() twice! -void LLFloater::initFloater() +void LLFloater::initFloater(const Params& p)  {  	// Close button.  	if (mCanClose) @@ -305,7 +296,7 @@ void LLFloater::initFloater()  		mButtonsEnabled[BUTTON_DOCK] = TRUE;  	} -	buildButtons(); +	buildButtons(p);  	// Floaters are created in the invisible state	  	setVisible(FALSE); @@ -468,8 +459,8 @@ LLFloater::~LLFloater()  {  	LLFloaterReg::removeInstance(mInstanceName, mKey); -	delete mNotificationContext; -	mNotificationContext = NULL; +//	delete mNotificationContext; +//	mNotificationContext = NULL;  	//// am I not hosted by another floater?  	//if (mHostHandle.isDead()) @@ -1280,7 +1271,7 @@ void LLFloater::removeDependentFloater(LLFloater* floaterp)  	floaterp->mDependeeHandle = LLHandle<LLFloater>();  } -BOOL LLFloater::offerClickToButton(S32 x, S32 y, MASK mask, EFloaterButtons index) +BOOL LLFloater::offerClickToButton(S32 x, S32 y, MASK mask, EFloaterButton index)  {  	if( mButtonsEnabled[index] )  	{ @@ -1798,7 +1789,7 @@ void LLFloater::updateButtons()  		mDragHandle->setMaxTitleWidth(getRect().getWidth() - (button_count * (floater_close_box_size + 1)));  } -void LLFloater::buildButtons() +void LLFloater::buildButtons(const Params& floater_params)  {  	static LLUICachedControl<S32> floater_close_box_size ("UIFloaterCloseBoxSize", 0);  	static LLUICachedControl<S32> close_box_from_top ("UICloseBoxFromTop", 0); @@ -1832,17 +1823,18 @@ void LLFloater::buildButtons()  		LLButton::Params p;  		p.name(sButtonNames[i]);  		p.rect(btn_rect); -		p.image_unselected.name(sButtonActiveImageNames[i]); +		p.image_unselected = getButtonImage(floater_params, (EFloaterButton)i);  		// Selected, no matter if hovered or not, is "pressed" -		p.image_selected.name(sButtonPressedImageNames[i]); -		p.image_hover_selected.name(sButtonPressedImageNames[i]); +		LLUIImage* pressed_image = getButtonPressedImage(floater_params, (EFloaterButton)i); +		p.image_selected = pressed_image; +		p.image_hover_selected = pressed_image;  		// Use a glow effect when the user hovers over the button  		// These icons are really small, need glow amount increased  		p.hover_glow_amount( 0.33f );  		p.click_callback.function(boost::bind(sButtonCallbacks[i], this));  		p.tab_stop(false);  		p.follows.flags(FOLLOWS_TOP|FOLLOWS_RIGHT); -		p.tool_tip(sButtonToolTips[i]); +		p.tool_tip = getButtonTooltip(floater_params, (EFloaterButton)i);  		p.scale_image(true);  		p.chrome(true); @@ -1854,6 +1846,59 @@ void LLFloater::buildButtons()  	updateButtons();  } +// static +LLUIImage* LLFloater::getButtonImage(const Params& p, EFloaterButton e) +{ +	switch(e) +	{ +		default: +		case BUTTON_CLOSE: +			return p.close_image; +		case BUTTON_RESTORE: +			return p.restore_image; +		case BUTTON_MINIMIZE: +			return p.minimize_image; +		case BUTTON_TEAR_OFF: +			return p.tear_off_image; +		case BUTTON_DOCK: +			return p.dock_image; +		case BUTTON_UNDOCK: +			return p.undock_image; +		case BUTTON_HELP: +			return p.help_image; +	} +} + +// static +LLUIImage* LLFloater::getButtonPressedImage(const Params& p, EFloaterButton e) +{ +	switch(e) +	{ +		default: +		case BUTTON_CLOSE: +			return p.close_pressed_image; +		case BUTTON_RESTORE: +			return p.restore_pressed_image; +		case BUTTON_MINIMIZE: +			return p.minimize_pressed_image; +		case BUTTON_TEAR_OFF: +			return p.tear_off_pressed_image; +		case BUTTON_DOCK: +			return p.dock_pressed_image; +		case BUTTON_UNDOCK: +			return p.undock_pressed_image; +		case BUTTON_HELP: +			return p.help_pressed_image; +	} +} + +// static +std::string LLFloater::getButtonTooltip(const Params& p, EFloaterButton e) +{ +	// TODO: per-floater localizable tooltips set in XML +	return sButtonToolTips[e]; +} +  /////////////////////////////////////////////////////  // LLFloaterView @@ -2672,7 +2717,7 @@ bool LLFloater::initFloaterXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr o  	setupParams(params, parent);   	initFromParams(params); -	initFloater(); +	initFloater(params);  	LLMultiFloater* last_host = LLFloater::getFloaterHost();  	if (node->hasName("multi_floater")) diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h index 1b98dddddc..d7ec0aac00 100644 --- a/indra/llui/llfloater.h +++ b/indra/llui/llfloater.h @@ -39,7 +39,7 @@  #include "llpanel.h"  #include "lluuid.h" -#include "llnotifications.h" +//#include "llnotificationsutil.h"  #include <set>  class LLDragHandle; @@ -65,20 +65,6 @@ const BOOL CLOSE_NO = FALSE;  const BOOL ADJUST_VERTICAL_YES = TRUE;  const BOOL ADJUST_VERTICAL_NO = FALSE; -// associates a given notification instance with a particular floater -class LLFloaterNotificationContext :  -	public LLNotificationContext -{ -public: -	LLFloaterNotificationContext(LLHandle<LLFloater> floater_handle) : -		mFloaterHandle(floater_handle) -	{} - -	LLFloater* getFloater() { return mFloaterHandle.get(); } -private: -	LLHandle<LLFloater> mFloaterHandle; -}; -  class LLFloater : public LLPanel  {  friend class LLFloaterView; @@ -97,7 +83,7 @@ public:  |*==========================================================================*/  	}; -	enum EFloaterButtons +	enum EFloaterButton  	{  		BUTTON_CLOSE = 0,  		BUTTON_RESTORE, @@ -128,6 +114,22 @@ public:  								can_dock;  		Optional<S32>			header_height,  								legacy_header_height; // HACK see initFromXML() + +		// Images for top-right controls +		Optional<LLUIImage*>	close_image, +								restore_image, +								minimize_image, +								tear_off_image, +								dock_image, +								undock_image, +								help_image; +		Optional<LLUIImage*>	close_pressed_image, +								restore_pressed_image, +								minimize_pressed_image, +								tear_off_pressed_image, +								dock_pressed_image, +								undock_pressed_image, +								help_pressed_image;  		Optional<CommitCallbackParam> open_callback,  									  close_callback; @@ -158,7 +160,7 @@ public:  	/*virtual*/ void setIsChrome(BOOL is_chrome);  	/*virtual*/ void setRect(const LLRect &rect); -	void 			initFloater(); +	void 			initFloater(const Params& p);  	void			openFloater(const LLSD& key = LLSD()); @@ -264,10 +266,10 @@ public:  	// handle refocusing.  	static void		closeFocusedFloater(); -	LLNotification::Params contextualNotification(const std::string& name)  -	{  -	    return LLNotification::Params(name).context(mNotificationContext);  -	} +//	LLNotification::Params contextualNotification(const std::string& name)  +//	{  +//	    return LLNotification::Params(name).context(mNotificationContext);  +//	}  	static void		onClickClose(LLFloater* floater);  	static void		onClickMinimize(LLFloater* floater); @@ -309,8 +311,15 @@ private:  	void			cleanupHandles(); // remove handles to dead floaters  	void			createMinimizeButton();  	void			updateButtons(); -	void			buildButtons(); -	BOOL			offerClickToButton(S32 x, S32 y, MASK mask, EFloaterButtons index); +	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); +	 +	BOOL			offerClickToButton(S32 x, S32 y, MASK mask, EFloaterButton index);  	void			addResizeCtrls();  	void			layoutResizeCtrls();  	void			enableResizeCtrls(bool enable); @@ -368,7 +377,7 @@ private:  	typedef std::set<LLHandle<LLFloater> >::iterator handle_set_iter_t;  	handle_set_t	mDependents; -	BOOL			mButtonsEnabled[BUTTON_COUNT]; +	bool			mButtonsEnabled[BUTTON_COUNT];  	LLButton*		mButtons[BUTTON_COUNT];  	F32				mButtonScale;  	BOOL			mAutoFocus; @@ -382,8 +391,6 @@ private:  	static LLMultiFloater* sHostp;  	static BOOL		sQuitting; -	static std::string	sButtonActiveImageNames[BUTTON_COUNT]; -	static std::string	sButtonPressedImageNames[BUTTON_COUNT];  	static std::string	sButtonNames[BUTTON_COUNT];  	static std::string	sButtonToolTips[BUTTON_COUNT];  	static std::string  sButtonToolTipsIndex[BUTTON_COUNT]; @@ -401,7 +408,7 @@ private:  	S32				mPreviousMinimizedBottom;  	S32				mPreviousMinimizedLeft; -	LLFloaterNotificationContext* mNotificationContext; +//	LLFloaterNotificationContext* mNotificationContext;  	LLRootHandle<LLFloater>		mHandle;	  }; diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp index bd5734312a..4ea30dbd4d 100644 --- a/indra/llui/lllineeditor.cpp +++ b/indra/llui/lllineeditor.cpp @@ -125,8 +125,8 @@ LLLineEditor::LLLineEditor(const LLLineEditor::Params& p)  	mScrollHPos( 0 ),  	mTextPadLeft(p.text_pad_left),  	mTextPadRight(p.text_pad_right), -	mMinHPixels(0),		// computed in updateTextPadding() below -	mMaxHPixels(0),		// computed in updateTextPadding() below +	mTextLeftEdge(0),		// computed in updateTextPadding() below +	mTextRightEdge(0),		// computed in updateTextPadding() below  	mCommitOnFocusLost( p.commit_on_focus_lost ),  	mRevertOnEsc( p.revert_on_esc ),  	mKeystrokeCallback( p.keystroke_callback() ), @@ -338,9 +338,8 @@ void LLLineEditor::setTextPadding(S32 left, S32 right)  void LLLineEditor::updateTextPadding()  { -	static LLUICachedControl<S32> line_editor_hpad ("UILineEditorHPad", 0); -	mMinHPixels = line_editor_hpad + llclamp(mTextPadLeft, 0, getRect().getWidth());; -	mMaxHPixels = getRect().getWidth() - mMinHPixels - llclamp(mTextPadRight, 0, getRect().getWidth()); +	mTextLeftEdge = llclamp(mTextPadLeft, 0, getRect().getWidth()); +	mTextRightEdge = getRect().getWidth() - llclamp(mTextPadRight, 0, getRect().getWidth());  } @@ -406,8 +405,8 @@ void LLLineEditor::setCursorAtLocalPos( S32 local_mouse_x )  		mScrollHPos +   		mGLFont->charFromPixelOffset(  			wtext, mScrollHPos, -			(F32)(local_mouse_x - mMinHPixels), -			(F32)(mMaxHPixels - mMinHPixels + 1)); // min-max range is inclusive +			(F32)(local_mouse_x - mTextLeftEdge), +			(F32)(mTextRightEdge - mTextLeftEdge + 1)); // min-max range is inclusive  	setCursor(cursor_pos);  } @@ -417,11 +416,11 @@ void LLLineEditor::setCursor( S32 pos )  	mCursorPos = llclamp( pos, 0, mText.length());  	S32 pixels_after_scroll = findPixelNearestPos(); -	if( pixels_after_scroll > mMaxHPixels ) +	if( pixels_after_scroll > mTextRightEdge )  	{  		S32 width_chars_to_left = mGLFont->getWidth(mText.getWString().c_str(), 0, mScrollHPos); -		S32 last_visible_char = mGLFont->maxDrawableChars(mText.getWString().c_str(), llmax(0.f, (F32)(mMaxHPixels - mMinHPixels + width_chars_to_left)));  -		S32 min_scroll = mGLFont->firstDrawableChar(mText.getWString().c_str(), (F32)(mMaxHPixels - mMinHPixels), mText.length(), getCursor()); +		S32 last_visible_char = mGLFont->maxDrawableChars(mText.getWString().c_str(), llmax(0.f, (F32)(mTextRightEdge - mTextLeftEdge + width_chars_to_left)));  +		S32 min_scroll = mGLFont->firstDrawableChar(mText.getWString().c_str(), (F32)(mTextRightEdge - mTextLeftEdge), mText.length(), getCursor());  		if (old_cursor_pos == last_visible_char)  		{  			mScrollHPos = llmin(mText.length(), llmax(min_scroll, mScrollHPos + SCROLL_INCREMENT_ADD)); @@ -682,17 +681,17 @@ BOOL LLLineEditor::handleHover(S32 x, S32 y, MASK mask)  			S32 increment = llround(mScrollTimer.getElapsedTimeF32() / AUTO_SCROLL_TIME);  			mScrollTimer.reset();  			mScrollTimer.setTimerExpirySec(AUTO_SCROLL_TIME); -			if( (x < mMinHPixels) && (mScrollHPos > 0 ) ) +			if( (x < mTextLeftEdge) && (mScrollHPos > 0 ) )  			{  				// Scroll to the left  				mScrollHPos = llclamp(mScrollHPos - increment, 0, mText.length());  			}  			else -			if( (x > mMaxHPixels) && (mCursorPos < (S32)mText.length()) ) +			if( (x > mTextRightEdge) && (mCursorPos < (S32)mText.length()) )  			{  				// If scrolling one pixel would make a difference...  				S32 pixels_after_scrolling_one_char = findPixelNearestPos(1); -				if( pixels_after_scrolling_one_char >= mMaxHPixels ) +				if( pixels_after_scrolling_one_char >= mTextRightEdge )  				{  					// ...scroll to the right  					mScrollHPos = llclamp(mScrollHPos + increment, 0, mText.length()); @@ -1671,7 +1670,7 @@ void LLLineEditor::draw()  	}  	S32 rendered_text = 0; -	F32 rendered_pixels_right = (F32)mMinHPixels; +	F32 rendered_pixels_right = (F32)mTextLeftEdge;  	F32 text_bottom = (F32)background.mBottom + (F32)lineeditor_v_pad;  	if( (gFocusMgr.getKeyboardFocus() == this) && hasSelection() ) @@ -1700,17 +1699,17 @@ void LLLineEditor::draw()  				0,  				LLFontGL::NO_SHADOW,  				select_left - mScrollHPos, -				mMaxHPixels - llround(rendered_pixels_right), +				mTextRightEdge - llround(rendered_pixels_right),  				&rendered_pixels_right);  		} -		if( (rendered_pixels_right < (F32)mMaxHPixels) && (rendered_text < text_len) ) +		if( (rendered_pixels_right < (F32)mTextRightEdge) && (rendered_text < text_len) )  		{  			LLColor4 color = mHighlightColor;  			color.setAlpha(alpha);  			// selected middle  			S32 width = mGLFont->getWidth(mText.getWString().c_str(), mScrollHPos + rendered_text, select_right - mScrollHPos - rendered_text); -			width = llmin(width, mMaxHPixels - llround(rendered_pixels_right)); +			width = llmin(width, mTextRightEdge - llround(rendered_pixels_right));  			gl_rect_2d(llround(rendered_pixels_right), cursor_top, llround(rendered_pixels_right)+width, cursor_bottom, color);  			LLColor4 tmp_color( 1.f - text_color.mV[0], 1.f - text_color.mV[1], 1.f - text_color.mV[2], alpha ); @@ -1722,11 +1721,11 @@ void LLLineEditor::draw()  				0,  				LLFontGL::NO_SHADOW,  				select_right - mScrollHPos - rendered_text, -				mMaxHPixels - llround(rendered_pixels_right), +				mTextRightEdge - llround(rendered_pixels_right),  				&rendered_pixels_right);  		} -		if( (rendered_pixels_right < (F32)mMaxHPixels) && (rendered_text < text_len) ) +		if( (rendered_pixels_right < (F32)mTextRightEdge) && (rendered_text < text_len) )  		{  			// unselected, right side  			mGLFont->render(  @@ -1737,7 +1736,7 @@ void LLLineEditor::draw()  				0,  				LLFontGL::NO_SHADOW,  				S32_MAX, -				mMaxHPixels - llround(rendered_pixels_right), +				mTextRightEdge - llround(rendered_pixels_right),  				&rendered_pixels_right);  		}  	} @@ -1751,7 +1750,7 @@ void LLLineEditor::draw()  			0,  			LLFontGL::NO_SHADOW,  			S32_MAX, -			mMaxHPixels - llround(rendered_pixels_right), +			mTextRightEdge - llround(rendered_pixels_right),  			&rendered_pixels_right);  	}  #if 1 // for when we're ready for image art. @@ -1809,14 +1808,14 @@ void LLLineEditor::draw()  		if (0 == mText.length() && mReadOnly)  		{  			mGLFont->render(mLabel.getWString(), 0, -							mMinHPixels, (F32)text_bottom, +							mTextLeftEdge, (F32)text_bottom,  							label_color,  							LLFontGL::LEFT,  							LLFontGL::BOTTOM,  							0,  							LLFontGL::NO_SHADOW,  							S32_MAX, -							mMaxHPixels - llround(rendered_pixels_right), +							mTextRightEdge - llround(rendered_pixels_right),  							&rendered_pixels_right, FALSE);  		} @@ -1834,14 +1833,14 @@ void LLLineEditor::draw()  		if (0 == mText.length())  		{  			mGLFont->render(mLabel.getWString(), 0, -							mMinHPixels, (F32)text_bottom, +							mTextLeftEdge, (F32)text_bottom,  							label_color,  							LLFontGL::LEFT,  							LLFontGL::BOTTOM,  							0,  							LLFontGL::NO_SHADOW,  							S32_MAX, -							mMaxHPixels - llround(rendered_pixels_right), +							mTextRightEdge - llround(rendered_pixels_right),  							&rendered_pixels_right, FALSE);  		}  		// Draw children (border) @@ -1859,7 +1858,7 @@ void LLLineEditor::draw()  S32 LLLineEditor::findPixelNearestPos(const S32 cursor_offset) const  {  	S32 dpos = getCursor() - mScrollHPos + cursor_offset; -	S32 result = mGLFont->getWidth(mText.getWString().c_str(), mScrollHPos, dpos) + mMinHPixels; +	S32 result = mGLFont->getWidth(mText.getWString().c_str(), mScrollHPos, dpos) + mTextLeftEdge;  	return result;  } diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h index 4c4b00094d..b96220e020 100644 --- a/indra/llui/lllineeditor.h +++ b/indra/llui/lllineeditor.h @@ -303,8 +303,8 @@ protected:  	LLFrameTimer mScrollTimer;  	S32			mTextPadLeft;				// Used to reserve space before the beginning of the text for children.  	S32			mTextPadRight;				// Used to reserve space after the end of the text for children. -	S32			mMinHPixels; -	S32			mMaxHPixels; +	S32			mTextLeftEdge;				// Pixels, cached left edge of text based on left padding and width +	S32			mTextRightEdge;				// Pixels, cached right edge of text based on right padding and width  	BOOL		mCommitOnFocusLost;  	BOOL		mRevertOnEsc; diff --git a/indra/llui/llnotificationptr.h b/indra/llui/llnotificationptr.h new file mode 100644 index 0000000000..0718f7d182 --- /dev/null +++ b/indra/llui/llnotificationptr.h @@ -0,0 +1,41 @@ +/** + * @file llnotificationptr.h + * + * $LicenseInfo:firstyear=2008&license=viewergpl$ + *  + * Copyright (c) 2008-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 LLNOTIFICATIONPTR_H +#define LLNOTIFICATIONPTR_H + +// Many classes just store a single LLNotificationPtr +// and llnotifications.h is very large, so define this ligher header. +#include <boost/shared_ptr.hpp> + +class LLNotification; +typedef boost::shared_ptr<LLNotification> LLNotificationPtr; + +#endif diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp index eb8cc3e2c5..05f2d3a9cf 100644 --- a/indra/llui/llnotifications.cpp +++ b/indra/llui/llnotifications.cpp @@ -1395,10 +1395,9 @@ void LLNotifications::addFromCallback(const LLSD& name)  	add(LLNotification::Params().name(name.asString()));	  } -// we provide a couple of simple add notification functions so that it's reasonable to create notifications in one line  LLNotificationPtr LLNotifications::add(const std::string& name,  -										const LLSD& substitutions,  -										const LLSD& payload) +									   const LLSD& substitutions,  +									   const LLSD& payload)  {  	LLNotification::Params::Functor functor_p;  	functor_p.name = name; @@ -1406,15 +1405,16 @@ LLNotificationPtr LLNotifications::add(const std::string& name,  }  LLNotificationPtr LLNotifications::add(const std::string& name,  -										const LLSD& substitutions,  -										const LLSD& payload,  -										const std::string& functor_name) +									   const LLSD& substitutions,  +									   const LLSD& payload,  +									   const std::string& functor_name)  {  	LLNotification::Params::Functor functor_p;  	functor_p.name = functor_name;  	return add(LLNotification::Params().name(name).substitutions(substitutions).payload(payload).functor(functor_p));	  } - +							   +//virtual  LLNotificationPtr LLNotifications::add(const std::string& name,   										const LLSD& substitutions,   										const LLSD& payload,  diff --git a/indra/llui/llnotifications.h b/indra/llui/llnotifications.h index 0d7cb74f70..aeb4cebf1b 100644 --- a/indra/llui/llnotifications.h +++ b/indra/llui/llnotifications.h @@ -103,9 +103,7 @@  #include "llpointer.h"  #include "llinitparam.h"  #include "llnotificationslistener.h" - -class LLNotification; -typedef boost::shared_ptr<LLNotification> LLNotificationPtr; +#include "llnotificationptr.h"  typedef enum e_notification_priority @@ -841,10 +839,11 @@ public:  	// Add a simple notification (from XUI)  	void addFromCallback(const LLSD& name); -	// we provide a collection of simple add notification functions so that it's reasonable to create notifications in one line +	// *NOTE: To add simple notifications, #include "llnotificationsutil.h" +	// and use LLNotificationsUtil::add("MyNote") or add("MyNote", args)  	LLNotificationPtr add(const std::string& name,  -						const LLSD& substitutions = LLSD(),  -						const LLSD& payload = LLSD()); +						const LLSD& substitutions, +						const LLSD& payload);  	LLNotificationPtr add(const std::string& name,   						const LLSD& substitutions,   						const LLSD& payload,  diff --git a/indra/llui/llnotificationsutil.cpp b/indra/llui/llnotificationsutil.cpp new file mode 100644 index 0000000000..2cd165f1b3 --- /dev/null +++ b/indra/llui/llnotificationsutil.cpp @@ -0,0 +1,91 @@ +/** + * @file llnotificationsutil.cpp + * + * $LicenseInfo:firstyear=2008&license=viewergpl$ + *  + * Copyright (c) 2008-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 "linden_common.h" + +#include "llnotificationsutil.h" + +#include "llnotifications.h" +#include "llsd.h" +#include "llxmlnode.h"	// apparently needed to call LLNotifications::instance() + +LLNotificationPtr LLNotificationsUtil::add(const std::string& name) +{ +	LLNotification::Params::Functor functor_p; +	functor_p.name = name; +	return LLNotifications::instance().add( +		LLNotification::Params().name(name).substitutions(LLSD()).payload(LLSD()).functor(functor_p));	 +} + +LLNotificationPtr LLNotificationsUtil::add(const std::string& name,  +					  const LLSD& substitutions) +{ +	LLNotification::Params::Functor functor_p; +	functor_p.name = name; +	return LLNotifications::instance().add( +		LLNotification::Params().name(name).substitutions(substitutions).payload(LLSD()).functor(functor_p));	 +} + +LLNotificationPtr LLNotificationsUtil::add(const std::string& name,  +					  const LLSD& substitutions,  +					  const LLSD& payload) +{ +	LLNotification::Params::Functor functor_p; +	functor_p.name = name; +	return LLNotifications::instance().add( +		LLNotification::Params().name(name).substitutions(substitutions).payload(payload).functor(functor_p));	 +} + +LLNotificationPtr LLNotificationsUtil::add(const std::string& name,  +					  const LLSD& substitutions,  +					  const LLSD& payload,  +					  const std::string& functor_name) +{ +	LLNotification::Params::Functor functor_p; +	functor_p.name = functor_name; +	return LLNotifications::instance().add( +		LLNotification::Params().name(name).substitutions(substitutions).payload(payload).functor(functor_p));	 +} + +LLNotificationPtr LLNotificationsUtil::add(const std::string& name,  +					  const LLSD& substitutions,  +					  const LLSD& payload,  +					  boost::function<void (const LLSD&, const LLSD&)> functor) +{ +	LLNotification::Params::Functor functor_p; +	functor_p.function = functor; +	return LLNotifications::instance().add( +		LLNotification::Params().name(name).substitutions(substitutions).payload(payload).functor(functor_p));	 +} + +S32 LLNotificationsUtil::getSelectedOption(const LLSD& notification, const LLSD& response) +{ +	return LLNotification::getSelectedOption(notification, response); +} diff --git a/indra/llui/llnotificationsutil.h b/indra/llui/llnotificationsutil.h new file mode 100644 index 0000000000..a0801b338f --- /dev/null +++ b/indra/llui/llnotificationsutil.h @@ -0,0 +1,68 @@ +/** + * @file llnotificationsutil.h + * + * $LicenseInfo:firstyear=2008&license=viewergpl$ + *  + * Copyright (c) 2008-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 LLNOTIFICATIONSUTIL_H +#define LLNOTIFICATIONSUTIL_H + +// The vast majority of clients of the notifications system just want to add  +// a notification to the screen, so define this lightweight public interface +// to avoid including the heavyweight llnotifications.h + +#include "llnotificationptr.h" + +#include <boost/function.hpp> + +class LLSD; + +namespace LLNotificationsUtil +{ +	LLNotificationPtr add(const std::string& name); +	 +	LLNotificationPtr add(const std::string& name,  +						  const LLSD& substitutions); +	 +	LLNotificationPtr add(const std::string& name,  +						  const LLSD& substitutions,  +						  const LLSD& payload); +	 +	LLNotificationPtr add(const std::string& name,  +						  const LLSD& substitutions,  +						  const LLSD& payload,  +						  const std::string& functor_name); + +	LLNotificationPtr add(const std::string& name,  +						  const LLSD& substitutions,  +						  const LLSD& payload,  +						  boost::function<void (const LLSD&, const LLSD&)> functor); +	 +	S32 getSelectedOption(const LLSD& notification, const LLSD& response); +} + +#endif diff --git a/indra/llxuixml/lltrans.cpp b/indra/llxuixml/lltrans.cpp index 4c800a502d..d6f17dbb08 100644 --- a/indra/llxuixml/lltrans.cpp +++ b/indra/llxuixml/lltrans.cpp @@ -162,7 +162,7 @@ std::string LLTrans::getString(const std::string &xml_desc, const LLStringUtil::  		args["STRING_NAME"] = xml_desc;  		LL_WARNS_ONCE("configuration") << "Missing String in strings.xml: [" << xml_desc << "]" << LL_ENDL; -		//LLNotifications::instance().add("MissingString", args); // *TODO: resurrect +		//LLNotificationsUtil::add("MissingString", args); // *TODO: resurrect  		//return xml_desc;  		return "MissingString("+xml_desc+")"; @@ -189,7 +189,7 @@ bool LLTrans::findString(std::string &result, const std::string &xml_desc, const  		LLSD args;  		args["STRING_NAME"] = xml_desc;  		LL_WARNS_ONCE("configuration") << "Missing String in strings.xml: [" << xml_desc << "]" << LL_ENDL; -		//LLNotifications::instance().add("MissingString", args); +		//LLNotificationsUtil::add("MissingString", args);  		return false;  	} diff --git a/indra/newview/app_settings/logcontrol.xml b/indra/newview/app_settings/logcontrol.xml index ec80d2d014..d7bb64ce8a 100644 --- a/indra/newview/app_settings/logcontrol.xml +++ b/indra/newview/app_settings/logcontrol.xml @@ -34,7 +34,6 @@  						</array>  					<key>classes</key>  						<array> -							<string>LLBottomTray</string>  						</array>  					<key>files</key>  						<array> diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 075aee46c7..b0f782622c 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -9251,17 +9251,6 @@        <key>Value</key>        <integer>2</integer>      </map> -    <key>UILineEditorHPad</key> -    <map> -      <key>Comment</key> -      <string>UI Line Editor Horizontal Pad</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>S32</string> -      <key>Value</key> -      <integer>2</integer> -    </map>      <key>UILineEditorVPad</key>      <map>        <key>Comment</key> diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 2644235114..2b582c90f0 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -58,6 +58,7 @@  #include "llmoveview.h"  #include "llnavigationbar.h" // to show/hide navigation bar when changing mouse look state  #include "llnearbychatbar.h" +#include "llnotificationsutil.h"  #include "llparcel.h"  #include "llsdutil.h"  #include "llsidetray.h" @@ -2304,11 +2305,11 @@ void LLAgent::stopAutoPilot(BOOL user_cancel)  		if (user_cancel && !mAutoPilotBehaviorName.empty())  		{  			if (mAutoPilotBehaviorName == "Sit") -				LLNotifications::instance().add("CancelledSit"); +				LLNotificationsUtil::add("CancelledSit");  			else if (mAutoPilotBehaviorName == "Attach") -				LLNotifications::instance().add("CancelledAttach"); +				LLNotificationsUtil::add("CancelledAttach");  			else -				LLNotifications::instance().add("Cancelled"); +				LLNotificationsUtil::add("Cancelled");  		}  	}  } diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index 475f34dc2b..18a8396451 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -41,6 +41,7 @@  #include "llinventorybridge.h"  #include "llinventoryobserver.h"  #include "llinventorypanel.h" +#include "llnotificationsutil.h"  #include "llnotify.h"  #include "llviewerregion.h"  #include "llvoavatarself.h" @@ -1017,7 +1018,7 @@ void LLAgentWearables::onInitialWearableAssetArrived(LLWearable* wearable, void*  void LLAgentWearables::recoverMissingWearable(const EWearableType type, U32 index)  {  	// Try to recover by replacing missing wearable with a new one. -	LLNotifications::instance().add("ReplacedMissingWearable"); +	LLNotificationsUtil::add("ReplacedMissingWearable");  	lldebugs << "Wearable " << LLWearableDictionary::getTypeLabel(type) << " could not be downloaded.  Replaced inventory item with default wearable." << llendl;  	LLWearable* new_wearable = LLWearableList::instance().createNewWearable(type); @@ -1386,7 +1387,7 @@ void LLAgentWearables::removeWearable(const EWearableType type, bool do_remove_a  				LLSD payload;  				payload["wearable_type"] = (S32)type;  				// Bring up view-modal dialog: Save changes? Yes, No, Cancel -				LLNotifications::instance().add("WearableSave", LLSD(), payload, &LLAgentWearables::onRemoveWearableDialog); +				LLNotificationsUtil::add("WearableSave", LLSD(), payload, &LLAgentWearables::onRemoveWearableDialog);  				return;  			}  			else @@ -1403,7 +1404,7 @@ void LLAgentWearables::removeWearable(const EWearableType type, bool do_remove_a  // static   bool LLAgentWearables::onRemoveWearableDialog(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	EWearableType type = (EWearableType)notification["payload"]["wearable_type"].asInteger();  	switch(option)  	{ @@ -1608,7 +1609,7 @@ void LLAgentWearables::setWearableItem(LLInventoryItem* new_item, LLWearable* ne  				// Bring up modal dialog: Save changes? Yes, No, Cancel  				LLSD payload;  				payload["item_id"] = new_item->getUUID(); -				LLNotifications::instance().add("WearableSave", LLSD(), payload, boost::bind(onSetWearableDialog, _1, _2, new_wearable)); +				LLNotificationsUtil::add("WearableSave", LLSD(), payload, boost::bind(onSetWearableDialog, _1, _2, new_wearable));  				return;  			}  		} @@ -1620,7 +1621,7 @@ void LLAgentWearables::setWearableItem(LLInventoryItem* new_item, LLWearable* ne  // static   bool LLAgentWearables::onSetWearableDialog(const LLSD& notification, const LLSD& response, LLWearable* wearable)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	LLInventoryItem* new_item = gInventory.getItem(notification["payload"]["item_id"].asUUID());  	if (!new_item)  	{ diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 6288088210..c7f05d99f7 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -39,7 +39,7 @@  #include "llgesturemgr.h"  #include "llinventorybridge.h"  #include "llinventoryobserver.h" -#include "llnotifications.h" +#include "llnotificationsutil.h"  #include "llsidepanelappearance.h"  #include "llsidetray.h"  #include "llvoavatar.h" @@ -637,7 +637,7 @@ void LLAppearanceManager::updateAppearanceFromCOF()  	if( !wear_items.count() && !obj_items.count() && !gest_items.count())  	{ -		LLNotifications::instance().add("CouldNotPutOnOutfit"); +		LLNotificationsUtil::add("CouldNotPutOnOutfit");  		return;  	} diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 3e10c4b2b0..f196ebbf93 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -90,6 +90,8 @@  #include "llvolumemgr.h"  #include "llnotificationmanager.h" +#include "llnotifications.h" +#include "llnotificationsutil.h"  // Third party library includes  #include <boost/bind.hpp> @@ -866,7 +868,7 @@ bool LLAppViewer::init()  		if (LLFeatureManager::getInstance()->getGPUClass() == GPU_CLASS_UNKNOWN)  		{ -			LLNotifications::instance().add("UnknownGPU"); +			LLNotificationsUtil::add("UnknownGPU");  		}   		if(unsupported) @@ -875,7 +877,7 @@ bool LLAppViewer::init()  				|| gSavedSettings.getBOOL("WarnUnsupportedHardware"))  			{  				args["MINSPECS"] = minSpecs; -				LLNotifications::instance().add("UnsupportedHardware", args ); +				LLNotificationsUtil::add("UnsupportedHardware", args );  			}  		} @@ -2857,7 +2859,7 @@ void LLAppViewer::requestQuit()  static bool finish_quit(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (option == 0)  	{ @@ -2869,7 +2871,7 @@ static LLNotificationFunctorRegistration finish_quit_reg("ConfirmQuit", finish_q  void LLAppViewer::userQuit()  { -	LLNotifications::instance().add("ConfirmQuit"); +	LLNotificationsUtil::add("ConfirmQuit");  }  static bool finish_early_exit(const LLSD& notification, const LLSD& response) @@ -2882,7 +2884,7 @@ void LLAppViewer::earlyExit(const std::string& name, const LLSD& substitutions)  {     	llwarns << "app_early_exit: " << name << llendl;  	gDoDisconnect = TRUE; -	LLNotifications::instance().add(name, substitutions, LLSD(), finish_early_exit); +	LLNotificationsUtil::add(name, substitutions, LLSD(), finish_early_exit);  }  void LLAppViewer::forceExit(S32 arg) @@ -3200,7 +3202,7 @@ std::string LLAppViewer::getWindowTitle() const  // Callback from a dialog indicating user was logged out.    bool finish_disconnect(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (1 == option)  	{ @@ -3240,12 +3242,12 @@ void LLAppViewer::forceDisconnect(const std::string& mesg)  	{  		// Tell users what happened  		args["ERROR_MESSAGE"] = big_reason; -		LLNotifications::instance().add("ErrorMessage", args, LLSD(), &finish_forced_disconnect); +		LLNotificationsUtil::add("ErrorMessage", args, LLSD(), &finish_forced_disconnect);  	}  	else  	{  		args["MESSAGE"] = big_reason; -		LLNotifications::instance().add("YouHaveBeenLoggedOut", args, LLSD(), &finish_disconnect ); +		LLNotificationsUtil::add("YouHaveBeenLoggedOut", args, LLSD(), &finish_disconnect );  	}  } diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp index 38843c7221..d5f9f7ca5d 100644 --- a/indra/newview/llassetuploadresponders.cpp +++ b/indra/newview/llassetuploadresponders.cpp @@ -63,6 +63,7 @@  #include "lleconomy.h"  #include "llfloaterreg.h"  #include "llfocusmgr.h" +#include "llnotificationsutil.h"  #include "llscrolllistctrl.h"  #include "llsdserialize.h"  #include "llvfs.h" @@ -120,14 +121,14 @@ void LLAssetUploadResponder::error(U32 statusNum, const std::string& reason)  			args["FILE"] = (mFileName.empty() ? mVFileID.asString() : mFileName);  			args["REASON"] = "Error in upload request.  Please visit "  				"http://secondlife.com/support for help fixing this problem."; -			LLNotifications::instance().add("CannotUploadReason", args); +			LLNotificationsUtil::add("CannotUploadReason", args);  			break;  		case 500:  		default:  			args["FILE"] = (mFileName.empty() ? mVFileID.asString() : mFileName);  			args["REASON"] = "The server is experiencing unexpected "  				"difficulties."; -			LLNotifications::instance().add("CannotUploadReason", args); +			LLNotificationsUtil::add("CannotUploadReason", args);  			break;  	}  	LLUploadDialog::modalUploadFinished(); @@ -189,7 +190,7 @@ void LLAssetUploadResponder::uploadFailure(const LLSD& content)  		LLSD args;  		args["FILE"] = (mFileName.empty() ? mVFileID.asString() : mFileName);  		args["REASON"] = content["message"].asString(); -		LLNotifications::instance().add("CannotUploadReason", args); +		LLNotificationsUtil::add("CannotUploadReason", args);  	}  } @@ -232,7 +233,7 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content)  		LLSD args;  		args["AMOUNT"] = llformat("%d", expected_upload_cost); -		LLNotifications::instance().add("UploadPayment", args); +		LLNotificationsUtil::add("UploadPayment", args);  	}  	// Actually add the upload to viewer inventory diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index b08191ce15..a7a6da3ac2 100644 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -38,6 +38,7 @@  #include "llsd.h"  #include "lldarray.h"  #include "llnotifications.h" +#include "llnotificationsutil.h"  #include "roles_constants.h"    // for GP_MEMBER_INVITE @@ -69,7 +70,7 @@ void LLAvatarActions::requestFriendshipDialog(const LLUUID& id, const std::strin  {  	if(id == gAgentID)  	{ -		LLNotifications::instance().add("AddSelfFriend"); +		LLNotificationsUtil::add("AddSelfFriend");  		return;  	} @@ -83,11 +84,11 @@ void LLAvatarActions::requestFriendshipDialog(const LLUUID& id, const std::strin  	{  		// Old and busted server version, doesn't support friend  		// requests with messages. -    	LLNotifications::instance().add("AddFriend", args, payload, &callbackAddFriend); +    	LLNotificationsUtil::add("AddFriend", args, payload, &callbackAddFriend);  	}  	else  	{ -    	LLNotifications::instance().add("AddFriendWithMessage", args, payload, &callbackAddFriendWithMessage); +    	LLNotificationsUtil::add("AddFriendWithMessage", args, payload, &callbackAddFriendWithMessage);  	}  	// add friend to recent people list @@ -149,7 +150,7 @@ void LLAvatarActions::removeFriendsDialog(const std::vector<LLUUID>& ids)  		payload["ids"].append(*it);  	} -	LLNotifications::instance().add(msgType, +	LLNotificationsUtil::add(msgType,  		args,  		payload,  		&handleRemove); @@ -380,7 +381,7 @@ void LLAvatarActions::inviteToGroup(const LLUUID& id)  // static  bool LLAvatarActions::handleRemove(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	const LLSD& ids = notification["payload"]["ids"];  	for (LLSD::array_const_iterator itr = ids.beginArray(); itr != ids.endArray(); ++itr) @@ -414,7 +415,7 @@ bool LLAvatarActions::handleRemove(const LLSD& notification, const LLSD& respons  // static  bool LLAvatarActions::handlePay(const LLSD& notification, const LLSD& response, LLUUID avatar_id)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (option == 0)  	{  		gAgent.clearBusy(); @@ -437,7 +438,7 @@ void LLAvatarActions::callback_invite_to_group(LLUUID group_id, LLUUID id)  // static  bool LLAvatarActions::callbackAddFriendWithMessage(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (option == 0)  	{  		requestFriendship(notification["payload"]["id"].asUUID(),  @@ -450,7 +451,7 @@ bool LLAvatarActions::callbackAddFriendWithMessage(const LLSD& notification, con  // static  bool LLAvatarActions::callbackAddFriend(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (option == 0)  	{  		// Servers older than 1.25 require the text of the message to be the diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index c4f0fa53a7..9cc7b8c785 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -40,6 +40,7 @@  #include "llimfloater.h" // for LLIMFloater  #include "lllayoutstack.h"  #include "llnearbychatbar.h" +#include "llnotificationsutil.h"  #include "llspeakbutton.h"  #include "llsplitbutton.h"  #include "llsyswellwindow.h" @@ -941,7 +942,7 @@ void LLBottomTray::setTrayButtonVisibleIfPossible(EResizeState shown_object_type  	{  		// mark this button to show it while future bottom tray extending  		mResizeState |= shown_object_type; -		LLNotifications::instance().add("BottomTrayButtonCanNotBeShown"); +		LLNotificationsUtil::add("BottomTrayButtonCanNotBeShown");  	}  } diff --git a/indra/newview/llcallingcard.cpp b/indra/newview/llcallingcard.cpp index 0b10255c2f..476f1f41ac 100644 --- a/indra/newview/llcallingcard.cpp +++ b/indra/newview/llcallingcard.cpp @@ -53,6 +53,8 @@  #include "llbutton.h"  #include "llinventoryobserver.h"  #include "llinventorymodel.h" +#include "llnotifications.h" +#include "llnotificationsutil.h"  #include "llnotify.h"  #include "llresmgr.h"  #include "llimview.h" @@ -640,11 +642,11 @@ void LLAvatarTracker::processChange(LLMessageSystem* msg)  					}  					if(LLRelationship::GRANT_MODIFY_OBJECTS & new_rights)  					{ -						LLNotifications::instance().add("GrantedModifyRights",args); +						LLNotificationsUtil::add("GrantedModifyRights",args);  					}  					else  					{ -						LLNotifications::instance().add("RevokedModifyRights",args); +						LLNotificationsUtil::add("RevokedModifyRights",args);  					}  				}  				(mBuddyInfo[agent_id])->setRightsFrom(new_rights); @@ -714,7 +716,7 @@ void LLAvatarTracker::processNotify(LLMessageSystem* msg, bool online)  		if(notify)  		{  			// Popup a notify box with online status of this agent -			LLNotificationPtr notification = LLNotifications::instance().add(online ? "FriendOnline" : "FriendOffline", args); +			LLNotificationPtr notification = LLNotificationsUtil::add(online ? "FriendOnline" : "FriendOffline", args);  			// If there's an open IM session with this agent, send a notification there too.  			LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, agent_id); diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp index 90f246ddaf..f41e326dd0 100644 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -32,6 +32,7 @@  #include "llviewerprecompiledheaders.h" // must be first include  #include "llchiclet.h" +  #include "llagent.h"  #include "llavataractions.h"  #include "llbottomtray.h" @@ -42,6 +43,8 @@  #include "llfloaterreg.h"  #include "lllocalcliprect.h"  #include "llmenugl.h" +#include "llnotifications.h" +#include "llnotificationsutil.h"  #include "lloutputmonitorctrl.h"  #include "llscriptfloater.h"  #include "lltextbox.h" diff --git a/indra/newview/llcompilequeue.cpp b/indra/newview/llcompilequeue.cpp index 9d3b92d937..eb9a2fec2f 100644 --- a/indra/newview/llcompilequeue.cpp +++ b/indra/newview/llcompilequeue.cpp @@ -60,6 +60,7 @@  #include "llbutton.h"  #include "lldir.h"  #include "llfloaterchat.h" +#include "llnotificationsutil.h"  #include "llviewerstats.h"  #include "llvfile.h"  #include "lluictrlfactory.h" @@ -480,7 +481,7 @@ void LLFloaterCompileQueue::onSaveTextComplete(const LLUUID& asset_id, void* use  		llwarns << "Unable to save text for script." << llendl;  		LLSD args;  		args["REASON"] = std::string(LLAssetStorage::getErrorString(status)); -		LLNotifications::instance().add("CompileQueueSaveText", args); +		LLNotificationsUtil::add("CompileQueueSaveText", args);  	}  } @@ -500,7 +501,7 @@ void LLFloaterCompileQueue::onSaveBytecodeComplete(const LLUUID& asset_id, void*  		llwarns << "Unable to save bytecode for script." << llendl;  		LLSD args;  		args["REASON"] = std::string(LLAssetStorage::getErrorString(status)); -		LLNotifications::instance().add("CompileQueueSaveBytecode", args); +		LLNotificationsUtil::add("CompileQueueSaveBytecode", args);  	}  	delete data;  	data = NULL; diff --git a/indra/newview/llconfirmationmanager.cpp b/indra/newview/llconfirmationmanager.cpp index 5813943ad3..4b73339957 100644 --- a/indra/newview/llconfirmationmanager.cpp +++ b/indra/newview/llconfirmationmanager.cpp @@ -37,7 +37,7 @@  #include "lluictrlfactory.h"  // viewer includes -#include "llnotifications.h" +#include "llnotificationsutil.h"  #include "llstring.h"  #include "llxmlnode.h" @@ -48,7 +48,7 @@ LLConfirmationManager::ListenerBase::~ListenerBase()  static bool onConfirmAlert(const LLSD& notification, const LLSD& response, LLConfirmationManager::ListenerBase* listener)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (option == 0)  	{  		listener->confirmed(""); @@ -61,7 +61,7 @@ static bool onConfirmAlert(const LLSD& notification, const LLSD& response, LLCon  static bool onConfirmAlertPassword(const LLSD& notification, const LLSD& response, LLConfirmationManager::ListenerBase* listener)  {  	std::string text = response["message"].asString(); -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (option == 0)  	{ @@ -83,11 +83,11 @@ void LLConfirmationManager::confirm(Type type,  	switch (type)  	{  		case TYPE_CLICK: -			LLNotifications::instance().add("ConfirmPurchase", args, LLSD(), boost::bind(onConfirmAlert, _1, _2, listener)); +			LLNotificationsUtil::add("ConfirmPurchase", args, LLSD(), boost::bind(onConfirmAlert, _1, _2, listener));  		  break;  		case TYPE_PASSWORD: -			LLNotifications::instance().add("ConfirmPurchasePassword", args, LLSD(), boost::bind(onConfirmAlertPassword, _1, _2, listener)); +			LLNotificationsUtil::add("ConfirmPurchasePassword", args, LLSD(), boost::bind(onConfirmAlertPassword, _1, _2, listener));  		  break;  		case TYPE_NONE:  		default: diff --git a/indra/newview/lldelayedgestureerror.cpp b/indra/newview/lldelayedgestureerror.cpp index 1af94b3503..411cb331a8 100644 --- a/indra/newview/lldelayedgestureerror.cpp +++ b/indra/newview/lldelayedgestureerror.cpp @@ -33,7 +33,9 @@  #include "llviewerprecompiledheaders.h"  #include "lldelayedgestureerror.h" +  #include <list> +#include "llnotificationsutil.h"  #include "llnotify.h"  #include "llcallbacklist.h"  #include "llinventory.h" @@ -119,7 +121,7 @@ bool LLDelayedGestureError::doDialog(const LLErrorEntry &ent, bool uuid_ok)  	} -	LLNotifications::instance().add(ent.mNotifyName, args); +	LLNotificationsUtil::add(ent.mNotifyName, args);  	return true;  } diff --git a/indra/newview/lleventnotifier.cpp b/indra/newview/lleventnotifier.cpp index da20766e7e..9c8af16535 100644 --- a/indra/newview/lleventnotifier.cpp +++ b/indra/newview/lleventnotifier.cpp @@ -34,6 +34,7 @@  #include "lleventnotifier.h" +#include "llnotificationsutil.h"  #include "message.h"  #include "llnotify.h" @@ -81,7 +82,7 @@ void LLEventNotifier::update()  				LLSD args;  				args["NAME"] = np->getEventName();  				args["DATE"] = np->getEventDateStr(); -				LLNotifications::instance().add("EventNotification", args, LLSD(), +				LLNotificationsUtil::add("EventNotification", args, LLSD(),  					boost::bind(&LLEventNotification::handleResponse, np, _1, _2));  				mEventNotifications.erase(iter++);  			} @@ -185,7 +186,7 @@ LLEventNotification::~LLEventNotification()  bool LLEventNotification::handleResponse(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	switch (option)  	{  	case 0: diff --git a/indra/newview/llfirstuse.cpp b/indra/newview/llfirstuse.cpp index 893b12ec35..0bcdad5da1 100644 --- a/indra/newview/llfirstuse.cpp +++ b/indra/newview/llfirstuse.cpp @@ -36,6 +36,7 @@  // library includes  #include "indra_constants.h" +#include "llnotificationsutil.h"  // viewer includes  #include "llagent.h"	// for gAgent.inPrelude() @@ -86,7 +87,7 @@ void LLFirstUse::useBalanceIncrease(S32 delta)  		LLSD args;  		args["AMOUNT"] = llformat("%d",delta); -		LLNotifications::instance().add("FirstBalanceIncrease", args); +		LLNotificationsUtil::add("FirstBalanceIncrease", args);  	}  } @@ -100,7 +101,7 @@ void LLFirstUse::useBalanceDecrease(S32 delta)  		LLSD args;  		args["AMOUNT"] = llformat("%d",-delta); -		LLNotifications::instance().add("FirstBalanceDecrease", args); +		LLNotificationsUtil::add("FirstBalanceDecrease", args);  	}  } @@ -114,7 +115,7 @@ void LLFirstUse::useSit()  	//{  	//	gWarningSettings.setBOOL("FirstSit", FALSE);          // -	//	LLNotifications::instance().add("FirstSit"); +	//	LLNotificationsUtil::add("FirstSit");  	//}  } @@ -125,7 +126,7 @@ void LLFirstUse::useMap()  	{  		gWarningSettings.setBOOL("FirstMap", FALSE); -		LLNotifications::instance().add("FirstMap"); +		LLNotificationsUtil::add("FirstMap");  	}  } @@ -142,7 +143,7 @@ void LLFirstUse::useBuild()  	{  		gWarningSettings.setBOOL("FirstBuild", FALSE); -		LLNotifications::instance().add("FirstBuild"); +		LLNotificationsUtil::add("FirstBuild");  	}  }  /* @@ -153,7 +154,7 @@ void LLFirstUse::useLeftClickNoHit()  	{  		gWarningSettings.setBOOL("FirstLeftClickNoHit", FALSE); -		LLNotifications::instance().add("FirstLeftClickNoHit"); +		LLNotificationsUtil::add("FirstLeftClickNoHit");  	}  }  */ @@ -167,7 +168,7 @@ void LLFirstUse::useTeleport()  		{  			gWarningSettings.setBOOL("FirstTeleport", FALSE); -		        LLNotifications::instance().add("FirstTeleport"); +		        LLNotificationsUtil::add("FirstTeleport");  		}  	}  } @@ -183,7 +184,7 @@ void LLFirstUse::useOverrideKeys()  		{  			gWarningSettings.setBOOL("FirstOverrideKeys", FALSE); -			LLNotifications::instance().add("FirstOverrideKeys"); +			LLNotificationsUtil::add("FirstOverrideKeys");  		}  	}  } @@ -201,7 +202,7 @@ void LLFirstUse::useAppearance()  	{  		gWarningSettings.setBOOL("FirstAppearance", FALSE); -		LLNotifications::instance().add("FirstAppearance"); +		LLNotificationsUtil::add("FirstAppearance");  	}  } @@ -212,7 +213,7 @@ void LLFirstUse::useInventory()  	{  		gWarningSettings.setBOOL("FirstInventory", FALSE); -		LLNotifications::instance().add("FirstInventory"); +		LLNotificationsUtil::add("FirstInventory");  	}  } @@ -227,7 +228,7 @@ void LLFirstUse::useSandbox()  		LLSD args;  		args["HOURS"] = llformat("%d",SANDBOX_CLEAN_FREQ);  		args["TIME"] = llformat("%d",SANDBOX_FIRST_CLEAN_HOUR); -		LLNotifications::instance().add("FirstSandbox", args); +		LLNotificationsUtil::add("FirstSandbox", args);  	}  } @@ -238,7 +239,7 @@ void LLFirstUse::useFlexible()  	{  		gWarningSettings.setBOOL("FirstFlexible", FALSE); -		LLNotifications::instance().add("FirstFlexible"); +		LLNotificationsUtil::add("FirstFlexible");  	}  } @@ -249,7 +250,7 @@ void LLFirstUse::useDebugMenus()  	{  		gWarningSettings.setBOOL("FirstDebugMenus", FALSE); -		LLNotifications::instance().add("FirstDebugMenus"); +		LLNotificationsUtil::add("FirstDebugMenus");  	}  } @@ -260,7 +261,7 @@ void LLFirstUse::useSculptedPrim()  	{  		gWarningSettings.setBOOL("FirstSculptedPrim", FALSE); -		LLNotifications::instance().add("FirstSculptedPrim"); +		LLNotificationsUtil::add("FirstSculptedPrim");  	}  } @@ -274,6 +275,6 @@ void LLFirstUse::useMedia()  		// Popup removed as a short-term fix for EXT-1643.  		// Ultimately, the plan is to kill all First Use dialogs -		//LLNotifications::instance().add("FirstMedia"); +		//LLNotificationsUtil::add("FirstMedia");  	}  } diff --git a/indra/newview/llfloateranimpreview.cpp b/indra/newview/llfloateranimpreview.cpp index 095fe0a220..eae2747cc9 100644 --- a/indra/newview/llfloateranimpreview.cpp +++ b/indra/newview/llfloateranimpreview.cpp @@ -38,6 +38,7 @@  #include "lldatapacker.h"  #include "lldir.h"  #include "lleconomy.h" +#include "llnotificationsutil.h"  #include "llvfile.h"  #include "llapr.h"  #include "llstring.h" @@ -998,7 +999,7 @@ void LLFloaterAnimPreview::onBtnOK(void* userdata)  			else  			{  				llwarns << "Failure writing animation data." << llendl; -				LLNotifications::instance().add("WriteAnimationFail"); +				LLNotificationsUtil::add("WriteAnimationFail");  			}  		} diff --git a/indra/newview/llfloaterauction.cpp b/indra/newview/llfloaterauction.cpp index 9ba61ba92f..b63bcccf6b 100644 --- a/indra/newview/llfloaterauction.cpp +++ b/indra/newview/llfloaterauction.cpp @@ -46,6 +46,8 @@  #include "llagent.h"  #include "llcombobox.h" +#include "llnotifications.h" +#include "llnotificationsutil.h"  #include "llnotify.h"  #include "llsavedsettingsglue.h"  #include "llviewertexturelist.h" @@ -251,7 +253,7 @@ void LLFloaterAuction::onClickStartAuction(void* data)  								   FALSE);  		self->getWindow()->incBusyCount(); -		LLNotifications::instance().add("UploadingAuctionSnapshot"); +		LLNotificationsUtil::add("UploadingAuctionSnapshot");  	}  	LLMessageSystem* msg = gMessageSystem; @@ -478,7 +480,7 @@ void LLFloaterAuction::onClickSellToAnyone(void* data)  // Sell confirmation clicked  bool LLFloaterAuction::onSellToAnyoneConfirmed(const LLSD& notification, const LLSD& response)	  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (option == 0)  	{  		doSellToAnyone(); @@ -543,13 +545,13 @@ void auction_tga_upload_done(const LLUUID& asset_id, void* user_data, S32 status  	if (0 == status)  	{ -		LLNotifications::instance().add("UploadWebSnapshotDone"); +		LLNotificationsUtil::add("UploadWebSnapshotDone");  	}  	else  	{  		LLSD args;  		args["REASON"] = std::string(LLAssetStorage::getErrorString(status)); -		LLNotifications::instance().add("UploadAuctionSnapshotFail", args); +		LLNotificationsUtil::add("UploadAuctionSnapshotFail", args);  	}  } @@ -564,12 +566,12 @@ void auction_j2c_upload_done(const LLUUID& asset_id, void* user_data, S32 status  	if (0 == status)  	{ -		LLNotifications::instance().add("UploadSnapshotDone"); +		LLNotificationsUtil::add("UploadSnapshotDone");  	}  	else  	{  		LLSD args;  		args["REASON"] = std::string(LLAssetStorage::getErrorString(status)); -		LLNotifications::instance().add("UploadAuctionSnapshotFail", args); +		LLNotificationsUtil::add("UploadAuctionSnapshotFail", args);  	}  } diff --git a/indra/newview/llfloaterbuy.cpp b/indra/newview/llfloaterbuy.cpp index c8df6c6135..16a5bb63e7 100644 --- a/indra/newview/llfloaterbuy.cpp +++ b/indra/newview/llfloaterbuy.cpp @@ -46,6 +46,7 @@  #include "llfloaterreg.h"  #include "llfloaterinventory.h"	// for get_item_icon  #include "llinventoryfunctions.h" +#include "llnotificationsutil.h"  #include "llselectmgr.h"  #include "llscrolllistctrl.h"  #include "llviewerobject.h" @@ -99,7 +100,7 @@ void LLFloaterBuy::show(const LLSaleInfo& sale_info)  	if (selection->getRootObjectCount() != 1)  	{ -		LLNotifications::instance().add("BuyOneObjectOnly"); +		LLNotificationsUtil::add("BuyOneObjectOnly");  		return;  	} @@ -136,7 +137,7 @@ void LLFloaterBuy::show(const LLSaleInfo& sale_info)  	BOOL owners_identical = LLSelectMgr::getInstance()->selectGetOwner(owner_id, owner_name);  	if (!owners_identical)  	{ -		LLNotifications::instance().add("BuyObjectOneOwner"); +		LLNotificationsUtil::add("BuyObjectOneOwner");  		return;  	} diff --git a/indra/newview/llfloaterbuycontents.cpp b/indra/newview/llfloaterbuycontents.cpp index a99d0c918d..39c7bc02af 100644 --- a/indra/newview/llfloaterbuycontents.cpp +++ b/indra/newview/llfloaterbuycontents.cpp @@ -49,6 +49,7 @@  #include "llinventorymodel.h"	// for gInventory  #include "llfloaterreg.h"  #include "llfloaterinventory.h"	// for get_item_icon +#include "llnotificationsutil.h"  #include "llselectmgr.h"  #include "llscrolllistctrl.h"  #include "llviewerobject.h" @@ -95,7 +96,7 @@ void LLFloaterBuyContents::show(const LLSaleInfo& sale_info)  	if (selection->getRootObjectCount() != 1)  	{ -		LLNotifications::instance().add("BuyContentsOneOnly"); +		LLNotificationsUtil::add("BuyContentsOneOnly");  		return;  	} @@ -114,7 +115,7 @@ void LLFloaterBuyContents::show(const LLSaleInfo& sale_info)  	BOOL owners_identical = LLSelectMgr::getInstance()->selectGetOwner(owner_id, owner_name);  	if (!owners_identical)  	{ -		LLNotifications::instance().add("BuyContentsOneOwner"); +		LLNotificationsUtil::add("BuyContentsOneOwner");  		return;  	} diff --git a/indra/newview/llfloaterbuycurrency.cpp b/indra/newview/llfloaterbuycurrency.cpp index 651122f20a..1642e6725e 100644 --- a/indra/newview/llfloaterbuycurrency.cpp +++ b/indra/newview/llfloaterbuycurrency.cpp @@ -38,6 +38,7 @@  #include "llcurrencyuimanager.h"  #include "llfloater.h"  #include "llfloaterreg.h" +#include "llnotificationsutil.h"  #include "llstatusbar.h"  #include "lltextbox.h"  #include "llviewchildren.h" @@ -152,7 +153,7 @@ void LLFloaterBuyCurrencyUI::draw()  	{  		if (mManager.bought())  		{ -			LLNotifications::instance().add("BuyLindenDollarSuccess"); +			LLNotificationsUtil::add("BuyLindenDollarSuccess");  			closeFloater();  			return;  		} diff --git a/indra/newview/llfloaterbuyland.cpp b/indra/newview/llfloaterbuyland.cpp index 976aaf8044..59985a61ff 100644 --- a/indra/newview/llfloaterbuyland.cpp +++ b/indra/newview/llfloaterbuyland.cpp @@ -48,6 +48,7 @@  #include "llframetimer.h"  #include "lliconctrl.h"  #include "lllineeditor.h" +#include "llnotificationsutil.h"  #include "llnotify.h"  #include "llparcel.h"  #include "llslurl.h" @@ -215,7 +216,7 @@ void LLFloaterBuyLand::buyLand(  {  	if(is_for_group && !gAgent.hasPowerInActiveGroup(GP_LAND_DEED))  	{ -		LLNotifications::instance().add("OnlyOfficerCanBuyLand"); +		LLNotificationsUtil::add("OnlyOfficerCanBuyLand");  		return;  	} @@ -972,7 +973,7 @@ BOOL LLFloaterBuyLandUI::canClose()  	if (!can_close)  	{  		// explain to user why they can't do this, see DEV-9605 -		LLNotifications::instance().add("CannotCloseFloaterBuyLand"); +		LLNotificationsUtil::add("CannotCloseFloaterBuyLand");  	}  	return can_close;  } diff --git a/indra/newview/llfloaterfriends.cpp b/indra/newview/llfloaterfriends.cpp index 2c66ab502d..1482d3fe21 100644 --- a/indra/newview/llfloaterfriends.cpp +++ b/indra/newview/llfloaterfriends.cpp @@ -49,6 +49,7 @@  #include "llavataractions.h"  #include "llinventorymodel.h"  #include "llnamelistctrl.h" +#include "llnotificationsutil.h"  #include "llnotify.h"  #include "llresmgr.h"  #include "llscrolllistctrl.h" @@ -535,7 +536,7 @@ void LLPanelFriends::onMaximumSelect()  {  	LLSD args;  	args["MAX_SELECT"] = llformat("%d", MAX_FRIEND_SELECT); -	LLNotifications::instance().add("MaxListSelectMessage", args); +	LLNotificationsUtil::add("MaxListSelectMessage", args);  };  // static @@ -639,14 +640,14 @@ void LLPanelFriends::confirmModifyRights(rights_map_t& ids, EGrantRevoke command  			}  			if (command == GRANT)  			{ -				LLNotifications::instance().add("GrantModifyRights",  +				LLNotificationsUtil::add("GrantModifyRights",   					args,   					LLSD(),   					boost::bind(&LLPanelFriends::modifyRightsConfirmation, this, _1, _2, rights));  			}  			else  			{ -				LLNotifications::instance().add("RevokeModifyRights",  +				LLNotificationsUtil::add("RevokeModifyRights",   					args,   					LLSD(),   					boost::bind(&LLPanelFriends::modifyRightsConfirmation, this, _1, _2, rights)); @@ -656,14 +657,14 @@ void LLPanelFriends::confirmModifyRights(rights_map_t& ids, EGrantRevoke command  		{  			if (command == GRANT)  			{ -				LLNotifications::instance().add("GrantModifyRightsMultiple",  +				LLNotificationsUtil::add("GrantModifyRightsMultiple",   					args,   					LLSD(),   					boost::bind(&LLPanelFriends::modifyRightsConfirmation, this, _1, _2, rights));  			}  			else  			{ -				LLNotifications::instance().add("RevokeModifyRightsMultiple",  +				LLNotificationsUtil::add("RevokeModifyRightsMultiple",   					args,   					LLSD(),   					boost::bind(&LLPanelFriends::modifyRightsConfirmation, this, _1, _2, rights)); @@ -674,7 +675,7 @@ void LLPanelFriends::confirmModifyRights(rights_map_t& ids, EGrantRevoke command  bool LLPanelFriends::modifyRightsConfirmation(const LLSD& notification, const LLSD& response, rights_map_t* rights)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if(0 == option)  	{  		sendRightsGrant(*rights); diff --git a/indra/newview/llfloatergodtools.cpp b/indra/newview/llfloatergodtools.cpp index cd3432190b..04ba11530a 100644 --- a/indra/newview/llfloatergodtools.cpp +++ b/indra/newview/llfloatergodtools.cpp @@ -39,6 +39,7 @@  #include "llframetimer.h"  #include "llgl.h"  #include "llhost.h" +#include "llnotificationsutil.h"  #include "llregionflags.h"  #include "llstring.h"  #include "message.h" @@ -847,17 +848,17 @@ void LLPanelGridTools::refresh()  void LLPanelGridTools::onClickKickAll()  { -	LLNotifications::instance().add("KickAllUsers", LLSD(), LLSD(), LLPanelGridTools::confirmKick); +	LLNotificationsUtil::add("KickAllUsers", LLSD(), LLSD(), LLPanelGridTools::confirmKick);  }  bool LLPanelGridTools::confirmKick(const LLSD& notification, const LLSD& response)  { -	if (LLNotification::getSelectedOption(notification, response) == 0) +	if (LLNotificationsUtil::getSelectedOption(notification, response) == 0)  	{  		LLSD payload;  		payload["kick_message"] = response["message"].asString(); -		LLNotifications::instance().add("ConfirmKick", LLSD(), payload, LLPanelGridTools::finishKick); +		LLNotificationsUtil::add("ConfirmKick", LLSD(), payload, LLPanelGridTools::finishKick);  	}  	return false;  } @@ -866,7 +867,7 @@ bool LLPanelGridTools::confirmKick(const LLSD& notification, const LLSD& respons  // static  bool LLPanelGridTools::finishKick(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (option == 0) @@ -887,13 +888,13 @@ bool LLPanelGridTools::finishKick(const LLSD& notification, const LLSD& response  void LLPanelGridTools::onClickFlushMapVisibilityCaches()  { -	LLNotifications::instance().add("FlushMapVisibilityCaches", LLSD(), LLSD(), flushMapVisibilityCachesConfirm); +	LLNotificationsUtil::add("FlushMapVisibilityCaches", LLSD(), LLSD(), flushMapVisibilityCachesConfirm);  }  // static  bool LLPanelGridTools::flushMapVisibilityCachesConfirm(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (option != 0) return false;  	// HACK: Send this as an EstateOwnerRequest so it gets routed @@ -1101,7 +1102,7 @@ void LLPanelObjectTools::onClickDeletePublicOwnedBy()  		payload["avatar_id"] = mTargetAvatar;  		payload["flags"] = (S32)mSimWideDeletesFlags; -		LLNotifications::instance().add( "GodDeleteAllScriptedPublicObjectsByUser", +		LLNotificationsUtil::add( "GodDeleteAllScriptedPublicObjectsByUser",  								args,  								payload,  								callbackSimWideDeletes); @@ -1121,7 +1122,7 @@ void LLPanelObjectTools::onClickDeleteAllScriptedOwnedBy()  		payload["avatar_id"] = mTargetAvatar;  		payload["flags"] = (S32)mSimWideDeletesFlags; -		LLNotifications::instance().add( "GodDeleteAllScriptedObjectsByUser", +		LLNotificationsUtil::add( "GodDeleteAllScriptedObjectsByUser",  								args,  								payload,  								callbackSimWideDeletes); @@ -1141,7 +1142,7 @@ void LLPanelObjectTools::onClickDeleteAllOwnedBy()  		payload["avatar_id"] = mTargetAvatar;  		payload["flags"] = (S32)mSimWideDeletesFlags; -		LLNotifications::instance().add( "GodDeleteAllObjectsByUser", +		LLNotificationsUtil::add( "GodDeleteAllObjectsByUser",  								args,  								payload,  								callbackSimWideDeletes); @@ -1151,7 +1152,7 @@ void LLPanelObjectTools::onClickDeleteAllOwnedBy()  // static  bool LLPanelObjectTools::callbackSimWideDeletes( const LLSD& notification, const LLSD& response )  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (option == 0)  	{  		if (!notification["payload"]["avatar_id"].asUUID().isNull()) @@ -1334,7 +1335,7 @@ void LLPanelRequestTools::onClickRequest()  void terrain_download_done(void** data, S32 status, LLExtStat ext_status)  { -	LLNotifications::instance().add("TerrainDownloaded"); +	LLNotificationsUtil::add("TerrainDownloaded");  } diff --git a/indra/newview/llfloaterhud.cpp b/indra/newview/llfloaterhud.cpp index 047dc2fa92..14cff3bcc3 100644 --- a/indra/newview/llfloaterhud.cpp +++ b/indra/newview/llfloaterhud.cpp @@ -40,6 +40,7 @@  #include "llalertdialog.h"  // Linden libs +#include "llnotificationsutil.h"  #include "lluictrlfactory.h" @@ -56,7 +57,7 @@ LLFloaterHUD::LLFloaterHUD(const LLSD& key)  	// do not build the floater if there the url is empty  	if (gSavedSettings.getString("TutorialURL") == "")  	{ -		LLNotifications::instance().add("TutorialNotFound"); +		LLNotificationsUtil::add("TutorialNotFound");  		return;  	} diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index d855ab1dfa..ed0f24d160 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -39,6 +39,7 @@  #include "llcachename.h"  #include "llfocusmgr.h" +#include "llnotificationsutil.h"  #include "llparcel.h"  #include "message.h"  #include "lluserauth.h" @@ -914,7 +915,7 @@ void LLPanelLandGeneral::onClickBuyPass(void* data)  	args["PARCEL_NAME"] = parcel_name;  	args["TIME"] = time; -	LLNotifications::instance().add("LandBuyPass", args, LLSD(), cbBuyPass); +	LLNotificationsUtil::add("LandBuyPass", args, LLSD(), cbBuyPass);  }  // static @@ -926,7 +927,7 @@ void LLPanelLandGeneral::onClickStartAuction(void* data)  	{  		if(parcelp->getForSale())  		{ -			LLNotifications::instance().add("CannotStartAuctionAlreadyForSale"); +			LLNotificationsUtil::add("CannotStartAuctionAlreadyForSale");  		}  		else  		{ @@ -939,7 +940,7 @@ void LLPanelLandGeneral::onClickStartAuction(void* data)  // static  bool LLPanelLandGeneral::cbBuyPass(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (0 == option)  	{  		// User clicked OK @@ -1285,7 +1286,7 @@ void send_return_objects_message(S32 parcel_local_id, S32 return_type,  bool LLPanelLandObjects::callbackReturnOwnerObjects(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	LLParcel *parcel = mParcel->getParcel();  	if (0 == option)  	{ @@ -1295,7 +1296,7 @@ bool LLPanelLandObjects::callbackReturnOwnerObjects(const LLSD& notification, co  			LLSD args;  			if (owner_id == gAgentID)  			{ -				LLNotifications::instance().add("OwnedObjectsReturned"); +				LLNotificationsUtil::add("OwnedObjectsReturned");  			}  			else  			{ @@ -1303,7 +1304,7 @@ bool LLPanelLandObjects::callbackReturnOwnerObjects(const LLSD& notification, co  				gCacheName->getName(owner_id, first, last);  				args["FIRST"] = first;  				args["LAST"] = last; -				LLNotifications::instance().add("OtherObjectsReturned", args); +				LLNotificationsUtil::add("OtherObjectsReturned", args);  			}  			send_return_objects_message(parcel->getLocalID(), RT_OWNER);  		} @@ -1317,7 +1318,7 @@ bool LLPanelLandObjects::callbackReturnOwnerObjects(const LLSD& notification, co  bool LLPanelLandObjects::callbackReturnGroupObjects(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	LLParcel *parcel = mParcel->getParcel();  	if (0 == option)  	{ @@ -1327,7 +1328,7 @@ bool LLPanelLandObjects::callbackReturnGroupObjects(const LLSD& notification, co  			gCacheName->getGroupName(parcel->getGroupID(), group_name);  			LLSD args;  			args["GROUPNAME"] = group_name; -			LLNotifications::instance().add("GroupObjectsReturned", args); +			LLNotificationsUtil::add("GroupObjectsReturned", args);  			send_return_objects_message(parcel->getLocalID(), RT_GROUP);  		}  	} @@ -1339,13 +1340,13 @@ bool LLPanelLandObjects::callbackReturnGroupObjects(const LLSD& notification, co  bool LLPanelLandObjects::callbackReturnOtherObjects(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	LLParcel *parcel = mParcel->getParcel();  	if (0 == option)  	{  		if (parcel)  		{ -			LLNotifications::instance().add("UnOwnedObjectsReturned"); +			LLNotificationsUtil::add("UnOwnedObjectsReturned");  			send_return_objects_message(parcel->getLocalID(), RT_OTHER);  		}  	} @@ -1357,7 +1358,7 @@ bool LLPanelLandObjects::callbackReturnOtherObjects(const LLSD& notification, co  bool LLPanelLandObjects::callbackReturnOwnerList(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	LLParcel *parcel = mParcel->getParcel();  	if (0 == option)  	{ @@ -1371,12 +1372,12 @@ bool LLPanelLandObjects::callbackReturnOwnerList(const LLSD& notification, const  				if (mSelectedIsGroup)  				{  					args["GROUPNAME"] = mSelectedName; -					LLNotifications::instance().add("GroupObjectsReturned", args); +					LLNotificationsUtil::add("GroupObjectsReturned", args);  				}  				else  				{  					args["NAME"] = mSelectedName; -					LLNotifications::instance().add("OtherObjectsReturned2", args); +					LLNotificationsUtil::add("OtherObjectsReturned2", args);  				}  				send_return_objects_message(parcel->getLocalID(), RT_LIST, &(mSelectedOwners)); @@ -1413,11 +1414,11 @@ void LLPanelLandObjects::onClickReturnOwnerList(void* userdata)  	args["N"] = llformat("%d",self->mSelectedCount);  	if (self->mSelectedIsGroup)  	{ -		LLNotifications::instance().add("ReturnObjectsDeededToGroup", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOwnerList, self, _1, _2));	 +		LLNotificationsUtil::add("ReturnObjectsDeededToGroup", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOwnerList, self, _1, _2));	  	}  	else   	{ -		LLNotifications::instance().add("ReturnObjectsOwnedByUser", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOwnerList, self, _1, _2));	 +		LLNotificationsUtil::add("ReturnObjectsOwnedByUser", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOwnerList, self, _1, _2));	  	}  } @@ -1627,14 +1628,14 @@ void LLPanelLandObjects::onClickReturnOwnerObjects(void* userdata)  	if (owner_id == gAgent.getID())  	{ -		LLNotifications::instance().add("ReturnObjectsOwnedBySelf", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOwnerObjects, panelp, _1, _2)); +		LLNotificationsUtil::add("ReturnObjectsOwnedBySelf", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOwnerObjects, panelp, _1, _2));  	}  	else  	{  		std::string name;  		gCacheName->getFullName(owner_id, name);  		args["NAME"] = name; -		LLNotifications::instance().add("ReturnObjectsOwnedByUser", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOwnerObjects, panelp, _1, _2)); +		LLNotificationsUtil::add("ReturnObjectsOwnedByUser", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOwnerObjects, panelp, _1, _2));  	}  } @@ -1655,7 +1656,7 @@ void LLPanelLandObjects::onClickReturnGroupObjects(void* userdata)  	args["N"] = llformat("%d", parcel->getGroupPrimCount());  	// create and show confirmation textbox -	LLNotifications::instance().add("ReturnObjectsDeededToGroup", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnGroupObjects, panelp, _1, _2)); +	LLNotificationsUtil::add("ReturnObjectsDeededToGroup", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnGroupObjects, panelp, _1, _2));  }  // static @@ -1680,7 +1681,7 @@ void LLPanelLandObjects::onClickReturnOtherObjects(void* userdata)  		gCacheName->getGroupName(parcel->getGroupID(), group_name);  		args["NAME"] = group_name; -		LLNotifications::instance().add("ReturnObjectsNotOwnedByGroup", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOtherObjects, panelp, _1, _2)); +		LLNotificationsUtil::add("ReturnObjectsNotOwnedByGroup", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOtherObjects, panelp, _1, _2));  	}  	else  	{ @@ -1688,7 +1689,7 @@ void LLPanelLandObjects::onClickReturnOtherObjects(void* userdata)  		if (owner_id == gAgent.getID())  		{ -			LLNotifications::instance().add("ReturnObjectsNotOwnedBySelf", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOtherObjects, panelp, _1, _2)); +			LLNotificationsUtil::add("ReturnObjectsNotOwnedBySelf", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOtherObjects, panelp, _1, _2));  		}  		else  		{ @@ -1696,7 +1697,7 @@ void LLPanelLandObjects::onClickReturnOtherObjects(void* userdata)  			gCacheName->getFullName(owner_id, name);  			args["NAME"] = name; -			LLNotifications::instance().add("ReturnObjectsNotOwnedByUser", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOtherObjects, panelp, _1, _2)); +			LLNotificationsUtil::add("ReturnObjectsNotOwnedByUser", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOtherObjects, panelp, _1, _2));  		}  	}  } @@ -2165,7 +2166,7 @@ void LLPanelLandOptions::onCommitAny(LLUICtrl *ctrl, void *userdata)  	if (!allow_other_scripts && region && region->getAllowDamage())  	{ -		LLNotifications::instance().add("UnableToDisableOutsideScripts"); +		LLNotificationsUtil::add("UnableToDisableOutsideScripts");  		return;  	} @@ -2209,7 +2210,7 @@ void LLPanelLandOptions::onClickSet(void* userdata)  	if (agent_parcel->getLocalID() != selected_parcel->getLocalID())  	{ -		LLNotifications::instance().add("MustBeInParcel"); +		LLNotificationsUtil::add("MustBeInParcel");  		return;  	} diff --git a/indra/newview/llfloaternotificationsconsole.cpp b/indra/newview/llfloaternotificationsconsole.cpp index f20fca1258..90db8988b2 100644 --- a/indra/newview/llfloaternotificationsconsole.cpp +++ b/indra/newview/llfloaternotificationsconsole.cpp @@ -233,7 +233,7 @@ void LLFloaterNotificationConsole::onClickAdd()  	std::string message_name = getChild<LLComboBox>("notification_types")->getValue().asString();  	if (!message_name.empty())  	{ -		LLNotifications::instance().add(message_name, LLSD()); +		LLNotifications::instance().add(message_name, LLSD(), LLSD());  	}  } diff --git a/indra/newview/llfloaternotificationsconsole.h b/indra/newview/llfloaternotificationsconsole.h index 7349ff1d8f..a05d559eb4 100644 --- a/indra/newview/llfloaternotificationsconsole.h +++ b/indra/newview/llfloaternotificationsconsole.h @@ -35,7 +35,9 @@  #include "llfloater.h"  #include "lllayoutstack.h" -#include "llnotifications.h" +//#include "llnotificationsutil.h" + +class LLNotification;  class LLFloaterNotificationConsole :   	public LLFloater diff --git a/indra/newview/llfloateropenobject.cpp b/indra/newview/llfloateropenobject.cpp index e277aba493..6caa0d60f9 100644 --- a/indra/newview/llfloateropenobject.cpp +++ b/indra/newview/llfloateropenobject.cpp @@ -41,6 +41,7 @@  #include "llcachename.h"  #include "llbutton.h" +#include "llnotificationsutil.h"  #include "lltextbox.h"  #include "llalertdialog.h" @@ -84,7 +85,7 @@ void LLFloaterOpenObject::onOpen(const LLSD& key)  	LLObjectSelectionHandle object_selection = LLSelectMgr::getInstance()->getSelection();  	if (object_selection->getRootObjectCount() != 1)  	{ -		LLNotifications::instance().add("UnableToViewContentsMoreThanOne"); +		LLNotificationsUtil::add("UnableToViewContentsMoreThanOne");  		closeFloater();  		return;  	} @@ -141,7 +142,7 @@ void LLFloaterOpenObject::moveToInventory(bool wear)  {  	if (mObjectSelection->getRootObjectCount() != 1)  	{ -		LLNotifications::instance().add("OnlyCopyContentsOfSingleItem"); +		LLNotificationsUtil::add("OnlyCopyContentsOfSingleItem");  		return;  	} @@ -182,7 +183,7 @@ void LLFloaterOpenObject::moveToInventory(bool wear)  		delete data;  		data = NULL; -		LLNotifications::instance().add("OpenObjectCannotCopy"); +		LLNotificationsUtil::add("OpenObjectCannotCopy");  	}  } diff --git a/indra/newview/llfloaterpostcard.cpp b/indra/newview/llfloaterpostcard.cpp index ae1a99e5fc..572eeb57fe 100644 --- a/indra/newview/llfloaterpostcard.cpp +++ b/indra/newview/llfloaterpostcard.cpp @@ -46,6 +46,7 @@  #include "llbutton.h"  #include "lltexteditor.h"  #include "llfloaterreg.h" +#include "llnotificationsutil.h"  #include "llviewercontrol.h"  #include "llviewernetwork.h"  #include "lluictrlfactory.h" @@ -222,20 +223,20 @@ void LLFloaterPostcard::onClickSend(void* data)  		if (to.empty() || !boost::regex_match(to, emailFormat))  		{ -			LLNotifications::instance().add("PromptRecipientEmail"); +			LLNotificationsUtil::add("PromptRecipientEmail");  			return;  		}  		if (from.empty() || !boost::regex_match(from, emailFormat))  		{ -			LLNotifications::instance().add("PromptSelfEmail"); +			LLNotificationsUtil::add("PromptSelfEmail");  			return;  		}  		std::string subject(self->childGetValue("subject_form").asString());  		if(subject.empty() || !self->mHasFirstMsgFocus)  		{ -			LLNotifications::instance().add("PromptMissingSubjMsg", LLSD(), LLSD(), boost::bind(&LLFloaterPostcard::missingSubjMsgAlertCallback, self, _1, _2)); +			LLNotificationsUtil::add("PromptMissingSubjMsg", LLSD(), LLSD(), boost::bind(&LLFloaterPostcard::missingSubjMsgAlertCallback, self, _1, _2));  			return;  		} @@ -245,7 +246,7 @@ void LLFloaterPostcard::onClickSend(void* data)  		}  		else  		{ -			LLNotifications::instance().add("ErrorProcessingSnapshot"); +			LLNotificationsUtil::add("ErrorProcessingSnapshot");  		}  	}  } @@ -261,7 +262,7 @@ void LLFloaterPostcard::uploadCallback(const LLUUID& asset_id, void *user_data,  	{  		LLSD args;  		args["REASON"] = std::string(LLAssetStorage::getErrorString(result)); -		LLNotifications::instance().add("ErrorUploadingPostcard", args); +		LLNotificationsUtil::add("ErrorUploadingPostcard", args);  	}  	else  	{ @@ -321,7 +322,7 @@ void LLFloaterPostcard::onMsgFormFocusRecieved(LLFocusableElement* receiver, voi  bool LLFloaterPostcard::missingSubjMsgAlertCallback(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if(0 == option)  	{  		// User clicked OK diff --git a/indra/newview/llfloaterpostprocess.cpp b/indra/newview/llfloaterpostprocess.cpp index 2ab54d6e46..87a12d3d66 100644 --- a/indra/newview/llfloaterpostprocess.cpp +++ b/indra/newview/llfloaterpostprocess.cpp @@ -36,7 +36,7 @@  #include "llsliderctrl.h"  #include "llcheckboxctrl.h" -#include "llcombobox.h" +#include "llnotificationsutil.h"  #include "lluictrlfactory.h"  #include "llviewerdisplay.h"  #include "llpostprocess.h" @@ -161,7 +161,7 @@ void LLFloaterPostProcess::onSaveEffect(LLLineEditor* editBox)  	{  		LLSD payload;  		payload["effect_name"] = effectName; -		LLNotifications::instance().add("PPSaveEffectAlert", LLSD(), payload, boost::bind(&LLFloaterPostProcess::saveAlertCallback, this, _1, _2)); +		LLNotificationsUtil::add("PPSaveEffectAlert", LLSD(), payload, boost::bind(&LLFloaterPostProcess::saveAlertCallback, this, _1, _2));  	}  	else  	{ @@ -181,7 +181,7 @@ void LLFloaterPostProcess::onChangeEffectName(LLUICtrl* ctrl)  bool LLFloaterPostProcess::saveAlertCallback(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	// if they choose save, do it.  Otherwise, don't do anything  	if (option == 0) diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index e20249a737..83c784c1f7 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -60,6 +60,8 @@  #include "llkeyboard.h"  #include "llmodaldialog.h"  #include "llnavigationbar.h" +#include "llnotifications.h" +#include "llnotificationsutil.h"  #include "llpanellogin.h"  #include "llradiogroup.h"  #include "llsearchcombobox.h" @@ -203,7 +205,7 @@ viewer_media_t get_web_media()  bool callback_clear_browser_cache(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if ( option == 0 ) // YES  	{  		// clean web @@ -216,7 +218,7 @@ bool callback_clear_browser_cache(const LLSD& notification, const LLSD& response  		// flag client texture cache for clearing next time the client runs  		gSavedSettings.setBOOL("PurgeCacheOnNextStartup", TRUE); -		LLNotifications::instance().add("CacheWillClear"); +		LLNotificationsUtil::add("CacheWillClear");  		LLSearchHistory::getInstance()->clearHistory();  		LLSearchHistory::getInstance()->save(); @@ -241,7 +243,7 @@ void handleNameTagOptionChanged(const LLSD& newvalue)  bool callback_skip_dialogs(const LLSD& notification, const LLSD& response, LLFloaterPreference* floater)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (0 == option && floater )  	{  		if ( floater ) @@ -256,7 +258,7 @@ bool callback_skip_dialogs(const LLSD& notification, const LLSD& response, LLFlo  bool callback_reset_dialogs(const LLSD& notification, const LLSD& response, LLFloaterPreference* floater)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if ( 0 == option && floater )  	{  		if ( floater ) @@ -412,7 +414,7 @@ void LLFloaterPreference::apply()  	LLTabContainer* tabcontainer = getChild<LLTabContainer>("pref core");  	if (sSkin != gSavedSettings.getString("SkinCurrent"))  	{ -		LLNotifications::instance().add("ChangeSkin"); +		LLNotificationsUtil::add("ChangeSkin");  		refreshSkin(this);  	}  	// Call apply() on all panels that derive from LLPanelPreference @@ -713,13 +715,13 @@ void LLFloaterPreference::onClickClearCache()  {  	// flag client cache for clearing next time the client runs  	gSavedSettings.setBOOL("PurgeCacheOnNextStartup", TRUE); -	LLNotifications::instance().add("CacheWillClear"); +	LLNotificationsUtil::add("CacheWillClear");  }  */  void LLFloaterPreference::onClickBrowserClearCache()  { -	LLNotifications::instance().add("ConfirmClearBrowserCache", LLSD(), LLSD(), callback_clear_browser_cache); +	LLNotificationsUtil::add("ConfirmClearBrowserCache", LLSD(), LLSD(), callback_clear_browser_cache);  }  void LLFloaterPreference::onClickSetCache() @@ -739,7 +741,7 @@ void LLFloaterPreference::onClickSetCache()  	if (!dir_name.empty() && dir_name != cur_name)  	{  		std::string new_top_folder(gDirUtilp->getBaseFileName(dir_name));	 -		LLNotifications::instance().add("CacheWillBeMoved"); +		LLNotificationsUtil::add("CacheWillBeMoved");  		gSavedSettings.setString("NewCacheLocation", dir_name);  		gSavedSettings.setString("NewCacheLocationTopFolder", new_top_folder);  	} @@ -758,7 +760,7 @@ void LLFloaterPreference::onClickResetCache()  	{  		gSavedSettings.setString("NewCacheLocation", "");  		gSavedSettings.setString("NewCacheLocationTopFolder", ""); -		LLNotifications::instance().add("CacheWillBeMoved"); +		LLNotificationsUtil::add("CacheWillBeMoved");  	}  	std::string cache_location = gDirUtilp->getCacheDir(true);  	gSavedSettings.setString("CacheLocation", cache_location); @@ -1080,12 +1082,12 @@ void LLFloaterPreference::onClickSetMiddleMouse()  void LLFloaterPreference::onClickSkipDialogs()  { -	LLNotifications::instance().add("SkipShowNextTimeDialogs", LLSD(), LLSD(), boost::bind(&callback_skip_dialogs, _1, _2, this)); +	LLNotificationsUtil::add("SkipShowNextTimeDialogs", LLSD(), LLSD(), boost::bind(&callback_skip_dialogs, _1, _2, this));  }  void LLFloaterPreference::onClickResetDialogs()  { -	LLNotifications::instance().add("ResetShowNextTimeDialogs", LLSD(), LLSD(), boost::bind(&callback_reset_dialogs, _1, _2, this)); +	LLNotificationsUtil::add("ResetShowNextTimeDialogs", LLSD(), LLSD(), boost::bind(&callback_reset_dialogs, _1, _2, this));  }  void LLFloaterPreference::onClickEnablePopup() diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp index 32229bd850..05a46ad894 100644 --- a/indra/newview/llfloaterregioninfo.cpp +++ b/indra/newview/llfloaterregioninfo.cpp @@ -64,6 +64,8 @@  #include "lllineeditor.h"  #include "llalertdialog.h"  #include "llnamelistctrl.h" +#include "llnotifications.h" +#include "llnotificationsutil.h"  #include "llscrolllistitem.h"  #include "llsliderctrl.h"  #include "llslurl.h" @@ -635,7 +637,7 @@ void LLPanelRegionGeneralInfo::onKickCommit(const std::vector<std::string>& name  void LLPanelRegionGeneralInfo::onClickKickAll(void* userdata)  {  	llinfos << "LLPanelRegionGeneralInfo::onClickKickAll" << llendl; -	LLNotifications::instance().add("KickUsersFromRegion",  +	LLNotificationsUtil::add("KickUsersFromRegion",   									LLSD(),   									LLSD(),   									boost::bind(&LLPanelRegionGeneralInfo::onKickAllCommit, (LLPanelRegionGeneralInfo*)userdata, _1, _2)); @@ -643,7 +645,7 @@ void LLPanelRegionGeneralInfo::onClickKickAll(void* userdata)  bool LLPanelRegionGeneralInfo::onKickAllCommit(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (option == 0)  	{  		strings_t strings; @@ -663,7 +665,7 @@ bool LLPanelRegionGeneralInfo::onKickAllCommit(const LLSD& notification, const L  void LLPanelRegionGeneralInfo::onClickMessage(void* userdata)  {  	llinfos << "LLPanelRegionGeneralInfo::onClickMessage" << llendl; -	LLNotifications::instance().add("MessageRegion",  +	LLNotificationsUtil::add("MessageRegion",   		LLSD(),   		LLSD(),   		boost::bind(&LLPanelRegionGeneralInfo::onMessageCommit, (LLPanelRegionGeneralInfo*)userdata, _1, _2)); @@ -672,7 +674,7 @@ void LLPanelRegionGeneralInfo::onClickMessage(void* userdata)  // static  bool LLPanelRegionGeneralInfo::onMessageCommit(const LLSD& notification, const LLSD& response)  { -	if(LLNotification::getSelectedOption(notification, response) != 0) return false; +	if(LLNotificationsUtil::getSelectedOption(notification, response) != 0) return false;  	std::string text = response["message"].asString();  	if (text.empty()) return false; @@ -775,7 +777,7 @@ BOOL LLPanelRegionGeneralInfo::sendUpdate()  	LLViewerRegion* region = gAgent.getRegion();  	if (region && (childGetValue("access_combo").asInteger() != region->getSimAccess()) )  	{ -		LLNotifications::instance().add("RegionMaturityChange"); +		LLNotificationsUtil::add("RegionMaturityChange");  	}	  	return TRUE; @@ -882,13 +884,13 @@ void LLPanelRegionDebugInfo::onClickReturn(void* data)  	}  	payload["flags"] = int(flags);  	payload["return_estate_wide"] = panelp->childGetValue("return_estate_wide").asBoolean(); -	LLNotifications::instance().add("EstateObjectReturn", args, payload,  +	LLNotificationsUtil::add("EstateObjectReturn", args, payload,   									boost::bind(&LLPanelRegionDebugInfo::callbackReturn, panelp, _1, _2));  }  bool LLPanelRegionDebugInfo::callbackReturn(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (option != 0) return false;  	LLUUID target_avatar = notification["payload"]["avatar_id"].asUUID(); @@ -948,13 +950,13 @@ void LLPanelRegionDebugInfo::onClickTopScripts(void* data)  // static  void LLPanelRegionDebugInfo::onClickRestart(void* data)  { -	LLNotifications::instance().add("ConfirmRestart", LLSD(), LLSD(),  +	LLNotificationsUtil::add("ConfirmRestart", LLSD(), LLSD(),   		boost::bind(&LLPanelRegionDebugInfo::callbackRestart, (LLPanelRegionDebugInfo*)data, _1, _2));  }  bool LLPanelRegionDebugInfo::callbackRestart(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (option != 0) return false;  	strings_t strings; @@ -1122,7 +1124,7 @@ BOOL LLPanelRegionTextureInfo::validateTextureSizes()  			LLSD args;  			args["TEXTURE_NUM"] = i+1;  			args["TEXTURE_BIT_DEPTH"] = llformat("%d",components * 8); -			LLNotifications::instance().add("InvalidTerrainBitDepth", args); +			LLNotificationsUtil::add("InvalidTerrainBitDepth", args);  			return FALSE;  		} @@ -1133,7 +1135,7 @@ BOOL LLPanelRegionTextureInfo::validateTextureSizes()  			args["TEXTURE_NUM"] = i+1;  			args["TEXTURE_SIZE_X"] = width;  			args["TEXTURE_SIZE_Y"] = height; -			LLNotifications::instance().add("InvalidTerrainSize", args); +			LLNotificationsUtil::add("InvalidTerrainSize", args);  			return FALSE;  		} @@ -1311,21 +1313,18 @@ void LLPanelRegionTerrainInfo::onClickUploadRaw(void* data)  	LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());  	self->sendEstateOwnerMessage(gMessageSystem, "terrain", invoice, strings); -	LLNotifications::instance().add("RawUploadStarted"); +	LLNotificationsUtil::add("RawUploadStarted");  }  // static  void LLPanelRegionTerrainInfo::onClickBakeTerrain(void* data)  { -	LLNotification::Params::Functor functor_params; -	functor_params.function(boost::bind(&LLPanelRegionTerrainInfo::callbackBakeTerrain, (LLPanelRegionTerrainInfo*)data, _1, _2)); - -	LLNotifications::instance().add(LLNotification::Params("ConfirmBakeTerrain").functor(functor_params)); +	LLNotificationsUtil::add("ConfirmBakeTerrain", LLSD(), LLSD(), boost::bind(&LLPanelRegionTerrainInfo::callbackBakeTerrain, (LLPanelRegionTerrainInfo*)data, _1, _2));  }  bool LLPanelRegionTerrainInfo::callbackBakeTerrain(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (option != 0) return false;  	strings_t strings; @@ -1412,7 +1411,7 @@ void LLPanelEstateInfo::onClickAddAllowedAgent(void* user_data)  		LLSD args;  		args["MAX_AGENTS"] = llformat("%d",ESTATE_MAX_ACCESS_IDS); -		LLNotifications::instance().add("MaxAllowedAgentOnRegion", args); +		LLNotificationsUtil::add("MaxAllowedAgentOnRegion", args);  		return;  	}  	accessAddCore(ESTATE_ACCESS_ALLOWED_AGENT_ADD, "EstateAllowedAgentAdd"); @@ -1432,7 +1431,7 @@ void LLPanelEstateInfo::onClickAddAllowedGroup()  	{  		LLSD args;  		args["MAX_GROUPS"] = llformat("%d",ESTATE_MAX_ACCESS_IDS); -		LLNotifications::instance().add("MaxAllowedGroupsOnRegion", args); +		LLNotificationsUtil::add("MaxAllowedGroupsOnRegion", args);  		return;  	} @@ -1450,7 +1449,7 @@ void LLPanelEstateInfo::onClickAddAllowedGroup()  bool LLPanelEstateInfo::addAllowedGroup(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (option != 0) return false;  	LLFloater* parent_floater = gFloaterView->getParentFloater(this); @@ -1487,7 +1486,7 @@ void LLPanelEstateInfo::onClickAddBannedAgent(void* user_data)  	{  		LLSD args;  		args["MAX_BANNED"] = llformat("%d",ESTATE_MAX_ACCESS_IDS); -		LLNotifications::instance().add("MaxBannedAgentsOnRegion", args); +		LLNotificationsUtil::add("MaxBannedAgentsOnRegion", args);  		return;  	}  	accessAddCore(ESTATE_ACCESS_BANNED_AGENT_ADD, "EstateBannedAgentAdd"); @@ -1509,7 +1508,7 @@ void LLPanelEstateInfo::onClickAddEstateManager(void* user_data)  	{	// Tell user they can't add more managers  		LLSD args;  		args["MAX_MANAGER"] = llformat("%d",ESTATE_MAX_MANAGERS); -		LLNotifications::instance().add("MaxManagersOnRegion", args); +		LLNotificationsUtil::add("MaxManagersOnRegion", args);  	}  	else  	{	// Go pick managers to add @@ -1567,13 +1566,13 @@ void LLPanelEstateInfo::onKickUserCommit(const std::vector<std::string>& names,  	args["EVIL_USER"] = names[0];  	LLSD payload;  	payload["agent_id"] = ids[0]; -	LLNotifications::instance().add("EstateKickUser", args, payload, boost::bind(&LLPanelEstateInfo::kickUserConfirm, self, _1, _2)); +	LLNotificationsUtil::add("EstateKickUser", args, payload, boost::bind(&LLPanelEstateInfo::kickUserConfirm, self, _1, _2));  }  bool LLPanelEstateInfo::kickUserConfirm(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	switch(option)  	{  	case 0: @@ -1722,7 +1721,7 @@ void LLPanelEstateInfo::accessAddCore(U32 operation_flag, const std::string& dia  // static  bool LLPanelEstateInfo::accessAddCore2(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (option != 0)  	{  		// abort change @@ -1766,7 +1765,7 @@ void LLPanelEstateInfo::accessAddCore3(const std::vector<std::string>& names, co  			args["MAX_AGENTS"] = llformat("%d",ESTATE_MAX_ACCESS_IDS);  			args["LIST_TYPE"] = "Allowed Residents";  			args["NUM_EXCESS"] = llformat("%d",(ids.size()+currentCount)-ESTATE_MAX_ACCESS_IDS); -			LLNotifications::instance().add("MaxAgentOnRegionBatch", args); +			LLNotificationsUtil::add("MaxAgentOnRegionBatch", args);  			delete change_info;  			return;  		} @@ -1782,7 +1781,7 @@ void LLPanelEstateInfo::accessAddCore3(const std::vector<std::string>& names, co  			args["MAX_AGENTS"] = llformat("%d",ESTATE_MAX_ACCESS_IDS);  			args["LIST_TYPE"] = "Banned Residents";  			args["NUM_EXCESS"] = llformat("%d",(ids.size()+currentCount)-ESTATE_MAX_ACCESS_IDS); -			LLNotifications::instance().add("MaxAgentOnRegionBatch", args); +			LLNotificationsUtil::add("MaxAgentOnRegionBatch", args);  			delete change_info;  			return;  		} @@ -1851,7 +1850,7 @@ void LLPanelEstateInfo::accessRemoveCore(U32 operation_flag, const std::string&  // static  bool LLPanelEstateInfo::accessRemoveCore2(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (option != 0)  	{  		// abort @@ -1868,7 +1867,7 @@ bool LLPanelEstateInfo::accessRemoveCore2(const LLSD& notification, const LLSD&  	{  		LLSD args;  		args["ALL_ESTATES"] = all_estates_text(); -		LLNotifications::instance().add(notification["payload"]["dialog_name"],  +		LLNotificationsUtil::add(notification["payload"]["dialog_name"],   										args,  										notification["payload"],  										accessCoreConfirm); @@ -1881,7 +1880,7 @@ bool LLPanelEstateInfo::accessRemoveCore2(const LLSD& notification, const LLSD&  // static  bool LLPanelEstateInfo::accessCoreConfirm(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	const U32 originalFlags = (U32)notification["payload"]["operation"].asInteger();  	LLViewerRegion* region = gAgent.getRegion(); @@ -1900,7 +1899,7 @@ bool LLPanelEstateInfo::accessCoreConfirm(const LLSD& notification, const LLSD&  		if (((U32)notification["payload"]["operation"].asInteger() & ESTATE_ACCESS_BANNED_AGENT_ADD)  		    && region && (region->getOwner() == id))  		{ -			LLNotifications::instance().add("OwnerCanNotBeDenied"); +			LLNotificationsUtil::add("OwnerCanNotBeDenied");  			break;  		}  		switch(option) @@ -2162,7 +2161,7 @@ BOOL LLPanelEstateInfo::sendUpdate()  bool LLPanelEstateInfo::callbackChangeLindenEstate(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	switch(option)  	{  	case 0: @@ -2551,12 +2550,12 @@ BOOL LLPanelEstateInfo::checkSunHourSlider(LLUICtrl* child_ctrl)  void LLPanelEstateInfo::onClickMessageEstate(void* userdata)  {  	llinfos << "LLPanelEstateInfo::onClickMessageEstate" << llendl; -	LLNotifications::instance().add("MessageEstate", LLSD(), LLSD(), boost::bind(&LLPanelEstateInfo::onMessageCommit, (LLPanelEstateInfo*)userdata, _1, _2)); +	LLNotificationsUtil::add("MessageEstate", LLSD(), LLSD(), boost::bind(&LLPanelEstateInfo::onMessageCommit, (LLPanelEstateInfo*)userdata, _1, _2));  }  bool LLPanelEstateInfo::onMessageCommit(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	std::string text = response["message"].asString();  	if(option != 0) return false;  	if(text.empty()) return false; @@ -2685,7 +2684,7 @@ BOOL LLPanelEstateCovenant::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop  		{  			LLSD payload;  			payload["item_id"] = item->getUUID(); -			LLNotifications::instance().add("EstateChangeCovenant", LLSD(), payload, +			LLNotificationsUtil::add("EstateChangeCovenant", LLSD(), payload,  									LLPanelEstateCovenant::confirmChangeCovenantCallback);  		}  		break; @@ -2700,7 +2699,7 @@ BOOL LLPanelEstateCovenant::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop  // static   bool LLPanelEstateCovenant::confirmChangeCovenantCallback(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	LLInventoryItem* item = gInventory.getItem(notification["payload"]["item_id"].asUUID());  	LLPanelEstateCovenant* self = LLFloaterRegionInfo::getPanelCovenant(); @@ -2720,7 +2719,7 @@ bool LLPanelEstateCovenant::confirmChangeCovenantCallback(const LLSD& notificati  // static  void LLPanelEstateCovenant::resetCovenantID(void* userdata)  { -	LLNotifications::instance().add("EstateChangeCovenant", LLSD(), LLSD(), confirmResetCovenantCallback); +	LLNotificationsUtil::add("EstateChangeCovenant", LLSD(), LLSD(), confirmResetCovenantCallback);  }  // static @@ -2729,7 +2728,7 @@ bool LLPanelEstateCovenant::confirmResetCovenantCallback(const LLSD& notificatio  	LLPanelEstateCovenant* self = LLFloaterRegionInfo::getPanelCovenant();  	if (!self) return false; -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	switch(option)  	{  	case 0:		 @@ -2793,7 +2792,7 @@ void LLPanelEstateCovenant::onLoadComplete(LLVFS *vfs,  				if( !panelp->mEditor->importBuffer( &buffer[0], file_length+1 ) )  				{  					llwarns << "Problem importing estate covenant." << llendl; -					LLNotifications::instance().add("ProblemImportingEstateCovenant"); +					LLNotificationsUtil::add("ProblemImportingEstateCovenant");  				}  				else  				{ @@ -2813,15 +2812,15 @@ void LLPanelEstateCovenant::onLoadComplete(LLVFS *vfs,  			if( LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE == status ||  				LL_ERR_FILE_EMPTY == status)  			{ -				LLNotifications::instance().add("MissingNotecardAssetID"); +				LLNotificationsUtil::add("MissingNotecardAssetID");  			}  			else if (LL_ERR_INSUFFICIENT_PERMISSIONS == status)  			{ -				LLNotifications::instance().add("NotAllowedToViewNotecard"); +				LLNotificationsUtil::add("NotAllowedToViewNotecard");  			}  			else  			{ -				LLNotifications::instance().add("UnableToLoadNotecardAsset"); +				LLNotificationsUtil::add("UnableToLoadNotecardAsset");  			}  			llwarns << "Problem loading notecard: " << status << llendl; diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp index 1002697fe5..1f3bd50d5b 100644 --- a/indra/newview/llfloaterreporter.cpp +++ b/indra/newview/llfloaterreporter.cpp @@ -42,6 +42,7 @@  #include "llfontgl.h"  #include "llgl.h"			// for renderer  #include "llinventory.h" +#include "llnotificationsutil.h"  #include "llstring.h"  #include "llsys.h"  #include "llversionviewer.h" @@ -123,11 +124,11 @@ void LLFloaterReporter::processRegionInfo(LLMessageSystem* msg)  		if ( email_to_estate_owner )  		{ -			LLNotifications::instance().add("HelpReportAbuseEmailEO"); +			LLNotificationsUtil::add("HelpReportAbuseEmailEO");  		}  		else  		{ -			LLNotifications::instance().add("HelpReportAbuseEmailLL"); +			LLNotificationsUtil::add("HelpReportAbuseEmailLL");  		}  	};  } @@ -379,7 +380,7 @@ void LLFloaterReporter::onClickSend(void *userdata)  					category_value == IP_CONTENT_REMOVAL ||  					category_value == IP_PERMISSONS_EXPLOIT)  				{ -					LLNotifications::instance().add("HelpReportAbuseContainsCopyright"); +					LLNotificationsUtil::add("HelpReportAbuseContainsCopyright");  					self->mCopyrightWarningSeen = TRUE;  					return;  				} @@ -388,7 +389,7 @@ void LLFloaterReporter::onClickSend(void *userdata)  			{  				// IP_CONTENT_REMOVAL *always* shows the dialog -   				// ergo you can never send that abuse report type. -				LLNotifications::instance().add("HelpReportAbuseContainsCopyright"); +				LLNotificationsUtil::add("HelpReportAbuseContainsCopyright");  				return;  			} @@ -524,39 +525,39 @@ bool LLFloaterReporter::validateReport()  	U8 category = (U8)category_sd.asInteger();  	if (category == 0)  	{ -		LLNotifications::instance().add("HelpReportAbuseSelectCategory"); +		LLNotificationsUtil::add("HelpReportAbuseSelectCategory");  		return false;  	}  	if ( childGetText("abuser_name_edit").empty() )  	{ -		LLNotifications::instance().add("HelpReportAbuseAbuserNameEmpty"); +		LLNotificationsUtil::add("HelpReportAbuseAbuserNameEmpty");  		return false;  	};  	if ( childGetText("abuse_location_edit").empty() )  	{ -		LLNotifications::instance().add("HelpReportAbuseAbuserLocationEmpty"); +		LLNotificationsUtil::add("HelpReportAbuseAbuserLocationEmpty");  		return false;  	};  	if ( childGetText("abuse_location_edit").empty() )  	{ -		LLNotifications::instance().add("HelpReportAbuseAbuserLocationEmpty"); +		LLNotificationsUtil::add("HelpReportAbuseAbuserLocationEmpty");  		return false;  	};  	if ( childGetText("summary_edit").empty() )  	{ -		LLNotifications::instance().add("HelpReportAbuseSummaryEmpty"); +		LLNotificationsUtil::add("HelpReportAbuseSummaryEmpty");  		return false;  	};  	if ( childGetText("details_edit") == mDefaultSummary )  	{ -		LLNotifications::instance().add("HelpReportAbuseDetailsEmpty"); +		LLNotificationsUtil::add("HelpReportAbuseDetailsEmpty");  		return false;  	};  	return true; @@ -829,7 +830,7 @@ void LLFloaterReporter::uploadDoneCallback(const LLUUID &uuid, void *user_data,  	{  		LLSD args;  		args["REASON"] = std::string(LLAssetStorage::getErrorString(result)); -		LLNotifications::instance().add("ErrorUploadingReportScreenshot", args); +		LLNotificationsUtil::add("ErrorUploadingReportScreenshot", args);  		std::string err_msg("There was a problem uploading a report screenshot");  		err_msg += " due to the following reason: " + args["REASON"].asString(); diff --git a/indra/newview/llfloatersellland.cpp b/indra/newview/llfloatersellland.cpp index 2d8ccd1aef..49e8f9c956 100644 --- a/indra/newview/llfloatersellland.cpp +++ b/indra/newview/llfloatersellland.cpp @@ -37,6 +37,8 @@  #include "llfloaterreg.h"  #include "llfloaterland.h"  #include "lllineeditor.h" +#include "llnotifications.h" +#include "llnotificationsutil.h"  #include "llnotify.h"  #include "llparcel.h"  #include "llselectmgr.h" @@ -425,7 +427,7 @@ void LLFloaterSellLandUI::doShowObjects(void *userdata)  	send_parcel_select_objects(parcel->getLocalID(), RT_SELL); -	LLNotifications::instance().add("TransferObjectsHighlighted", +	LLNotificationsUtil::add("TransferObjectsHighlighted",  						LLSD(), LLSD(),  						&LLFloaterSellLandUI::callbackHighlightTransferable);  } @@ -460,7 +462,7 @@ void LLFloaterSellLandUI::doSellLand(void *userdata)  		&& (sale_price == 0)   		&& sell_to_anyone)  	{ -		LLNotifications::instance().add("SalePriceRestriction"); +		LLNotificationsUtil::add("SalePriceRestriction");  		return;  	} @@ -493,7 +495,7 @@ void LLFloaterSellLandUI::doSellLand(void *userdata)  bool LLFloaterSellLandUI::onConfirmSale(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (option != 0)  	{  		return false; diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index 1cc7042c3a..dbecd45d1f 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -76,6 +76,7 @@  #include "llimagebmp.h"  #include "llimagej2c.h"  #include "lllocalcliprect.h" +#include "llnotificationsutil.h"  #include "llresmgr.h"		// LLLocale  #include "llvfile.h"  #include "llvfs.h" @@ -993,7 +994,7 @@ void LLSnapshotLivePreview::saveTexture()  	}  	else  	{ -		LLNotifications::instance().add("ErrorEncodingSnapshot"); +		LLNotificationsUtil::add("ErrorEncodingSnapshot");  		llwarns << "Error encoding snapshot" << llendl;  	} diff --git a/indra/newview/llfloatertestlistview.cpp b/indra/newview/llfloatertestlistview.cpp index 5c942d0ed9..7171449738 100644 --- a/indra/newview/llfloatertestlistview.cpp +++ b/indra/newview/llfloatertestlistview.cpp @@ -33,45 +33,9 @@  #include "llfloatertestlistview.h" -// Viewer includes -#include "lllistview.h" - -// Linden library includes -//#include "lluictrlfactory.h" -  LLFloaterTestListView::LLFloaterTestListView(const LLSD& seed) -:	LLFloater(seed), -	mListView(NULL) -{ -	// set up named callback functions for test buttons -	mCommitCallbackRegistrar.add("TestListView.Test1", -		boost::bind(&LLFloaterTestListView::onClickTest1, this)); -	mCommitCallbackRegistrar.add("TestListView.Test2", -		boost::bind(&LLFloaterTestListView::onClickTest2, this)); -} +:	LLFloater(seed) +{}  LLFloaterTestListView::~LLFloaterTestListView()  {} - -BOOL LLFloaterTestListView::postBuild() -{ -	mListView = getChild<LLListView>("test_list_view"); -	// just set a random property -	mListView->setString("set programmatically"); -	return LLFloater::postBuild(); -} - -void LLFloaterTestListView::onListViewChanged() -{ -	llinfos << "list view changed" << llendl; -} - -void LLFloaterTestListView::onClickTest1() -{ -	llinfos << "test 1" << llendl; -} - -void LLFloaterTestListView::onClickTest2() -{ -	llinfos << "test 2" << llendl; -} diff --git a/indra/newview/llfloatertestlistview.h b/indra/newview/llfloatertestlistview.h index 053da95def..0c47c2ee31 100644 --- a/indra/newview/llfloatertestlistview.h +++ b/indra/newview/llfloatertestlistview.h @@ -34,31 +34,16 @@  #include "llfloater.h" -class LLListView;  class LLSD;  class LLFloaterTestListView : public LLFloater  {  	friend class LLFloaterReg; -public: -	// nothing yet  private:  	// Construction handled by LLFloaterReg  	LLFloaterTestListView(const LLSD& seed);  	~LLFloaterTestListView(); - -	/*virtual*/ BOOL postBuild(); - -	// Perform some debug action when the list-view sends change notification -	void onListViewChanged(); - -	// Debug function hookups for buttons -	void onClickTest1(); -	void onClickTest2(); - -private: -	LLListView* mListView;  };  #endif diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp index dbd3643742..6ba032c152 100644 --- a/indra/newview/llfloatertools.cpp +++ b/indra/newview/llfloatertools.cpp @@ -52,6 +52,7 @@  #include "llmediaentry.h"  #include "llmediactrl.h"  #include "llmenugl.h" +#include "llnotificationsutil.h"  #include "llpanelcontents.h"  #include "llpanelface.h"  #include "llpanelland.h" @@ -1283,7 +1284,7 @@ void LLFloaterTools::onClickBtnAddMedia()  	LLTool *tool = LLToolMgr::getInstance()->getCurrentTool();  	if((tool != LLToolFace::getInstance()) || LLSelectMgr::getInstance()->getSelection()->isMultipleTESelected())  	{ -		LLNotifications::instance().add("MultipleFacesSelected",LLSD(), LLSD(), multipleFacesSelectedConfirm); +		LLNotificationsUtil::add("MultipleFacesSelected",LLSD(), LLSD(), multipleFacesSelectedConfirm);  	}  	else @@ -1296,7 +1297,7 @@ void LLFloaterTools::onClickBtnAddMedia()  // static  bool LLFloaterTools::multipleFacesSelectedConfirm(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	switch( option )  	{  		case 0:  // "Yes" @@ -1322,14 +1323,14 @@ void LLFloaterTools::onClickBtnEditMedia()  // called when a user wants to delete media from a prim or prim face  void LLFloaterTools::onClickBtnDeleteMedia()  { -	LLNotifications::instance().add("DeleteMedia", LLSD(), LLSD(), deleteMediaConfirm); +	LLNotificationsUtil::add("DeleteMedia", LLSD(), LLSD(), deleteMediaConfirm);  }  // static  bool LLFloaterTools::deleteMediaConfirm(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	switch( option )  	{  		case 0:  // "Yes" diff --git a/indra/newview/llfloatertopobjects.cpp b/indra/newview/llfloatertopobjects.cpp index bf5a1141a6..86992d6a31 100644 --- a/indra/newview/llfloatertopobjects.cpp +++ b/indra/newview/llfloatertopobjects.cpp @@ -41,6 +41,7 @@  #include "llbutton.h"  #include "llfloatergodtools.h"  #include "llfloaterreg.h" +#include "llnotificationsutil.h"  #include "llparcel.h"  #include "llscrolllistctrl.h"  #include "llscrolllistitem.h" @@ -359,7 +360,7 @@ void LLFloaterTopObjects::doToObjects(int action, bool all)  //static  bool LLFloaterTopObjects::callbackReturnAll(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	LLFloaterTopObjects* instance = LLFloaterReg::getTypedInstance<LLFloaterTopObjects>("top_objects");  	if(!instance) return false;  	if (option == 0) @@ -371,7 +372,7 @@ bool LLFloaterTopObjects::callbackReturnAll(const LLSD& notification, const LLSD  void LLFloaterTopObjects::onReturnAll()  {	 -	LLNotifications::instance().add("ReturnAllTopObjects", LLSD(), LLSD(), &callbackReturnAll); +	LLNotificationsUtil::add("ReturnAllTopObjects", LLSD(), LLSD(), &callbackReturnAll);  } @@ -384,7 +385,7 @@ void LLFloaterTopObjects::onReturnSelected()  //static  bool LLFloaterTopObjects::callbackDisableAll(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	LLFloaterTopObjects* instance = LLFloaterReg::getTypedInstance<LLFloaterTopObjects>("top_objects");  	if(!instance) return false;  	if (option == 0) @@ -396,7 +397,7 @@ bool LLFloaterTopObjects::callbackDisableAll(const LLSD& notification, const LLS  void LLFloaterTopObjects::onDisableAll()  { -	LLNotifications::instance().add("DisableAllTopObjects", LLSD(), LLSD(), callbackDisableAll); +	LLNotificationsUtil::add("DisableAllTopObjects", LLSD(), LLSD(), callbackDisableAll);  }  void LLFloaterTopObjects::onDisableSelected() diff --git a/indra/newview/llfloatertos.cpp b/indra/newview/llfloatertos.cpp index 8d2d48f1af..69ee8cd547 100644 --- a/indra/newview/llfloatertos.cpp +++ b/indra/newview/llfloatertos.cpp @@ -40,8 +40,10 @@  // linden library includes  #include "llbutton.h" +#include "llevents.h"  #include "llhttpclient.h"  #include "llhttpstatuscodes.h"	// for HTTP_FOUND +#include "llnotificationsutil.h"  #include "llradiogroup.h"  #include "lltextbox.h"  #include "llui.h" @@ -207,7 +209,7 @@ void LLFloaterTOS::onCancel( void* userdata )  {  	LLFloaterTOS* self = (LLFloaterTOS*) userdata;  	llinfos << "User disagrees with TOS." << llendl; -	LLNotifications::instance().add("MustAgreeToLogIn", LLSD(), LLSD(), login_alert_done); +	LLNotificationsUtil::add("MustAgreeToLogIn", LLSD(), LLSD(), login_alert_done);  	if(self->mReplyPumpName != "")  	{ diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp index a1c6704657..1e92ac0b8e 100644 --- a/indra/newview/llfloateruipreview.cpp +++ b/indra/newview/llfloateruipreview.cpp @@ -45,11 +45,11 @@  #include "llsdutil.h"  #include "llxmltree.h"  #include "llviewerwindow.h" -#include "lllivefile.h"  // XUI  #include "lluictrlfactory.h"  #include "llcombobox.h" +#include "llnotificationsutil.h"  #include "llresizebar.h"  #include "llscrolllistitem.h"  #include "llscrolllistctrl.h" @@ -608,7 +608,7 @@ void LLFloaterUIPreview::popupAndPrintWarning(std::string& warning)  	llwarns << warning << llendl;  	LLSD args;  	args["MESSAGE"] = warning; -	LLNotifications::instance().add("GenericAlert", args); +	LLNotificationsUtil::add("GenericAlert", args);  }  // Get localization string from drop-down menu diff --git a/indra/newview/llfloaterurlentry.cpp b/indra/newview/llfloaterurlentry.cpp index 2b01a56373..5e769feea6 100644 --- a/indra/newview/llfloaterurlentry.cpp +++ b/indra/newview/llfloaterurlentry.cpp @@ -37,8 +37,8 @@  #include "llpanellandmedia.h"  #include "llpanelface.h" -// project includes  #include "llcombobox.h" +#include "llnotificationsutil.h"  #include "llurlhistory.h"  #include "lluictrlfactory.h"  #include "llwindow.h" @@ -263,13 +263,13 @@ void LLFloaterURLEntry::onBtnCancel( void* userdata )  //-----------------------------------------------------------------------------  void LLFloaterURLEntry::onBtnClear( void* userdata )  { -	LLNotifications::instance().add( "ConfirmClearMediaUrlList", LLSD(), LLSD(),  +	LLNotificationsUtil::add( "ConfirmClearMediaUrlList", LLSD(), LLSD(),   									boost::bind(&LLFloaterURLEntry::callback_clear_url_list, (LLFloaterURLEntry*)userdata, _1, _2) );  }  bool LLFloaterURLEntry::callback_clear_url_list(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if ( option == 0 ) // YES  	{  		// clear saved list diff --git a/indra/newview/llfloaterwater.cpp b/indra/newview/llfloaterwater.cpp index a0fe42bf61..66a1f6701f 100644 --- a/indra/newview/llfloaterwater.cpp +++ b/indra/newview/llfloaterwater.cpp @@ -47,6 +47,7 @@  #include "llviewercamera.h"  #include "llcombobox.h"  #include "lllineeditor.h" +#include "llnotificationsutil.h"  #include "llfloaterdaycycle.h"  #include "llboost.h"  #include "llmultisliderctrl.h" @@ -159,7 +160,7 @@ void LLFloaterWater::initCallbacks(void) {  bool LLFloaterWater::newPromptCallback(const LLSD& notification, const LLSD& response)  {  	std::string text = response["message"].asString(); -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if(text == "")  	{ @@ -191,7 +192,7 @@ bool LLFloaterWater::newPromptCallback(const LLSD& notification, const LLSD& res  		}   		else   		{ -			LLNotifications::instance().add("ExistsWaterPresetAlert"); +			LLNotificationsUtil::add("ExistsWaterPresetAlert");  		}  	}  	return false; @@ -503,7 +504,7 @@ void LLFloaterWater::onNormalMapPicked(LLUICtrl* ctrl)  void LLFloaterWater::onNewPreset()  { -	LLNotifications::instance().add("NewWaterPreset", LLSD(),  LLSD(), boost::bind(&LLFloaterWater::newPromptCallback, this, _1, _2)); +	LLNotificationsUtil::add("NewWaterPreset", LLSD(),  LLSD(), boost::bind(&LLFloaterWater::newPromptCallback, this, _1, _2));  }  void LLFloaterWater::onSavePreset() @@ -525,16 +526,16 @@ void LLFloaterWater::onSavePreset()  		comboBox->getSelectedItemLabel());  	if(sIt != sDefaultPresets.end() && !gSavedSettings.getBOOL("WaterEditPresets"))   	{ -		LLNotifications::instance().add("WLNoEditDefault"); +		LLNotificationsUtil::add("WLNoEditDefault");  		return;  	} -	LLNotifications::instance().add("WLSavePresetAlert", LLSD(), LLSD(), boost::bind(&LLFloaterWater::saveAlertCallback, this, _1, _2)); +	LLNotificationsUtil::add("WLSavePresetAlert", LLSD(), LLSD(), boost::bind(&LLFloaterWater::saveAlertCallback, this, _1, _2));  }  bool LLFloaterWater::saveAlertCallback(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	// if they choose save, do it.  Otherwise, don't do anything  	if(option == 0)   	{ @@ -561,12 +562,12 @@ void LLFloaterWater::onDeletePreset()  	LLSD args;  	args["SKY"] = combo_box->getSelectedValue().asString(); -	LLNotifications::instance().add("WLDeletePresetAlert", args, LLSD(), boost::bind(&LLFloaterWater::deleteAlertCallback, this, _1, _2)); +	LLNotificationsUtil::add("WLDeletePresetAlert", args, LLSD(), boost::bind(&LLFloaterWater::deleteAlertCallback, this, _1, _2));  }  bool LLFloaterWater::deleteAlertCallback(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	// if they choose delete, do it.  Otherwise, don't do anything  	if(option == 0)   	{ @@ -587,7 +588,7 @@ bool LLFloaterWater::deleteAlertCallback(const LLSD& notification, const LLSD& r  		std::set<std::string>::iterator sIt = sDefaultPresets.find(name);  		if(sIt != sDefaultPresets.end())   		{ -			LLNotifications::instance().add("WaterNoEditDefault"); +			LLNotificationsUtil::add("WaterNoEditDefault");  			return false;  		} diff --git a/indra/newview/llfloaterwindlight.cpp b/indra/newview/llfloaterwindlight.cpp index 60494f3cce..ea6fda7303 100644 --- a/indra/newview/llfloaterwindlight.cpp +++ b/indra/newview/llfloaterwindlight.cpp @@ -41,6 +41,7 @@  #include "llsliderctrl.h"  #include "llmultislider.h"  #include "llmultisliderctrl.h" +#include "llnotificationsutil.h"  #include "llspinctrl.h"  #include "llcheckboxctrl.h"  #include "lluictrlfactory.h" @@ -210,7 +211,7 @@ void LLFloaterWindLight::initCallbacks(void) {  bool LLFloaterWindLight::newPromptCallback(const LLSD& notification, const LLSD& response)  {  	std::string text = response["message"].asString(); -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if(text == "")  	{ @@ -260,7 +261,7 @@ bool LLFloaterWindLight::newPromptCallback(const LLSD& notification, const LLSD&  		}   		else   		{ -			LLNotifications::instance().add("ExistsSkyPresetAlert"); +			LLNotificationsUtil::add("ExistsSkyPresetAlert");  		}  	}  	return false; @@ -676,7 +677,7 @@ void LLFloaterWindLight::onStarAlphaMoved(LLUICtrl* ctrl)  void LLFloaterWindLight::onNewPreset()  { -	LLNotifications::instance().add("NewSkyPreset", LLSD(), LLSD(), boost::bind(&LLFloaterWindLight::newPromptCallback, this, _1, _2)); +	LLNotificationsUtil::add("NewSkyPreset", LLSD(), LLSD(), boost::bind(&LLFloaterWindLight::newPromptCallback, this, _1, _2));  }  void LLFloaterWindLight::onSavePreset() @@ -696,19 +697,19 @@ void LLFloaterWindLight::onSavePreset()  		comboBox->getSelectedItemLabel());  	if(sIt != sDefaultPresets.end() && !gSavedSettings.getBOOL("SkyEditPresets"))   	{ -		LLNotifications::instance().add("WLNoEditDefault"); +		LLNotificationsUtil::add("WLNoEditDefault");  		return;  	}  	LLWLParamManager::instance()->mCurParams.mName =   		comboBox->getSelectedItemLabel(); -	LLNotifications::instance().add("WLSavePresetAlert", LLSD(), LLSD(), boost::bind(&LLFloaterWindLight::saveAlertCallback, this, _1, _2)); +	LLNotificationsUtil::add("WLSavePresetAlert", LLSD(), LLSD(), boost::bind(&LLFloaterWindLight::saveAlertCallback, this, _1, _2));  }  bool LLFloaterWindLight::saveAlertCallback(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	// if they choose save, do it.  Otherwise, don't do anything  	if(option == 0)   	{ @@ -734,13 +735,13 @@ void LLFloaterWindLight::onDeletePreset()  	LLSD args;  	args["SKY"] = combo_box->getSelectedValue().asString(); -	LLNotifications::instance().add("WLDeletePresetAlert", args, LLSD(),  +	LLNotificationsUtil::add("WLDeletePresetAlert", args, LLSD(),   									boost::bind(&LLFloaterWindLight::deleteAlertCallback, this, _1, _2));  }  bool LLFloaterWindLight::deleteAlertCallback(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	// if they choose delete, do it.  Otherwise, don't do anything  	if(option == 0)  @@ -762,7 +763,7 @@ bool LLFloaterWindLight::deleteAlertCallback(const LLSD& notification, const LLS  		std::set<std::string>::iterator sIt = sDefaultPresets.find(name);  		if(sIt != sDefaultPresets.end())   		{ -			LLNotifications::instance().add("WLNoEditDefault"); +			LLNotificationsUtil::add("WLNoEditDefault");  			return false;  		} diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index 85847e5fce..7ca491a698 100644 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -54,6 +54,7 @@  #include "llinventoryobserver.h"  #include "lllandmarklist.h"  #include "lllineeditor.h" +#include "llnotificationsutil.h"  #include "llregionhandle.h"  #include "llscrolllistctrl.h"  #include "llslurl.h" @@ -1213,7 +1214,7 @@ void LLFloaterWorldMap::onCopySLURL()  	LLSD args;  	args["SLURL"] = mSLURL; -	LLNotifications::instance().add("CopySLURL", args); +	LLNotificationsUtil::add("CopySLURL", args);  }  // protected diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp index d85ac477e1..77a2cbcfca 100644 --- a/indra/newview/llgesturemgr.cpp +++ b/indra/newview/llgesturemgr.cpp @@ -42,6 +42,7 @@  #include "lldatapacker.h"  #include "llinventory.h"  #include "llmultigesture.h" +#include "llnotificationsutil.h"  #include "llstl.h"  #include "llstring.h"	// todo: remove  #include "llvfile.h" @@ -971,7 +972,7 @@ void LLGestureManager::onLoadComplete(LLVFS *vfs,  					// we're done with this set of deactivations  					LLSD args;  					args["NAMES"] = self.mDeactivateSimilarNames; -					LLNotifications::instance().add("DeactivatedGesturesTrigger", args); +					LLNotificationsUtil::add("DeactivatedGesturesTrigger", args);  				}  			} diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp index f4e1951c7b..6fe8ed0e4d 100644 --- a/indra/newview/llgroupactions.cpp +++ b/indra/newview/llgroupactions.cpp @@ -35,12 +35,12 @@  #include "llgroupactions.h" -// Viewer includes  #include "llagent.h"  #include "llcommandhandler.h"  #include "llfloaterreg.h"  #include "llgroupmgr.h"  #include "llimview.h" // for gIMMgr +#include "llnotificationsutil.h"  #include "llsidetray.h"  #include "llstatusbar.h"	// can_afford_transaction()  #include "llimfloater.h" @@ -132,11 +132,11 @@ void LLGroupActions::join(const LLUUID& group_id)  		if (can_afford_transaction(cost))  		{ -			LLNotifications::instance().add("JoinGroupCanAfford", args, payload, onJoinGroup); +			LLNotificationsUtil::add("JoinGroupCanAfford", args, payload, onJoinGroup);  		}  		else  		{ -			LLNotifications::instance().add("JoinGroupCannotAfford", args, payload); +			LLNotificationsUtil::add("JoinGroupCannotAfford", args, payload);  		}  	}  	else @@ -149,7 +149,7 @@ void LLGroupActions::join(const LLUUID& group_id)  // static  bool LLGroupActions::onJoinGroup(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (option == 1)  	{ @@ -181,7 +181,7 @@ void LLGroupActions::leave(const LLUUID& group_id)  		args["GROUP"] = gAgent.mGroups.get(i).mName;  		LLSD payload;  		payload["group_id"] = group_id; -		LLNotifications::instance().add("GroupLeaveConfirmMember", args, payload, onLeaveGroup); +		LLNotificationsUtil::add("GroupLeaveConfirmMember", args, payload, onLeaveGroup);  	}  } @@ -346,7 +346,7 @@ bool LLGroupActions::isAvatarMemberOfGroup(const LLUUID& group_id, const LLUUID&  // static  bool LLGroupActions::onLeaveGroup(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	LLUUID group_id = notification["payload"]["group_id"].asUUID();  	if(option == 0)  	{ diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp index 59537c1e65..ebb5feb2bf 100644 --- a/indra/newview/llgroupmgr.cpp +++ b/indra/newview/llgroupmgr.cpp @@ -52,7 +52,7 @@  #include "llviewerwindow.h"  #include "llpanelgroup.h"  #include "llgroupactions.h" -#include "llnotifications.h" +#include "llnotificationsutil.h"  #include "lluictrlfactory.h"  #include <boost/regex.hpp> @@ -1295,7 +1295,7 @@ void LLGroupMgr::processCreateGroupReply(LLMessageSystem* msg, void ** data)  		// *TODO: Translate  		LLSD args;  		args["MESSAGE"] = message; -		LLNotifications::instance().add("UnableToCreateGroup", args); +		LLNotificationsUtil::add("UnableToCreateGroup", args);  	}  } diff --git a/indra/newview/llimhandler.cpp b/indra/newview/llimhandler.cpp index c081af5879..1cbd273e96 100644 --- a/indra/newview/llimhandler.cpp +++ b/indra/newview/llimhandler.cpp @@ -36,6 +36,7 @@  #include "llnotificationhandler.h"  #include "llagentdata.h" +#include "llnotifications.h"  #include "lltoastimpanel.h"  #include "llviewerwindow.h" diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index ffa943092f..c096b5220a 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -70,6 +70,8 @@  #include "lltoolbar.h"  #include "llviewermessage.h"  #include "llviewerwindow.h" +#include "llnotifications.h" +#include "llnotificationsutil.h"  #include "llnotify.h"  #include "llnearbychat.h"  #include "llviewerregion.h" @@ -120,7 +122,7 @@ void toast_callback(const LLSD& msg){  	args["FROM_ID"] = msg["from_id"];  	args["SESSION_ID"] = msg["session_id"]; -	LLNotifications::instance().add("IMToast", args, LLSD(), boost::bind(&LLIMFloater::show, msg["session_id"].asUUID())); +	LLNotificationsUtil::add("IMToast", args, LLSD(), boost::bind(&LLIMFloater::show, msg["session_id"].asUUID()));  }  void LLIMModel::setActiveSessionID(const LLUUID& session_id) @@ -1015,7 +1017,7 @@ LLIMMgr::showSessionStartError(  	LLSD payload;  	payload["session_id"] = session_id; -	LLNotifications::instance().add( +	LLNotificationsUtil::add(  		"ChatterBoxSessionStartError",  		args,  		payload, @@ -1038,7 +1040,7 @@ LLIMMgr::showSessionEventError(  		LLTrans::getString(event_string);  	args["RECIPIENT"] = floater->getTitle(); -	LLNotifications::instance().add( +	LLNotificationsUtil::add(  		"ChatterBoxSessionEventError",  		args);  } @@ -1059,7 +1061,7 @@ LLIMMgr::showSessionForceClose(  	LLSD payload;  	payload["session_id"] = session_id; -	LLNotifications::instance().add( +	LLNotificationsUtil::add(  		"ForceCloseChatterBoxSession",  		args,  		payload, @@ -1363,7 +1365,7 @@ bool inviteUserResponse(const LLSD& notification, const LLSD& response)  	LLUUID session_id = payload["session_id"].asUUID();  	EInstantMessage type = (EInstantMessage)payload["type"].asInteger();  	LLIMMgr::EInvitationType inv_type = (LLIMMgr::EInvitationType)payload["inv_type"].asInteger(); -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	switch(option)   	{  	case 0: // accept @@ -1876,7 +1878,7 @@ void LLIMMgr::inviteToSession(  				args["NAME"] = caller_name;  				args["GROUP"] = session_name; -				LLNotifications::instance().add(notify_box_type, args, payload, &inviteUserResponse); +				LLNotificationsUtil::add(notify_box_type, args, payload, &inviteUserResponse);  			}  		}  		mPendingInvitations[session_id.asString()] = LLSD(); @@ -1899,7 +1901,7 @@ void LLIMMgr::onInviteNameLookup(LLSD payload, const LLUUID& id, const std::stri  		LLSD args;  		args["NAME"] = payload["caller_name"].asString(); -		LLNotifications::instance().add( +		LLNotificationsUtil::add(  			payload["notify_box_type"].asString(),  			args,   			payload, diff --git a/indra/newview/llinspectobject.cpp b/indra/newview/llinspectobject.cpp index e3780f93ff..42d061ff72 100644 --- a/indra/newview/llinspectobject.cpp +++ b/indra/newview/llinspectobject.cpp @@ -36,7 +36,7 @@  // Viewer  #include "llinspect.h"  #include "llmediaentry.h" -#include "llnotifications.h"	// *TODO: Eliminate, add LLNotificationsUtil wrapper +#include "llnotificationsutil.h"	// *TODO: Eliminate, add LLNotificationsUtil wrapper  #include "llselectmgr.h"  #include "llslurl.h"  #include "llviewermenu.h"		// handle_object_touch(), handle_buy() @@ -631,7 +631,7 @@ void LLInspectObject::onClickOpen()  void LLInspectObject::onClickMoreInfo()  {  	// *TODO: Show object info side panel, once that is implemented. -	LLNotifications::instance().add("ClickUnimplemented"); +	LLNotificationsUtil::add("ClickUnimplemented");  	closeFloater();  } diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index aa71904595..d216872363 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -1,5203 +1,5205 @@ -/**
 - * @file llinventorybridge.cpp
 - * @brief Implementation of the Inventory-Folder-View-Bridge classes.
 - *
 - * $LicenseInfo:firstyear=2001&license=viewergpl$
 - *
 - * Copyright (c) 2001-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 "llinventorybridge.h"
 -
 -#include "llagent.h"
 -#include "llagentwearables.h"
 -#include "llappearancemgr.h"
 -#include "llavataractions.h"
 -#include "llfloatercustomize.h"
 -#include "llfloaterinventory.h"
 -#include "llfloateropenobject.h"
 -#include "llfloaterreg.h"
 -#include "llfloaterworldmap.h"
 -#include "llfriendcard.h"
 -#include "llgesturemgr.h"
 -#include "llimfloater.h"
 -#include "llimview.h"
 -#include "llinventoryclipboard.h"
 -#include "llinventoryfunctions.h"
 -#include "llinventorymodel.h"
 -#include "llinventorypanel.h"
 -#include "llpreviewanim.h"
 -#include "llpreviewgesture.h"
 -#include "llpreviewtexture.h"
 -#include "llselectmgr.h"
 -#include "llsidetray.h"
 -#include "lltrans.h"
 -#include "llviewerassettype.h"
 -#include "llviewermessage.h"
 -#include "llviewerobjectlist.h"
 -#include "llviewerwindow.h"
 -#include "llvoavatarself.h"
 -#include "llwearablelist.h"
 -#include "llpaneloutfitsinventory.h"
 -
 -using namespace LLOldEvents;
 -
 -// Helpers
 -// bug in busy count inc/dec right now, logic is complex... do we really need it?
 -void inc_busy_count()
 -{
 -// 	gViewerWindow->getWindow()->incBusyCount();
 -//  check balance of these calls if this code is changed to ever actually
 -//  *do* something!
 -}
 -void dec_busy_count()
 -{
 -// 	gViewerWindow->getWindow()->decBusyCount();
 -//  check balance of these calls if this code is changed to ever actually
 -//  *do* something!
 -}
 -
 -// Function declarations
 -void wear_add_inventory_item_on_avatar(LLInventoryItem* item);
 -void remove_inventory_category_from_avatar(LLInventoryCategory* category);
 -void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_id);
 -bool move_task_inventory_callback(const LLSD& notification, const LLSD& response, LLMoveInv*);
 -bool confirm_replace_attachment_rez(const LLSD& notification, const LLSD& response);
 -
 -std::string ICON_NAME[ICON_NAME_COUNT] =
 -{
 -	"Inv_Texture",
 -	"Inv_Sound",
 -	"Inv_CallingCard",
 -	"Inv_CallingCard",
 -	"Inv_Landmark",
 -	"Inv_Landmark",
 -	"Inv_Script",
 -	"Inv_Clothing",
 -	"Inv_Object",
 -	"Inv_Object",
 -	"Inv_Notecard",
 -	"Inv_Skin",
 -	"Inv_Snapshot",
 -
 -	"Inv_BodyShape",
 -	"Inv_Skin",
 -	"Inv_Hair",
 -	"Inv_Eye",
 -	"Inv_Shirt",
 -	"Inv_Pants",
 -	"Inv_Shoe",
 -	"Inv_Socks",
 -	"Inv_Jacket",
 -	"Inv_Gloves",
 -	"Inv_Undershirt",
 -	"Inv_Underpants",
 -	"Inv_Skirt",
 -	"Inv_Alpha",
 -	"Inv_Tattoo",
 -
 -	"Inv_Animation",
 -	"Inv_Gesture",
 -
 -	"inv_item_linkitem.tga",
 -	"inv_item_linkfolder.tga"
 -};
 -
 -// +=================================================+
 -// |        LLInvFVBridge                            |
 -// +=================================================+
 -
 -LLInvFVBridge::LLInvFVBridge(LLInventoryPanel* inventory, const LLUUID& uuid) :
 -mUUID(uuid), mInvType(LLInventoryType::IT_NONE)
 -{
 -	mInventoryPanel = inventory->getHandle();
 -}
 -
 -const std::string& LLInvFVBridge::getName() const
 -{
 -	LLInventoryObject* obj = getInventoryObject();
 -	if(obj)
 -	{
 -		return obj->getName();
 -	}
 -	return LLStringUtil::null;
 -}
 -
 -const std::string& LLInvFVBridge::getDisplayName() const
 -{
 -	return getName();
 -}
 -
 -// Folders have full perms
 -PermissionMask LLInvFVBridge::getPermissionMask() const
 -{
 -
 -	return PERM_ALL;
 -}
 -
 -// virtual
 -LLFolderType::EType LLInvFVBridge::getPreferredType() const
 -{
 -	return LLFolderType::FT_NONE;
 -}
 -
 -
 -// Folders don't have creation dates.
 -time_t LLInvFVBridge::getCreationDate() const
 -{
 -	return 0;
 -}
 -
 -// Can be destroyed (or moved to trash)
 -BOOL LLInvFVBridge::isItemRemovable()
 -{
 -	const LLInventoryModel* model = getInventoryModel();
 -	if(!model) 
 -	{
 -		return FALSE;
 -	}
 -	if(!model->isObjectDescendentOf(mUUID, gInventory.getRootFolderID()))
 -	{
 -		return FALSE;
 -	}
 -	const LLInventoryObject *obj = model->getItem(mUUID);
 -	if (obj && obj->getIsLinkType())
 -	{
 -		return TRUE;
 -	}
 -	if (gAgentWearables.isWearingItem(mUUID))
 -	{
 -		return FALSE;
 -	}
 -	const LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
 -	if (avatar && avatar->isWearingAttachment(mUUID))
 -	{
 -		return FALSE;
 -	}
 -	return TRUE;
 -}
 -
 -// Can be moved to another folder
 -BOOL LLInvFVBridge::isItemMovable() const
 -{
 -	return TRUE;
 -}
 -
 -/*virtual*/
 -/**
 - * @brief Adds this item into clipboard storage
 - */
 -void LLInvFVBridge::cutToClipboard()
 -{
 -	if(isItemMovable())
 -	{
 -		LLInventoryClipboard::instance().cut(mUUID);
 -	}
 -}
 -// *TODO: make sure this does the right thing
 -void LLInvFVBridge::showProperties()
 -{
 -	LLSD key;
 -	key["id"] = mUUID;
 -	LLSideTray::getInstance()->showPanel("sidepanel_inventory", key);
 -
 -	// Disable old properties floater; this is replaced by the sidepanel.
 -	/*
 -	LLFloaterReg::showInstance("properties", mUUID);
 -	*/
 -}
 -
 -void LLInvFVBridge::removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batch)
 -{
 -	// Deactivate gestures when moving them into Trash
 -	LLInvFVBridge* bridge;
 -	LLInventoryModel* model = getInventoryModel();
 -	LLViewerInventoryItem* item = NULL;
 -	LLViewerInventoryCategory* cat = NULL;
 -	LLInventoryModel::cat_array_t	descendent_categories;
 -	LLInventoryModel::item_array_t	descendent_items;
 -	S32 count = batch.count();
 -	S32 i,j;
 -	for(i = 0; i < count; ++i)
 -	{
 -		bridge = (LLInvFVBridge*)(batch.get(i));
 -		if(!bridge || !bridge->isItemRemovable()) continue;
 -		item = (LLViewerInventoryItem*)model->getItem(bridge->getUUID());
 -		if (item)
 -		{
 -			if(LLAssetType::AT_GESTURE == item->getType())
 -			{
 -				LLGestureManager::instance().deactivateGesture(item->getUUID());
 -			}
 -		}
 -	}
 -	for(i = 0; i < count; ++i)
 -	{
 -		bridge = (LLInvFVBridge*)(batch.get(i));
 -		if(!bridge || !bridge->isItemRemovable()) continue;
 -		cat = (LLViewerInventoryCategory*)model->getCategory(bridge->getUUID());
 -		if (cat)
 -		{
 -			gInventory.collectDescendents( cat->getUUID(), descendent_categories, descendent_items, FALSE );
 -			for (j=0; j<descendent_items.count(); j++)
 -			{
 -				if(LLAssetType::AT_GESTURE == descendent_items[j]->getType())
 -				{
 -					LLGestureManager::instance().deactivateGesture(descendent_items[j]->getUUID());
 -				}
 -			}
 -		}
 -	}
 -	removeBatchNoCheck(batch);
 -}
 -
 -void LLInvFVBridge::removeBatchNoCheck(LLDynamicArray<LLFolderViewEventListener*>& batch)
 -{
 -	// this method moves a bunch of items and folders to the trash. As
 -	// per design guidelines for the inventory model, the message is
 -	// built and the accounting is performed first. After all of that,
 -	// we call LLInventoryModel::moveObject() to move everything
 -	// around.
 -	LLInvFVBridge* bridge;
 -	LLInventoryModel* model = getInventoryModel();
 -	if(!model) return;
 -	LLMessageSystem* msg = gMessageSystem;
 -	const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
 -	LLViewerInventoryItem* item = NULL;
 -	LLViewerInventoryCategory* cat = NULL;
 -	std::vector<LLUUID> move_ids;
 -	LLInventoryModel::update_map_t update;
 -	bool start_new_message = true;
 -	S32 count = batch.count();
 -	S32 i;
 -	for(i = 0; i < count; ++i)
 -	{
 -		bridge = (LLInvFVBridge*)(batch.get(i));
 -		if(!bridge || !bridge->isItemRemovable()) continue;
 -		item = (LLViewerInventoryItem*)model->getItem(bridge->getUUID());
 -		if(item)
 -		{
 -			if(item->getParentUUID() == trash_id) continue;
 -			move_ids.push_back(item->getUUID());
 -			LLPreview::hide(item->getUUID());
 -			--update[item->getParentUUID()];
 -			++update[trash_id];
 -			if(start_new_message)
 -			{
 -				start_new_message = false;
 -				msg->newMessageFast(_PREHASH_MoveInventoryItem);
 -				msg->nextBlockFast(_PREHASH_AgentData);
 -				msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
 -				msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
 -				msg->addBOOLFast(_PREHASH_Stamp, TRUE);
 -			}
 -			msg->nextBlockFast(_PREHASH_InventoryData);
 -			msg->addUUIDFast(_PREHASH_ItemID, item->getUUID());
 -			msg->addUUIDFast(_PREHASH_FolderID, trash_id);
 -			msg->addString("NewName", NULL);
 -			if(msg->isSendFullFast(_PREHASH_InventoryData))
 -			{
 -				start_new_message = true;
 -				gAgent.sendReliableMessage();
 -				gInventory.accountForUpdate(update);
 -				update.clear();
 -			}
 -		}
 -	}
 -	if(!start_new_message)
 -	{
 -		start_new_message = true;
 -		gAgent.sendReliableMessage();
 -		gInventory.accountForUpdate(update);
 -		update.clear();
 -	}
 -	for(i = 0; i < count; ++i)
 -	{
 -		bridge = (LLInvFVBridge*)(batch.get(i));
 -		if(!bridge || !bridge->isItemRemovable()) continue;
 -		cat = (LLViewerInventoryCategory*)model->getCategory(bridge->getUUID());
 -		if(cat)
 -		{
 -			if(cat->getParentUUID() == trash_id) continue;
 -			move_ids.push_back(cat->getUUID());
 -			--update[cat->getParentUUID()];
 -			++update[trash_id];
 -			if(start_new_message)
 -			{
 -				start_new_message = false;
 -				msg->newMessageFast(_PREHASH_MoveInventoryFolder);
 -				msg->nextBlockFast(_PREHASH_AgentData);
 -				msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
 -				msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
 -				msg->addBOOL("Stamp", TRUE);
 -			}
 -			msg->nextBlockFast(_PREHASH_InventoryData);
 -			msg->addUUIDFast(_PREHASH_FolderID, cat->getUUID());
 -			msg->addUUIDFast(_PREHASH_ParentID, trash_id);
 -			if(msg->isSendFullFast(_PREHASH_InventoryData))
 -			{
 -				start_new_message = true;
 -				gAgent.sendReliableMessage();
 -				gInventory.accountForUpdate(update);
 -				update.clear();
 -			}
 -		}
 -	}
 -	if(!start_new_message)
 -	{
 -		gAgent.sendReliableMessage();
 -		gInventory.accountForUpdate(update);
 -	}
 -
 -	// move everything.
 -	std::vector<LLUUID>::iterator it = move_ids.begin();
 -	std::vector<LLUUID>::iterator end = move_ids.end();
 -	for(; it != end; ++it)
 -	{
 -		gInventory.moveObject((*it), trash_id);
 -	}
 -
 -	// notify inventory observers.
 -	model->notifyObservers();
 -}
 -
 -BOOL LLInvFVBridge::isClipboardPasteable() const
 -{
 -	if (!LLInventoryClipboard::instance().hasContents() || !isAgentInventory())
 -	{
 -		return FALSE;
 -	}
 -	LLInventoryModel* model = getInventoryModel();
 -	if (!model)
 -	{
 -		return FALSE;
 -	}
 -
 -	const LLUUID &agent_id = gAgent.getID();
 -
 -	LLDynamicArray<LLUUID> objects;
 -	LLInventoryClipboard::instance().retrieve(objects);
 -	S32 count = objects.count();
 -	for(S32 i = 0; i < count; i++)
 -	{
 -		const LLUUID &item_id = objects.get(i);
 -
 -		// Can't paste folders
 -		const LLInventoryCategory *cat = model->getCategory(item_id);
 -		if (cat)
 -		{
 -			return FALSE;
 -		}
 -
 -		const LLInventoryItem *item = model->getItem(item_id);
 -		if (item)
 -		{
 -			if (!item->getPermissions().allowCopyBy(agent_id))
 -			{
 -				return FALSE;
 -			}
 -		}
 -	}
 -	return TRUE;
 -}
 -
 -BOOL LLInvFVBridge::isClipboardPasteableAsLink() const
 -{
 -	if (!LLInventoryClipboard::instance().hasContents() || !isAgentInventory())
 -	{
 -		return FALSE;
 -	}
 -	const LLInventoryModel* model = getInventoryModel();
 -	if (!model)
 -	{
 -		return FALSE;
 -	}
 -
 -	LLDynamicArray<LLUUID> objects;
 -	LLInventoryClipboard::instance().retrieve(objects);
 -	S32 count = objects.count();
 -	for(S32 i = 0; i < count; i++)
 -	{
 -		const LLInventoryItem *item = model->getItem(objects.get(i));
 -		if (item)
 -		{
 -			if (!LLAssetType::lookupCanLink(item->getActualType()))
 -			{
 -				return FALSE;
 -			}
 -		}
 -		const LLViewerInventoryCategory *cat = model->getCategory(objects.get(i));
 -		if (cat && !LLFolderType::lookupIsProtectedType(cat->getPreferredType()))
 -		{
 -			return FALSE;
 -		}
 -	}
 -	return TRUE;
 -}
 -
 -void hide_context_entries(LLMenuGL& menu, 
 -						const std::vector<std::string> &entries_to_show,
 -						const std::vector<std::string> &disabled_entries)
 -{
 -	const LLView::child_list_t *list = menu.getChildList();
 -
 -	LLView::child_list_t::const_iterator itor;
 -	for (itor = list->begin(); itor != list->end(); ++itor)
 -	{
 -		std::string name = (*itor)->getName();
 -
 -		// descend into split menus:
 -		LLMenuItemBranchGL* branchp = dynamic_cast<LLMenuItemBranchGL*>(*itor);
 -		if ((name == "More") && branchp)
 -		{
 -			hide_context_entries(*branchp->getBranch(), entries_to_show, disabled_entries);
 -		}
 -
 -
 -		bool found = false;
 -		std::vector<std::string>::const_iterator itor2;
 -		for (itor2 = entries_to_show.begin(); itor2 != entries_to_show.end(); ++itor2)
 -		{
 -			if (*itor2 == name)
 -			{
 -				found = true;
 -			}
 -		}
 -		if (!found)
 -		{
 -			(*itor)->setVisible(FALSE);
 -		}
 -		else
 -		{
 -			(*itor)->setVisible(TRUE);
 -			for (itor2 = disabled_entries.begin(); itor2 != disabled_entries.end(); ++itor2)
 -			{
 -				if (*itor2 == name)
 -				{
 -					(*itor)->setEnabled(FALSE);
 -				}
 -			}
 -		}
 -	}
 -}
 -
 -// Helper for commonly-used entries
 -void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
 -										std::vector<std::string> &items,
 -										std::vector<std::string> &disabled_items, U32 flags)
 -{
 -	const LLInventoryObject *obj = getInventoryObject();
 -	if (obj && obj->getIsLinkType())
 -	{
 -		items.push_back(std::string("Find Original"));
 -		if (LLAssetType::lookupIsLinkType(obj->getType()))
 -		{
 -			disabled_items.push_back(std::string("Find Original"));
 -		}
 -	}
 -	else
 -	{
 -		items.push_back(std::string("Rename"));
 -		if (!isItemRenameable() || (flags & FIRST_SELECTED_ITEM) == 0)
 -		{
 -			disabled_items.push_back(std::string("Rename"));
 -		}
 -		
 -		if (show_asset_id)
 -		{
 -			items.push_back(std::string("Copy Asset UUID"));
 -			if ( (! ( isItemPermissive() || gAgent.isGodlike() ) )
 -				 || (flags & FIRST_SELECTED_ITEM) == 0)
 -			{
 -				disabled_items.push_back(std::string("Copy Asset UUID"));
 -			}
 -		}
 -		items.push_back(std::string("Copy Separator"));
 -		
 -		items.push_back(std::string("Copy"));
 -		if (!isItemCopyable())
 -		{
 -			disabled_items.push_back(std::string("Copy"));
 -		}
 -	}
 -
 -	items.push_back(std::string("Paste"));
 -	if (!isClipboardPasteable() || (flags & FIRST_SELECTED_ITEM) == 0)
 -	{
 -		disabled_items.push_back(std::string("Paste"));
 -	}
 -
 -	items.push_back(std::string("Paste As Link"));
 -	if (!isClipboardPasteableAsLink() || (flags & FIRST_SELECTED_ITEM) == 0)
 -	{
 -		disabled_items.push_back(std::string("Paste As Link"));
 -	}
 -	items.push_back(std::string("Paste Separator"));
 -
 -	items.push_back(std::string("Delete"));
 -	if (!isItemRemovable())
 -	{
 -		disabled_items.push_back(std::string("Delete"));
 -	}
 -
 -	// If multiple items are selected, disable properties (if it exists).
 -	if ((flags & FIRST_SELECTED_ITEM) == 0)
 -	{
 -		disabled_items.push_back(std::string("Properties"));
 -	}
 -}
 -
 -void LLInvFVBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 -{
 -	lldebugs << "LLInvFVBridge::buildContextMenu()" << llendl;
 -	std::vector<std::string> items;
 -	std::vector<std::string> disabled_items;
 -	if(isInTrash())
 -	{
 -		items.push_back(std::string("PurgeItem"));
 -		if (!isItemRemovable())
 -		{
 -			disabled_items.push_back(std::string("PurgeItem"));
 -		}
 -		items.push_back(std::string("RestoreItem"));
 -	}
 -	else
 -	{
 -		items.push_back(std::string("Open"));
 -		items.push_back(std::string("Properties"));
 -
 -		getClipboardEntries(true, items, disabled_items, flags);
 -	}
 -	hide_context_entries(menu, items, disabled_items);
 -}
 -
 -// *TODO: remove this
 -BOOL LLInvFVBridge::startDrag(EDragAndDropType* type, LLUUID* id) const
 -{
 -	BOOL rv = FALSE;
 -
 -	const LLInventoryObject* obj = getInventoryObject();
 -
 -	if(obj)
 -	{
 -		*type = LLViewerAssetType::lookupDragAndDropType(obj->getActualType());
 -		if(*type == DAD_NONE)
 -		{
 -			return FALSE;
 -		}
 -
 -		*id = obj->getUUID();
 -		//object_ids.put(obj->getUUID());
 -
 -		if (*type == DAD_CATEGORY)
 -		{
 -			gInventory.startBackgroundFetch(obj->getUUID());
 -		}
 -
 -		rv = TRUE;
 -	}
 -
 -	return rv;
 -}
 -
 -LLInventoryObject* LLInvFVBridge::getInventoryObject() const
 -{
 -	LLInventoryObject* obj = NULL;
 -	LLInventoryModel* model = getInventoryModel();
 -	if(model)
 -	{
 -		obj = (LLInventoryObject*)model->getObject(mUUID);
 -	}
 -	return obj;
 -}
 -
 -LLInventoryModel* LLInvFVBridge::getInventoryModel() const
 -{
 -	LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get());
 -	return panel ? panel->getModel() : NULL;
 -}
 -
 -BOOL LLInvFVBridge::isInTrash() const
 -{
 -	LLInventoryModel* model = getInventoryModel();
 -	if(!model) return FALSE;
 -	const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
 -	return model->isObjectDescendentOf(mUUID, trash_id);
 -}
 -
 -BOOL LLInvFVBridge::isLinkedObjectInTrash() const
 -{
 -	if (isInTrash()) return TRUE;
 -
 -	const LLInventoryObject *obj = getInventoryObject();
 -	if (obj && obj->getIsLinkType())
 -	{
 -		LLInventoryModel* model = getInventoryModel();
 -		if(!model) return FALSE;
 -		const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
 -		return model->isObjectDescendentOf(obj->getLinkedUUID(), trash_id);
 -	}
 -	return FALSE;
 -}
 -
 -BOOL LLInvFVBridge::isAgentInventory() const
 -{
 -	const LLInventoryModel* model = getInventoryModel();
 -	if(!model) return FALSE;
 -	if(gInventory.getRootFolderID() == mUUID) return TRUE;
 -	return model->isObjectDescendentOf(mUUID, gInventory.getRootFolderID());
 -}
 -
 -BOOL LLInvFVBridge::isCOFFolder() const
 -{
 -	const LLInventoryModel* model = getInventoryModel();
 -	if(!model) return TRUE;
 -	const LLUUID cof_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
 -	if (mUUID == cof_id || model->isObjectDescendentOf(mUUID, cof_id))
 -	{
 -		return TRUE;
 -	}
 -	return FALSE;
 -}
 -
 -BOOL LLInvFVBridge::isItemPermissive() const
 -{
 -	return FALSE;
 -}
 -
 -// static
 -void LLInvFVBridge::changeItemParent(LLInventoryModel* model,
 -									 LLViewerInventoryItem* item,
 -									 const LLUUID& new_parent,
 -									 BOOL restamp)
 -{
 -	if(item->getParentUUID() != new_parent)
 -	{
 -		LLInventoryModel::update_list_t update;
 -		LLInventoryModel::LLCategoryUpdate old_folder(item->getParentUUID(),-1);
 -		update.push_back(old_folder);
 -		LLInventoryModel::LLCategoryUpdate new_folder(new_parent, 1);
 -		update.push_back(new_folder);
 -		gInventory.accountForUpdate(update);
 -
 -		LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
 -		new_item->setParent(new_parent);
 -		new_item->updateParentOnServer(restamp);
 -		model->updateItem(new_item);
 -		model->notifyObservers();
 -	}
 -}
 -
 -// static
 -void LLInvFVBridge::changeCategoryParent(LLInventoryModel* model,
 -										 LLViewerInventoryCategory* cat,
 -										 const LLUUID& new_parent,
 -										 BOOL restamp)
 -{
 -	if(cat->getParentUUID() != new_parent)
 -	{
 -		LLInventoryModel::update_list_t update;
 -		LLInventoryModel::LLCategoryUpdate old_folder(cat->getParentUUID(), -1);
 -		update.push_back(old_folder);
 -		LLInventoryModel::LLCategoryUpdate new_folder(new_parent, 1);
 -		update.push_back(new_folder);
 -		gInventory.accountForUpdate(update);
 -
 -		LLPointer<LLViewerInventoryCategory> new_cat = new LLViewerInventoryCategory(cat);
 -		new_cat->setParent(new_parent);
 -		new_cat->updateParentOnServer(restamp);
 -		model->updateCategory(new_cat);
 -		model->notifyObservers();
 -	}
 -}
 -
 -
 -const std::string safe_inv_type_lookup(LLInventoryType::EType inv_type)
 -{
 -	const std::string rv= LLInventoryType::lookup(inv_type);
 -	if(rv.empty())
 -	{
 -		return std::string("<invalid>");
 -	}
 -	return rv;
 -}
 -
 -LLInvFVBridge* LLInvFVBridge::createBridge(LLAssetType::EType asset_type,
 -										   LLAssetType::EType actual_asset_type,
 -										   LLInventoryType::EType inv_type,
 -										   LLInventoryPanel* inventory,
 -										   const LLUUID& uuid,
 -										   U32 flags)
 -{
 -	LLInvFVBridge* new_listener = NULL;
 -	switch(asset_type)
 -	{
 -		case LLAssetType::AT_TEXTURE:
 -			if(!(inv_type == LLInventoryType::IT_TEXTURE || inv_type == LLInventoryType::IT_SNAPSHOT))
 -			{
 -				llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
 -			}
 -			new_listener = new LLTextureBridge(inventory, uuid, inv_type);
 -			break;
 -
 -		case LLAssetType::AT_SOUND:
 -			if(!(inv_type == LLInventoryType::IT_SOUND))
 -			{
 -				llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
 -			}
 -			new_listener = new LLSoundBridge(inventory, uuid);
 -			break;
 -
 -		case LLAssetType::AT_LANDMARK:
 -			if(!(inv_type == LLInventoryType::IT_LANDMARK))
 -			{
 -				llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
 -			}
 -			new_listener = new LLLandmarkBridge(inventory, uuid, flags);
 -			break;
 -
 -		case LLAssetType::AT_CALLINGCARD:
 -			if(!(inv_type == LLInventoryType::IT_CALLINGCARD))
 -			{
 -				llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
 -			}
 -			new_listener = new LLCallingCardBridge(inventory, uuid);
 -			break;
 -
 -		case LLAssetType::AT_SCRIPT:
 -			if(!(inv_type == LLInventoryType::IT_LSL))
 -			{
 -				llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
 -			}
 -			new_listener = new LLScriptBridge(inventory, uuid);
 -			break;
 -
 -		case LLAssetType::AT_OBJECT:
 -			if(!(inv_type == LLInventoryType::IT_OBJECT || inv_type == LLInventoryType::IT_ATTACHMENT))
 -			{
 -				llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
 -			}
 -			new_listener = new LLObjectBridge(inventory, uuid, inv_type, flags);
 -			break;
 -
 -		case LLAssetType::AT_NOTECARD:
 -			if(!(inv_type == LLInventoryType::IT_NOTECARD))
 -			{
 -				llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
 -			}
 -			new_listener = new LLNotecardBridge(inventory, uuid);
 -			break;
 -
 -		case LLAssetType::AT_ANIMATION:
 -			if(!(inv_type == LLInventoryType::IT_ANIMATION))
 -			{
 -				llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
 -			}
 -			new_listener = new LLAnimationBridge(inventory, uuid);
 -			break;
 -
 -		case LLAssetType::AT_GESTURE:
 -			if(!(inv_type == LLInventoryType::IT_GESTURE))
 -			{
 -				llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
 -			}
 -			new_listener = new LLGestureBridge(inventory, uuid);
 -			break;
 -
 -		case LLAssetType::AT_LSL_TEXT:
 -			if(!(inv_type == LLInventoryType::IT_LSL))
 -			{
 -				llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
 -			}
 -			new_listener = new LLLSLTextBridge(inventory, uuid);
 -			break;
 -
 -		case LLAssetType::AT_CLOTHING:
 -		case LLAssetType::AT_BODYPART:
 -			if(!(inv_type == LLInventoryType::IT_WEARABLE))
 -			{
 -				llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
 -			}
 -			new_listener = new LLWearableBridge(inventory, uuid, asset_type, inv_type, (EWearableType)flags);
 -			break;
 -		case LLAssetType::AT_CATEGORY:
 -			if (actual_asset_type == LLAssetType::AT_LINK_FOLDER)
 -			{
 -				// Create a link folder handler instead.
 -				new_listener = new LLLinkFolderBridge(inventory, uuid);
 -				break;
 -			}
 -			new_listener = new LLFolderBridge(inventory, uuid);
 -			break;
 -		case LLAssetType::AT_LINK:
 -			// Only should happen for broken links.
 -			new_listener = new LLLinkItemBridge(inventory, uuid);
 -			break;
 -		case LLAssetType::AT_LINK_FOLDER:
 -			// Only should happen for broken links.
 -			new_listener = new LLLinkItemBridge(inventory, uuid);
 -			break;
 -		default:
 -			llinfos << "Unhandled asset type (llassetstorage.h): "
 -					<< (S32)asset_type << llendl;
 -			break;
 -	}
 -
 -	if (new_listener)
 -	{
 -		new_listener->mInvType = inv_type;
 -	}
 -
 -	return new_listener;
 -}
 -
 -void LLInvFVBridge::purgeItem(LLInventoryModel *model, const LLUUID &uuid)
 -{
 -	LLInventoryCategory* cat = model->getCategory(uuid);
 -	if (cat)
 -	{
 -		model->purgeDescendentsOf(uuid);
 -		model->notifyObservers();
 -	}
 -	LLInventoryObject* obj = model->getObject(uuid);
 -	if (obj)
 -	{
 -		model->purgeObject(uuid);
 -		model->notifyObservers();
 -	}
 -}
 -
 -// +=================================================+
 -// |        InventoryFVBridgeBuilder                 |
 -// +=================================================+
 -LLInvFVBridge* LLInventoryFVBridgeBuilder::createBridge(LLAssetType::EType asset_type,
 -														LLAssetType::EType actual_asset_type,
 -														LLInventoryType::EType inv_type,
 -														LLInventoryPanel* inventory,
 -														const LLUUID& uuid,
 -														U32 flags /* = 0x00 */) const
 -{
 -	return LLInvFVBridge::createBridge(asset_type,
 -		actual_asset_type,
 -		inv_type,
 -		inventory,
 -		uuid,
 -		flags);
 -}
 -
 -// +=================================================+
 -// |        LLItemBridge                             |
 -// +=================================================+
 -
 -void LLItemBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
 -{
 -	if ("goto" == action)
 -	{
 -		gotoItem(folder);
 -	}
 -	if ("open" == action)
 -	{
 -		openItem();
 -		return;
 -	}
 -	else if ("properties" == action)
 -	{
 -		showProperties();
 -		return;
 -	}
 -	else if ("purge" == action)
 -	{
 -		purgeItem(model, mUUID);
 -		return;
 -	}
 -	else if ("restoreToWorld" == action)
 -	{
 -		restoreToWorld();
 -		return;
 -	}
 -	else if ("restore" == action)
 -	{
 -		restoreItem();
 -		return;
 -	}
 -	else if ("copy_uuid" == action)
 -	{
 -		// Single item only
 -		LLInventoryItem* item = model->getItem(mUUID);
 -		if(!item) return;
 -		LLUUID asset_id = item->getAssetUUID();
 -		std::string buffer;
 -		asset_id.toString(buffer);
 -
 -		gViewerWindow->mWindow->copyTextToClipboard(utf8str_to_wstring(buffer));
 -		return;
 -	}
 -	else if ("copy" == action)
 -	{
 -		copyToClipboard();
 -		return;
 -	}
 -	else if ("paste" == action)
 -	{
 -		// Single item only
 -		LLInventoryItem* itemp = model->getItem(mUUID);
 -		if (!itemp) return;
 -
 -		LLFolderViewItem* folder_view_itemp = folder->getItemByID(itemp->getParentUUID());
 -		if (!folder_view_itemp) return;
 -
 -		folder_view_itemp->getListener()->pasteFromClipboard();
 -		return;
 -	}
 -	else if ("paste_link" == action)
 -	{
 -		// Single item only
 -		LLInventoryItem* itemp = model->getItem(mUUID);
 -		if (!itemp) return;
 -
 -		LLFolderViewItem* folder_view_itemp = folder->getItemByID(itemp->getParentUUID());
 -		if (!folder_view_itemp) return;
 -
 -		folder_view_itemp->getListener()->pasteLinkFromClipboard();
 -		return;
 -	}
 -}
 -
 -void LLItemBridge::selectItem()
 -{
 -	LLViewerInventoryItem* item = (LLViewerInventoryItem*)getItem();
 -	if(item && !item->isComplete())
 -	{
 -		item->fetchFromServer();
 -	}
 -}
 -
 -void LLItemBridge::restoreItem()
 -{
 -	LLViewerInventoryItem* item = (LLViewerInventoryItem*)getItem();
 -	if(item)
 -	{
 -		LLInventoryModel* model = getInventoryModel();
 -		const LLUUID new_parent = model->findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(item->getType()));
 -		// do not restamp on restore.
 -		LLInvFVBridge::changeItemParent(model, item, new_parent, FALSE);
 -	}
 -}
 -
 -void LLItemBridge::restoreToWorld()
 -{
 -	LLViewerInventoryItem* itemp = (LLViewerInventoryItem*)getItem();
 -	if (itemp)
 -	{
 -		LLMessageSystem* msg = gMessageSystem;
 -		msg->newMessage("RezRestoreToWorld");
 -		msg->nextBlockFast(_PREHASH_AgentData);
 -		msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
 -		msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
 -
 -		msg->nextBlockFast(_PREHASH_InventoryData);
 -		itemp->packMessage(msg);
 -		msg->sendReliable(gAgent.getRegion()->getHost());
 -	}
 -
 -	//Similar functionality to the drag and drop rez logic
 -	BOOL remove_from_inventory = FALSE;
 -
 -	//remove local inventory copy, sim will deal with permissions and removing the item
 -	//from the actual inventory if its a no-copy etc
 -	if(!itemp->getPermissions().allowCopyBy(gAgent.getID()))
 -	{
 -		remove_from_inventory = TRUE;
 -	}
 -
 -	// Check if it's in the trash. (again similar to the normal rez logic)
 -	const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
 -	if(gInventory.isObjectDescendentOf(itemp->getUUID(), trash_id))
 -	{
 -		remove_from_inventory = TRUE;
 -	}
 -
 -	if(remove_from_inventory)
 -	{
 -		gInventory.deleteObject(itemp->getUUID());
 -		gInventory.notifyObservers();
 -	}
 -}
 -
 -void LLItemBridge::gotoItem(LLFolderView *folder)
 -{
 -	LLInventoryObject *obj = getInventoryObject();
 -	if (obj && obj->getIsLinkType())
 -	{
 -		LLInventoryPanel* active_panel = LLFloaterInventory::getActiveInventory()->getPanel();
 -		if (active_panel)
 -		{
 -			active_panel->setSelection(obj->getLinkedUUID(), TAKE_FOCUS_NO);
 -		}
 -	}
 -}
 -
 -LLUIImagePtr LLItemBridge::getIcon() const
 -{
 -	return LLUI::getUIImage(ICON_NAME[OBJECT_ICON_NAME]);
 -}
 -
 -PermissionMask LLItemBridge::getPermissionMask() const
 -{
 -	LLViewerInventoryItem* item = getItem();
 -	PermissionMask perm_mask = 0;
 -	if(item)
 -	{
 -		BOOL copy = item->getPermissions().allowCopyBy(gAgent.getID());
 -		BOOL mod = item->getPermissions().allowModifyBy(gAgent.getID());
 -		BOOL xfer = item->getPermissions().allowOperationBy(PERM_TRANSFER,
 -															gAgent.getID());
 -
 -		if (copy) perm_mask |= PERM_COPY;
 -		if (mod)  perm_mask |= PERM_MODIFY;
 -		if (xfer) perm_mask |= PERM_TRANSFER;
 -
 -	}
 -	return perm_mask;
 -}
 -
 -const std::string& LLItemBridge::getDisplayName() const
 -{
 -	if(mDisplayName.empty())
 -	{
 -		buildDisplayName(getItem(), mDisplayName);
 -	}
 -	return mDisplayName;
 -}
 -
 -void LLItemBridge::buildDisplayName(LLInventoryItem* item, std::string& name)
 -{
 -	if(item)
 -	{
 -		name.assign(item->getName());
 -	}
 -	else
 -	{
 -		name.assign(LLStringUtil::null);
 -	}
 -}
 -
 -LLFontGL::StyleFlags LLItemBridge::getLabelStyle() const
 -{
 -	U8 font = LLFontGL::NORMAL;
 -
 -	if( gAgentWearables.isWearingItem( mUUID ) )
 -	{
 -		// llinfos << "BOLD" << llendl;
 -		font |= LLFontGL::BOLD;
 -	}
 -
 -	const LLViewerInventoryItem* item = getItem();
 -	if (item && item->getIsLinkType())
 -	{
 -		font |= LLFontGL::ITALIC;
 -	}
 -	return (LLFontGL::StyleFlags)font;
 -}
 -
 -std::string LLItemBridge::getLabelSuffix() const
 -{
 -	// String table is loaded before login screen and inventory items are
 -	// loaded after login, so LLTrans should be ready.
 -	static std::string NO_COPY =LLTrans::getString("no_copy");
 -	static std::string NO_MOD = LLTrans::getString("no_modify");
 -	static std::string NO_XFER = LLTrans::getString("no_transfer");
 -	static std::string LINK = LLTrans::getString("link");
 -	static std::string BROKEN_LINK = LLTrans::getString("broken_link");
 -	std::string suffix;
 -	LLInventoryItem* item = getItem();
 -	if(item)
 -	{
 -		// it's a bit confusing to put nocopy/nomod/etc on calling cards.
 -		if(LLAssetType::AT_CALLINGCARD != item->getType()
 -		   && item->getPermissions().getOwner() == gAgent.getID())
 -		{
 -			BOOL broken_link = LLAssetType::lookupIsLinkType(item->getType());
 -			if (broken_link) return BROKEN_LINK;
 -
 -			BOOL link = item->getIsLinkType();
 -			if (link) return LINK;
 -
 -			BOOL copy = item->getPermissions().allowCopyBy(gAgent.getID());
 -			if (!copy)
 -			{
 -				suffix += NO_COPY;
 -			}
 -			BOOL mod = item->getPermissions().allowModifyBy(gAgent.getID());
 -			if (!mod)
 -			{
 -				suffix += NO_MOD;
 -			}
 -			BOOL xfer = item->getPermissions().allowOperationBy(PERM_TRANSFER,
 -																gAgent.getID());
 -			if (!xfer)
 -			{
 -				suffix += NO_XFER;
 -			}
 -		}
 -	}
 -	return suffix;
 -}
 -
 -time_t LLItemBridge::getCreationDate() const
 -{
 -	LLViewerInventoryItem* item = getItem();
 -	if (item)
 -	{
 -		return item->getCreationDate();
 -	}
 -	return 0;
 -}
 -
 -
 -BOOL LLItemBridge::isItemRenameable() const
 -{
 -	LLViewerInventoryItem* item = getItem();
 -	if(item)
 -	{
 -		// (For now) Don't allow calling card rename since that may confuse users as to
 -		// what the calling card points to.
 -		if (item->getInventoryType() == LLInventoryType::IT_CALLINGCARD)
 -		{
 -			return FALSE;
 -		}
 -		return (item->getPermissions().allowModifyBy(gAgent.getID()));
 -	}
 -	return FALSE;
 -}
 -
 -BOOL LLItemBridge::renameItem(const std::string& new_name)
 -{
 -	if(!isItemRenameable())
 -		return FALSE;
 -	LLPreview::dirty(mUUID);
 -	LLInventoryModel* model = getInventoryModel();
 -	if(!model)
 -		return FALSE;
 -	LLViewerInventoryItem* item = getItem();
 -	if(item && (item->getName() != new_name))
 -	{
 -		LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
 -		new_item->rename(new_name);
 -		buildDisplayName(new_item, mDisplayName);
 -		new_item->updateServer(FALSE);
 -		model->updateItem(new_item);
 -
 -		model->notifyObservers();
 -	}
 -	// return FALSE because we either notified observers (& therefore
 -	// rebuilt) or we didn't update.
 -	return FALSE;
 -}
 -
 -
 -BOOL LLItemBridge::removeItem()
 -{
 -	if(!isItemRemovable())
 -	{
 -		return FALSE;
 -	}
 -	// move it to the trash
 -	LLPreview::hide(mUUID, TRUE);
 -	LLInventoryModel* model = getInventoryModel();
 -	if(!model) return FALSE;
 -	const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
 -	LLViewerInventoryItem* item = getItem();
 -
 -	// if item is not already in trash
 -	if(item && !model->isObjectDescendentOf(mUUID, trash_id))
 -	{
 -		// move to trash, and restamp
 -		LLInvFVBridge::changeItemParent(model, item, trash_id, TRUE);
 -		// delete was successful
 -		return TRUE;
 -	}
 -	else
 -	{
 -		// tried to delete already item in trash (should purge?)
 -		return FALSE;
 -	}
 -}
 -
 -BOOL LLItemBridge::isItemCopyable() const
 -{
 -	LLViewerInventoryItem* item = getItem();
 -	if (item)
 -	{
 -		// can't copy worn objects. DEV-15183
 -		LLVOAvatarSelf *avatarp = gAgent.getAvatarObject();
 -		if( !avatarp )
 -		{
 -			return FALSE;
 -		}
 -
 -		if(avatarp->isWearingAttachment(mUUID))
 -		{
 -			return FALSE;
 -		}
 -
 -		// All items can be copied, not all can be pasted.
 -		// The only time an item can't be copied is if it's a link
 -		// return (item->getPermissions().allowCopyBy(gAgent.getID()));
 -		if (item->getIsLinkType())
 -		{
 -			return FALSE;
 -		}
 -		return TRUE;
 -	}
 -	return FALSE;
 -}
 -BOOL LLItemBridge::copyToClipboard() const
 -{
 -	if(isItemCopyable())
 -	{
 -		LLInventoryClipboard::instance().add(mUUID);
 -		return TRUE;
 -	}
 -	return FALSE;
 -}
 -
 -LLViewerInventoryItem* LLItemBridge::getItem() const
 -{
 -	LLViewerInventoryItem* item = NULL;
 -	LLInventoryModel* model = getInventoryModel();
 -	if(model)
 -	{
 -		item = (LLViewerInventoryItem*)model->getItem(mUUID);
 -	}
 -	return item;
 -}
 -
 -BOOL LLItemBridge::isItemPermissive() const
 -{
 -	LLViewerInventoryItem* item = getItem();
 -	if(item)
 -	{
 -		U32 mask = item->getPermissions().getMaskBase();
 -		if((mask & PERM_ITEM_UNRESTRICTED) == PERM_ITEM_UNRESTRICTED)
 -		{
 -			return TRUE;
 -		}
 -	}
 -	return FALSE;
 -}
 -
 -// +=================================================+
 -// |        LLFolderBridge                           |
 -// +=================================================+
 -
 -LLFolderBridge* LLFolderBridge::sSelf=NULL;
 -
 -// Can be moved to another folder
 -BOOL LLFolderBridge::isItemMovable() const
 -{
 -	LLInventoryObject* obj = getInventoryObject();
 -	if(obj)
 -	{
 -		return (!LLFolderType::lookupIsProtectedType(((LLInventoryCategory*)obj)->getPreferredType()));
 -	}
 -	return FALSE;
 -}
 -
 -void LLFolderBridge::selectItem()
 -{
 -}
 -
 -
 -// Iterate through a folder's children to determine if
 -// all the children are removable.
 -class LLIsItemRemovable : public LLFolderViewFunctor
 -{
 -public:
 -	LLIsItemRemovable() : mPassed(TRUE) {}
 -	virtual void doFolder(LLFolderViewFolder* folder)
 -	{
 -		mPassed &= folder->getListener()->isItemRemovable();
 -	}
 -	virtual void doItem(LLFolderViewItem* item)
 -	{
 -		mPassed &= item->getListener()->isItemRemovable();
 -	}
 -	BOOL mPassed;
 -};
 -
 -// Can be destroyed (or moved to trash)
 -BOOL LLFolderBridge::isItemRemovable()
 -{
 -	LLInventoryModel* model = getInventoryModel();
 -	if(!model)
 -	{
 -		return FALSE;
 -	}
 -
 -	if(!model->isObjectDescendentOf(mUUID, gInventory.getRootFolderID()))
 -	{
 -		return FALSE;
 -	}
 -
 -	LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
 -	if( !avatar )
 -	{
 -		return FALSE;
 -	}
 -
 -	LLInventoryCategory* category = model->getCategory(mUUID);
 -	if( !category )
 -	{
 -		return FALSE;
 -	}
 -	// Allow protected types to be removed, but issue a warning.
 -	/*
 -	if(LLFolderType::lookupIsProtectedType(category->getPreferredType()))
 -	{
 -		return FALSE;
 -	}
 -	*/
 -
 -	LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get());
 -	LLFolderViewFolder* folderp = dynamic_cast<LLFolderViewFolder*>(panel ? panel->getRootFolder()->getItemByID(mUUID) : NULL);
 -	if (folderp)
 -	{
 -		LLIsItemRemovable folder_test;
 -		folderp->applyFunctorToChildren(folder_test);
 -		if (!folder_test.mPassed)
 -		{
 -			return FALSE;
 -		}
 -	}
 -	return TRUE;
 -}
 -
 -BOOL LLFolderBridge::isUpToDate() const
 -{
 -	LLInventoryModel* model = getInventoryModel();
 -	if(!model) return FALSE;
 -	LLViewerInventoryCategory* category = (LLViewerInventoryCategory*)model->getCategory(mUUID);
 -	if( !category )
 -	{
 -		return FALSE;
 -	}
 -
 -	return category->getVersion() != LLViewerInventoryCategory::VERSION_UNKNOWN;
 -}
 -
 -BOOL LLFolderBridge::isItemCopyable() const
 -{
 -	return TRUE;
 -}
 -
 -BOOL LLFolderBridge::copyToClipboard() const
 -{
 -	if(isItemCopyable())
 -	{
 -		LLInventoryClipboard::instance().add(mUUID);
 -		return TRUE;
 -	}
 -	return FALSE;
 -}
 -
 -BOOL LLFolderBridge::isClipboardPasteable() const
 -{
 -	if ( ! LLInvFVBridge::isClipboardPasteable() )
 -		return FALSE;
 -
 -	// Don't allow pasting duplicates to the Calling Card/Friends subfolders, see bug EXT-1599
 -	if ( LLFriendCardsManager::instance().isCategoryInFriendFolder( getCategory() ) )
 -	{
 -		LLInventoryModel* model = getInventoryModel();
 -		if ( !model )
 -		{
 -			return FALSE;
 -		}
 -
 -		LLDynamicArray<LLUUID> objects;
 -		LLInventoryClipboard::instance().retrieve(objects);
 -		const LLViewerInventoryCategory *current_cat = getCategory();
 -
 -		// Search for the direct descendent of current Friends subfolder among all pasted items,
 -		// and return false if is found.
 -		for(S32 i = objects.count() - 1; i >= 0; --i)
 -		{
 -			const LLUUID &obj_id = objects.get(i);
 -			if ( LLFriendCardsManager::instance().isObjDirectDescendentOfCategory(model->getObject(obj_id), current_cat) )
 -			{
 -				return FALSE;
 -			}
 -		}
 -
 -	}
 -	return TRUE;
 -}
 -
 -BOOL LLFolderBridge::isClipboardPasteableAsLink() const
 -{
 -	// Check normal paste-as-link permissions
 -	if (!LLInvFVBridge::isClipboardPasteableAsLink())
 -	{
 -		return FALSE;
 -	}
 -
 -	const LLInventoryModel* model = getInventoryModel();
 -	if (!model)
 -	{
 -		return FALSE;
 -	}
 -
 -	const LLViewerInventoryCategory *current_cat = getCategory();
 -	if (current_cat)
 -	{
 -		const BOOL is_in_friend_folder = LLFriendCardsManager::instance().isCategoryInFriendFolder( current_cat );
 -		const LLUUID ¤t_cat_id = current_cat->getUUID();
 -		LLDynamicArray<LLUUID> objects;
 -		LLInventoryClipboard::instance().retrieve(objects);
 -		S32 count = objects.count();
 -		for(S32 i = 0; i < count; i++)
 -		{
 -			const LLUUID &obj_id = objects.get(i);
 -			const LLInventoryCategory *cat = model->getCategory(obj_id);
 -			if (cat)
 -			{
 -				const LLUUID &cat_id = cat->getUUID();
 -				// Don't allow recursive pasting
 -				if ((cat_id == current_cat_id) ||
 -					model->isObjectDescendentOf(current_cat_id, cat_id))
 -				{
 -					return FALSE;
 -				}
 -			}
 -			// Don't allow pasting duplicates to the Calling Card/Friends subfolders, see bug EXT-1599
 -			if ( is_in_friend_folder )
 -			{
 -				// If object is direct descendent of current Friends subfolder than return false.
 -				// Note: We can't use 'const LLInventoryCategory *cat', because it may be null
 -				// in case type of obj_id is LLInventoryItem.
 -				if ( LLFriendCardsManager::instance().isObjDirectDescendentOfCategory(model->getObject(obj_id), current_cat) )
 -				{
 -					return FALSE;
 -				}
 -			}
 -		}
 -	}
 -	return TRUE;
 -
 -}
 -
 -BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
 -											BOOL drop)
 -{
 -	// This should never happen, but if an inventory item is incorrectly parented,
 -	// the UI will get confused and pass in a NULL.
 -	if(!inv_cat) return FALSE;
 -
 -	LLInventoryModel* model = getInventoryModel();
 -	if(!model) return FALSE;
 -
 -	LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
 -	if(!avatar) return FALSE;
 -
 -	// cannot drag categories into library
 -	if(!isAgentInventory())
 -	{
 -		return FALSE;
 -	}
 -
 -	// check to make sure source is agent inventory, and is represented there.
 -	LLToolDragAndDrop::ESource source = LLToolDragAndDrop::getInstance()->getSource();
 -	BOOL is_agent_inventory = (model->getCategory(inv_cat->getUUID()) != NULL)
 -		&& (LLToolDragAndDrop::SOURCE_AGENT == source);
 -
 -	BOOL accept = FALSE;
 -	S32 i;
 -	LLInventoryModel::cat_array_t	descendent_categories;
 -	LLInventoryModel::item_array_t	descendent_items;
 -	if(is_agent_inventory)
 -	{
 -		const LLUUID& cat_id = inv_cat->getUUID();
 -
 -		// Is the destination the trash?
 -		const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
 -		BOOL move_is_into_trash = (mUUID == trash_id)
 -				|| model->isObjectDescendentOf(mUUID, trash_id);
 -		BOOL is_movable = (!LLFolderType::lookupIsProtectedType(inv_cat->getPreferredType()));
 -		const LLUUID current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
 -		BOOL move_is_into_current_outfit = (mUUID == current_outfit_id);
 -		BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT);
 -		if (move_is_into_current_outfit || move_is_into_outfit)
 -		{
 -			// BAP - restrictions?
 -			is_movable = true;
 -		}
 -
 -		if (mUUID == gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE))
 -		{
 -			is_movable = FALSE; // It's generally movable but not into Favorites folder. EXT-1604
 -		}
 -
 -		if( is_movable )
 -		{
 -			gInventory.collectDescendents( cat_id, descendent_categories, descendent_items, FALSE );
 -
 -			for( i = 0; i < descendent_categories.count(); i++ )
 -			{
 -				LLInventoryCategory* category = descendent_categories[i];
 -				if(LLFolderType::lookupIsProtectedType(category->getPreferredType()))
 -				{
 -					// ...can't move "special folders" like Textures
 -					is_movable = FALSE;
 -					break;
 -				}
 -			}
 -
 -			if( is_movable )
 -			{
 -				if( move_is_into_trash )
 -				{
 -					for( i = 0; i < descendent_items.count(); i++ )
 -					{
 -						LLInventoryItem* item = descendent_items[i];
 -						if( (item->getType() == LLAssetType::AT_CLOTHING) ||
 -							(item->getType() == LLAssetType::AT_BODYPART) )
 -						{
 -							if( gAgentWearables.isWearingItem( item->getUUID() ) )
 -							{
 -								is_movable = FALSE;  // It's generally movable, but not into the trash!
 -								break;
 -							}
 -						}
 -						else
 -						if( item->getType() == LLAssetType::AT_OBJECT )
 -						{
 -							if( avatar->isWearingAttachment( item->getUUID() ) )
 -							{
 -								is_movable = FALSE;  // It's generally movable, but not into the trash!
 -								break;
 -							}
 -						}
 -					}
 -				}
 -			}
 -		}
 -
 -
 -		accept =	is_movable
 -					&& (mUUID != cat_id)								// Can't move a folder into itself
 -					&& (mUUID != inv_cat->getParentUUID())				// Avoid moves that would change nothing
 -					&& !(model->isObjectDescendentOf(mUUID, cat_id));	// Avoid circularity
 -		if(accept && drop)
 -		{
 -			// Look for any gestures and deactivate them
 -			if (move_is_into_trash)
 -			{
 -				for (i = 0; i < descendent_items.count(); i++)
 -				{
 -					LLInventoryItem* item = descendent_items[i];
 -					if (item->getType() == LLAssetType::AT_GESTURE
 -						&& LLGestureManager::instance().isGestureActive(item->getUUID()))
 -					{
 -						LLGestureManager::instance().deactivateGesture(item->getUUID());
 -					}
 -				}
 -			}
 -			// if target is an outfit or current outfit folder we use link
 -			if (move_is_into_current_outfit || move_is_into_outfit)
 -			{
 -				if (inv_cat->getPreferredType() == LLFolderType::FT_NONE)
 -				{
 -					if (move_is_into_current_outfit)
 -					{
 -						// traverse category and add all contents to currently worn.
 -						BOOL append = true;
 -						LLAppearanceManager::instance().wearInventoryCategory(inv_cat, false, append);
 -					}
 -					else
 -					{
 -						// Recursively create links in target outfit.
 -						LLInventoryModel::cat_array_t cats;
 -						LLInventoryModel::item_array_t items;
 -						gInventory.collectDescendents(inv_cat->getUUID(), cats, items, LLInventoryModel::EXCLUDE_TRASH);
 -						LLAppearanceManager::instance().linkAll(mUUID,items,NULL);
 -					}
 -				}
 -				else
 -				{
 -#if SUPPORT_ENSEMBLES
 -				// BAP - should skip if dup.
 -				if (move_is_into_current_outfit)
 -				{
 -					LLAppearanceManager::instance().addEnsembleLink(inv_cat);
 -				}
 -				else
 -				{
 -					LLPointer<LLInventoryCallback> cb = NULL;
 -					link_inventory_item(
 -						gAgent.getID(),
 -						inv_cat->getUUID(),
 -						mUUID,
 -						inv_cat->getName(),
 -						LLAssetType::AT_LINK_FOLDER,
 -						cb);
 -				}
 -#endif
 -				}
 -			}
 -			else
 -			{
 -
 -				// Reparent the folder and restamp children if it's moving
 -				// into trash.
 -				LLInvFVBridge::changeCategoryParent(
 -					model,
 -					(LLViewerInventoryCategory*)inv_cat,
 -					mUUID,
 -					move_is_into_trash);
 -			}
 -		}
 -	}
 -	else if(LLToolDragAndDrop::SOURCE_WORLD == source)
 -	{
 -		// content category has same ID as object itself
 -		LLUUID object_id = inv_cat->getUUID();
 -		LLUUID category_id = mUUID;
 -		accept = move_inv_category_world_to_agent(object_id, category_id, drop);
 -	}
 -	return accept;
 -}
 -
 -void warn_move_inventory(LLViewerObject* object, LLMoveInv* move_inv)
 -{
 -	const char* dialog = NULL;
 -	if (object->flagScripted())
 -	{
 -		dialog = "MoveInventoryFromScriptedObject";
 -	}
 -	else
 -	{
 -		dialog = "MoveInventoryFromObject";
 -	}
 -	LLNotifications::instance().add(dialog, LLSD(), LLSD(), boost::bind(move_task_inventory_callback, _1, _2, move_inv));
 -}
 -
 -// Move/copy all inventory items from the Contents folder of an in-world
 -// object to the agent's inventory, inside a given category.
 -BOOL move_inv_category_world_to_agent(const LLUUID& object_id,
 -									  const LLUUID& category_id,
 -									  BOOL drop,
 -									  void (*callback)(S32, void*),
 -									  void* user_data)
 -{
 -	// Make sure the object exists. If we allowed dragging from
 -	// anonymous objects, it would be possible to bypass
 -	// permissions.
 -	// content category has same ID as object itself
 -	LLViewerObject* object = gObjectList.findObject(object_id);
 -	if(!object)
 -	{
 -		llinfos << "Object not found for drop." << llendl;
 -		return FALSE;
 -	}
 -
 -	// this folder is coming from an object, as there is only one folder in an object, the root,
 -	// we need to collect the entire contents and handle them as a group
 -	InventoryObjectList inventory_objects;
 -	object->getInventoryContents(inventory_objects);
 -
 -	if (inventory_objects.empty())
 -	{
 -		llinfos << "Object contents not found for drop." << llendl;
 -		return FALSE;
 -	}
 -
 -	BOOL accept = TRUE;
 -	BOOL is_move = FALSE;
 -
 -	// coming from a task. Need to figure out if the person can
 -	// move/copy this item.
 -	InventoryObjectList::iterator it = inventory_objects.begin();
 -	InventoryObjectList::iterator end = inventory_objects.end();
 -	for ( ; it != end; ++it)
 -	{
 -		// coming from a task. Need to figure out if the person can
 -		// move/copy this item.
 -		LLPermissions perm(((LLInventoryItem*)((LLInventoryObject*)(*it)))->getPermissions());
 -		if((perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID())
 -			&& perm.allowTransferTo(gAgent.getID())))
 -//			|| gAgent.isGodlike())
 -		{
 -			accept = TRUE;
 -		}
 -		else if(object->permYouOwner())
 -		{
 -			// If the object cannot be copied, but the object the
 -			// inventory is owned by the agent, then the item can be
 -			// moved from the task to agent inventory.
 -			is_move = TRUE;
 -			accept = TRUE;
 -		}
 -		else
 -		{
 -			accept = FALSE;
 -			break;
 -		}
 -	}
 -
 -	if(drop && accept)
 -	{
 -		it = inventory_objects.begin();
 -		InventoryObjectList::iterator first_it = inventory_objects.begin();
 -		LLMoveInv* move_inv = new LLMoveInv;
 -		move_inv->mObjectID = object_id;
 -		move_inv->mCategoryID = category_id;
 -		move_inv->mCallback = callback;
 -		move_inv->mUserData = user_data;
 -
 -		for ( ; it != end; ++it)
 -		{
 -			two_uuids_t two(category_id, (*it)->getUUID());
 -			move_inv->mMoveList.push_back(two);
 -		}
 -
 -		if(is_move)
 -		{
 -			// Callback called from within here.
 -			warn_move_inventory(object, move_inv);
 -		}
 -		else
 -		{
 -			LLNotification::Params params("MoveInventoryFromObject");
 -			params.functor.function(boost::bind(move_task_inventory_callback, _1, _2, move_inv));
 -			LLNotifications::instance().forceResponse(params, 0);
 -		}
 -	}
 -	return accept;
 -}
 -
 -bool LLFindCOFValidItems::operator()(LLInventoryCategory* cat,
 -									 LLInventoryItem* item)
 -{
 -	// Valid COF items are:
 -	// - links to wearables (body parts or clothing)
 -	// - links to attachments
 -	// - links to gestures
 -	// - links to ensemble folders
 -	LLViewerInventoryItem *linked_item = ((LLViewerInventoryItem*)item)->getLinkedItem(); // BAP - safe?
 -	if (linked_item)
 -	{
 -		LLAssetType::EType type = linked_item->getType();
 -		return (type == LLAssetType::AT_CLOTHING ||
 -				type == LLAssetType::AT_BODYPART ||
 -				type == LLAssetType::AT_GESTURE ||
 -				type == LLAssetType::AT_OBJECT);
 -	}
 -	else
 -	{
 -		LLViewerInventoryCategory *linked_category = ((LLViewerInventoryItem*)item)->getLinkedCategory(); // BAP - safe?
 -		// BAP remove AT_NONE support after ensembles are fully working?
 -		return (linked_category &&
 -				((linked_category->getPreferredType() == LLFolderType::FT_NONE) ||
 -				 (LLFolderType::lookupIsEnsembleType(linked_category->getPreferredType()))));
 -	}
 -}
 -
 -
 -bool LLFindWearables::operator()(LLInventoryCategory* cat,
 -								 LLInventoryItem* item)
 -{
 -	if(item)
 -	{
 -		if((item->getType() == LLAssetType::AT_CLOTHING)
 -		   || (item->getType() == LLAssetType::AT_BODYPART))
 -		{
 -			return TRUE;
 -		}
 -	}
 -	return FALSE;
 -}
 -
 -
 -
 -//Used by LLFolderBridge as callback for directory recursion.
 -class LLRightClickInventoryFetchObserver : public LLInventoryFetchObserver
 -{
 -public:
 -	LLRightClickInventoryFetchObserver() :
 -		mCopyItems(false)
 -	{ };
 -	LLRightClickInventoryFetchObserver(const LLUUID& cat_id, bool copy_items) :
 -		mCatID(cat_id),
 -		mCopyItems(copy_items)
 -		{ };
 -	virtual void done()
 -	{
 -		// we've downloaded all the items, so repaint the dialog
 -		LLFolderBridge::staticFolderOptionsMenu();
 -
 -		gInventory.removeObserver(this);
 -		delete this;
 -	}
 -
 -
 -protected:
 -	LLUUID mCatID;
 -	bool mCopyItems;
 -
 -};
 -
 -//Used by LLFolderBridge as callback for directory recursion.
 -class LLRightClickInventoryFetchDescendentsObserver : public LLInventoryFetchDescendentsObserver
 -{
 -public:
 -	LLRightClickInventoryFetchDescendentsObserver(bool copy_items) : mCopyItems(copy_items) {}
 -	~LLRightClickInventoryFetchDescendentsObserver() {}
 -	virtual void done();
 -protected:
 -	bool mCopyItems;
 -};
 -
 -void LLRightClickInventoryFetchDescendentsObserver::done()
 -{
 -	// Avoid passing a NULL-ref as mCompleteFolders.front() down to
 -	// gInventory.collectDescendents()
 -	if( mCompleteFolders.empty() )
 -	{
 -		llwarns << "LLRightClickInventoryFetchDescendentsObserver::done with empty mCompleteFolders" << llendl;
 -		dec_busy_count();
 -		gInventory.removeObserver(this);
 -		delete this;
 -		return;
 -	}
 -
 -	// What we do here is get the complete information on the items in
 -	// the library, and set up an observer that will wait for that to
 -	// happen.
 -	LLInventoryModel::cat_array_t cat_array;
 -	LLInventoryModel::item_array_t item_array;
 -	gInventory.collectDescendents(mCompleteFolders.front(),
 -								  cat_array,
 -								  item_array,
 -								  LLInventoryModel::EXCLUDE_TRASH);
 -	S32 count = item_array.count();
 -#if 0 // HACK/TODO: Why?
 -	// This early causes a giant menu to get produced, and doesn't seem to be needed.
 -	if(!count)
 -	{
 -		llwarns << "Nothing fetched in category " << mCompleteFolders.front()
 -				<< llendl;
 -		dec_busy_count();
 -		gInventory.removeObserver(this);
 -		delete this;
 -		return;
 -	}
 -#endif
 -
 -	LLRightClickInventoryFetchObserver* outfit;
 -	outfit = new LLRightClickInventoryFetchObserver(mCompleteFolders.front(), mCopyItems);
 -	LLInventoryFetchObserver::item_ref_t ids;
 -	for(S32 i = 0; i < count; ++i)
 -	{
 -		ids.push_back(item_array.get(i)->getUUID());
 -	}
 -
 -	// clean up, and remove this as an observer since the call to the
 -	// outfit could notify observers and throw us into an infinite
 -	// loop.
 -	dec_busy_count();
 -	gInventory.removeObserver(this);
 -	delete this;
 -
 -	// increment busy count and either tell the inventory to check &
 -	// call done, or add this object to the inventory for observation.
 -	inc_busy_count();
 -
 -	// do the fetch
 -	outfit->fetchItems(ids);
 -	outfit->done();				//Not interested in waiting and this will be right 99% of the time.
 -//Uncomment the following code for laggy Inventory UI.
 -/*	if(outfit->isEverythingComplete())
 -	{
 -		// everything is already here - call done.
 -		outfit->done();
 -	}
 -	else
 -	{
 -		// it's all on it's way - add an observer, and the inventory
 -		// will call done for us when everything is here.
 -		gInventory.addObserver(outfit);
 -	}*/
 -}
 -
 -
 -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 -// Class LLInventoryWearObserver
 -//
 -// Observer for "copy and wear" operation to support knowing
 -// when the all of the contents have been added to inventory.
 -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 -class LLInventoryCopyAndWearObserver : public LLInventoryObserver
 -{
 -public:
 -	LLInventoryCopyAndWearObserver(const LLUUID& cat_id, int count) :mCatID(cat_id), mContentsCount(count), mFolderAdded(FALSE) {}
 -	virtual ~LLInventoryCopyAndWearObserver() {}
 -	virtual void changed(U32 mask);
 -
 -protected:
 -	LLUUID mCatID;
 -	int    mContentsCount;
 -	BOOL   mFolderAdded;
 -};
 -
 -
 -
 -void LLInventoryCopyAndWearObserver::changed(U32 mask)
 -{
 -	if((mask & (LLInventoryObserver::ADD)) != 0)
 -	{
 -		if (!mFolderAdded)
 -		{
 -			const std::set<LLUUID>& changed_items = gInventory.getChangedIDs();
 -
 -			std::set<LLUUID>::const_iterator id_it = changed_items.begin();
 -			std::set<LLUUID>::const_iterator id_end = changed_items.end();
 -			for (;id_it != id_end; ++id_it)
 -			{
 -				if ((*id_it) == mCatID)
 -				{
 -					mFolderAdded = TRUE;
 -					break;
 -				}
 -			}
 -		}
 -
 -		if (mFolderAdded)
 -		{
 -			LLViewerInventoryCategory* category = gInventory.getCategory(mCatID);
 -
 -			if (NULL == category)
 -			{
 -				llwarns << "gInventory.getCategory(" << mCatID
 -					<< ") was NULL" << llendl;
 -			}
 -			else
 -			{
 -				if (category->getDescendentCount() ==
 -				    mContentsCount)
 -				{
 -					gInventory.removeObserver(this);
 -					LLAppearanceManager::instance().wearInventoryCategory(category, FALSE, TRUE);
 -					delete this;
 -				}
 -			}
 -		}
 -
 -	}
 -}
 -
 -
 -
 -void LLFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
 -{
 -	if ("open" == action)
 -	{
 -		openItem();
 -		return;
 -	}
 -	else if ("paste" == action)
 -	{
 -		pasteFromClipboard();
 -		return;
 -	}
 -	else if ("paste_link" == action)
 -	{
 -		pasteLinkFromClipboard();
 -		return;
 -	}
 -	else if ("properties" == action)
 -	{
 -		showProperties();
 -		return;
 -	}
 -	else if ("replaceoutfit" == action)
 -	{
 -		modifyOutfit(FALSE);
 -		return;
 -	}
 -#if SUPPORT_ENSEMBLES
 -	else if ("wearasensemble" == action)
 -	{
 -		LLInventoryModel* model = getInventoryModel();
 -		if(!model) return;
 -		LLViewerInventoryCategory* cat = getCategory();
 -		if(!cat) return;
 -		LLAppearanceManager::instance().addEnsembleLink(cat,true);
 -		return;
 -	}
 -#endif
 -	else if ("addtooutfit" == action)
 -	{
 -		modifyOutfit(TRUE);
 -		return;
 -	}
 -	else if ("copy" == action)
 -	{
 -		copyToClipboard();
 -		return;
 -	}
 -	else if ("removefromoutfit" == action)
 -	{
 -		LLInventoryModel* model = getInventoryModel();
 -		if(!model) return;
 -		LLViewerInventoryCategory* cat = getCategory();
 -		if(!cat) return;
 -
 -		remove_inventory_category_from_avatar ( cat );
 -		return;
 -	}
 -	else if ("purge" == action)
 -	{
 -		purgeItem(model, mUUID);
 -		return;
 -	}
 -	else if ("restore" == action)
 -	{
 -		restoreItem();
 -		return;
 -	}
 -}
 -
 -void LLFolderBridge::openItem()
 -{
 -	lldebugs << "LLFolderBridge::openItem()" << llendl;
 -	LLInventoryModel* model = getInventoryModel();
 -	if(!model) return;
 -	if(mUUID.isNull()) return;
 -	bool fetching_inventory = model->fetchDescendentsOf(mUUID);
 -	// Only change folder type if we have the folder contents.
 -	if (!fetching_inventory)
 -	{
 -		// Disabling this for now, it's causing crash when new items are added to folders
 -		// since folder type may change before new item item has finished processing.
 -		// determineFolderType();
 -	}
 -}
 -
 -void LLFolderBridge::closeItem()
 -{
 -	determineFolderType();
 -}
 -
 -void LLFolderBridge::determineFolderType()
 -{
 -	if (isUpToDate())
 -	{
 -		LLInventoryModel* model = getInventoryModel();
 -		LLViewerInventoryCategory* category = model->getCategory(mUUID);
 -		category->determineFolderType();
 -	}
 -}
 -
 -BOOL LLFolderBridge::isItemRenameable() const
 -{
 -	LLViewerInventoryCategory* cat = (LLViewerInventoryCategory*)getCategory();
 -	if(cat && !LLFolderType::lookupIsProtectedType(cat->getPreferredType())
 -	   && (cat->getOwnerID() == gAgent.getID()))
 -	{
 -		return TRUE;
 -	}
 -	return FALSE;
 -}
 -
 -void LLFolderBridge::restoreItem()
 -{
 -	LLViewerInventoryCategory* cat;
 -	cat = (LLViewerInventoryCategory*)getCategory();
 -	if(cat)
 -	{
 -		LLInventoryModel* model = getInventoryModel();
 -		const LLUUID new_parent = model->findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(cat->getType()));
 -		// do not restamp children on restore
 -		LLInvFVBridge::changeCategoryParent(model, cat, new_parent, FALSE);
 -	}
 -}
 -
 -LLFolderType::EType LLFolderBridge::getPreferredType() const
 -{
 -	LLFolderType::EType preferred_type = LLFolderType::FT_NONE;
 -	LLViewerInventoryCategory* cat = getCategory();
 -	if(cat)
 -	{
 -		preferred_type = cat->getPreferredType();
 -	}
 -
 -	return preferred_type;
 -}
 -
 -// Icons for folders are based on the preferred type
 -LLUIImagePtr LLFolderBridge::getIcon() const
 -{
 -	LLFolderType::EType preferred_type = LLFolderType::FT_NONE;
 -	LLViewerInventoryCategory* cat = getCategory();
 -	if(cat)
 -	{
 -		preferred_type = cat->getPreferredType();
 -	}
 -	return getIcon(preferred_type);
 -}
 -
 -LLUIImagePtr LLFolderBridge::getIcon(LLFolderType::EType preferred_type)
 -{
 -	// we only have one folder image now
 -	return LLUI::getUIImage("Inv_FolderClosed");
 -}
 -
 -BOOL LLFolderBridge::renameItem(const std::string& new_name)
 -{
 -	if(!isItemRenameable())
 -		return FALSE;
 -	LLInventoryModel* model = getInventoryModel();
 -	if(!model)
 -		return FALSE;
 -	LLViewerInventoryCategory* cat = getCategory();
 -	if(cat && (cat->getName() != new_name))
 -	{
 -		LLPointer<LLViewerInventoryCategory> new_cat = new LLViewerInventoryCategory(cat);
 -		new_cat->rename(new_name);
 -		new_cat->updateServer(FALSE);
 -		model->updateCategory(new_cat);
 -
 -		model->notifyObservers();
 -	}
 -	// return FALSE because we either notified observers (& therefore
 -	// rebuilt) or we didn't update.
 -	return FALSE;
 -}
 -
 -BOOL LLFolderBridge::removeItem()
 -{
 -	if(!isItemRemovable())
 -	{
 -		return FALSE;
 -	}
 -	const LLViewerInventoryCategory *cat = getCategory();
 -	
 -	LLSD payload;
 -	LLSD args;
 -	args["FOLDERNAME"] = cat->getName();
 -
 -	LLNotification::Params params("ConfirmDeleteProtectedCategory");
 -	params.payload(payload).substitutions(args).functor.function(boost::bind(&LLFolderBridge::removeItemResponse, this, _1, _2));
 -	//params.functor.function(boost::bind(&LLFolderBridge::removeItemResponse, this, _1, _2));
 -	/*
 -	LLNotification::Params params("ChangeLindenEstate");
 -	params.functor.function(boost::bind(&LLPanelEstateInfo::callbackChangeLindenEstate, this, _1, _2));
 -	*/
 -	if (LLFolderType::lookupIsProtectedType(cat->getPreferredType()))
 -	{
 -		LLNotifications::instance().add(params);
 -	}
 -	else
 -	{
 -		LLNotifications::instance().forceResponse(params, 0);
 -	}
 -	return TRUE;
 -}
 -
 -bool LLFolderBridge::removeItemResponse(const LLSD& notification, const LLSD& response)
 -{
 -	S32 option = LLNotification::getSelectedOption(notification, response);
 -
 -	// if they choose delete, do it.  Otherwise, don't do anything
 -	if(option == 0) 
 -	{
 -		// move it to the trash
 -		LLPreview::hide(mUUID);
 -		LLInventoryModel* model = getInventoryModel();
 -		if(!model) return FALSE;
 -		
 -		const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
 -		
 -		// Look for any gestures and deactivate them
 -		LLInventoryModel::cat_array_t	descendent_categories;
 -		LLInventoryModel::item_array_t	descendent_items;
 -		gInventory.collectDescendents( mUUID, descendent_categories, descendent_items, FALSE );
 -		
 -		S32 i;
 -		for (i = 0; i < descendent_items.count(); i++)
 -		{
 -			LLInventoryItem* item = descendent_items[i];
 -			if (item->getType() == LLAssetType::AT_GESTURE
 -				&& LLGestureManager::instance().isGestureActive(item->getUUID()))
 -			{
 -				LLGestureManager::instance().deactivateGesture(item->getUUID());
 -			}
 -		}
 -		
 -		// go ahead and do the normal remove if no 'last calling
 -		// cards' are being removed.
 -		LLViewerInventoryCategory* cat = getCategory();
 -		if(cat)
 -		{
 -			LLInvFVBridge::changeCategoryParent(model, cat, trash_id, TRUE);
 -		}
 -		return TRUE;
 -	}
 -	return FALSE;
 -}
 -
 -void LLFolderBridge::pasteFromClipboard()
 -{
 -	LLInventoryModel* model = getInventoryModel();
 -	if(model && isClipboardPasteable())
 -	{
 -		LLInventoryItem* item = NULL;
 -		LLDynamicArray<LLUUID> objects;
 -		LLInventoryClipboard::instance().retrieve(objects);
 -		S32 count = objects.count();
 -		const LLUUID parent_id(mUUID);
 -		for(S32 i = 0; i < count; i++)
 -		{
 -			item = model->getItem(objects.get(i));
 -			if (item)
 -			{
 -				if(LLInventoryClipboard::instance().isCutMode())
 -				{
 -					// move_inventory_item() is not enough,
 -					//we have to update inventory locally too
 -					changeItemParent(model, dynamic_cast<LLViewerInventoryItem*>(item), parent_id, FALSE);
 -				}
 -				else
 -				{
 -					copy_inventory_item(
 -						gAgent.getID(),
 -						item->getPermissions().getOwner(),
 -						item->getUUID(),
 -						parent_id,
 -						std::string(),
 -						LLPointer<LLInventoryCallback>(NULL));
 -				}
 -			}
 -		}
 -	}
 -}
 -
 -void LLFolderBridge::pasteLinkFromClipboard()
 -{
 -	const LLInventoryModel* model = getInventoryModel();
 -	if(model)
 -	{
 -		LLDynamicArray<LLUUID> objects;
 -		LLInventoryClipboard::instance().retrieve(objects);
 -		S32 count = objects.count();
 -		LLUUID parent_id(mUUID);
 -		for(S32 i = 0; i < count; i++)
 -		{
 -			const LLUUID &object_id = objects.get(i);
 -#if SUPPORT_ENSEMBLES
 -			if (LLInventoryCategory *cat = model->getCategory(object_id))
 -			{
 -				link_inventory_item(
 -					gAgent.getID(),
 -					cat->getUUID(),
 -					parent_id,
 -					cat->getName(),
 -					LLAssetType::AT_LINK_FOLDER,
 -					LLPointer<LLInventoryCallback>(NULL));
 -			}
 -			else
 -#endif
 -			if (LLInventoryItem *item = model->getItem(object_id))
 -			{
 -				link_inventory_item(
 -					gAgent.getID(),
 -					item->getLinkedUUID(),
 -					parent_id,
 -					item->getName(),
 -					LLAssetType::AT_LINK,
 -					LLPointer<LLInventoryCallback>(NULL));
 -			}
 -		}
 -	}
 -}
 -
 -void LLFolderBridge::staticFolderOptionsMenu()
 -{
 -	if (!sSelf) return;
 -	sSelf->folderOptionsMenu();
 -}
 -
 -bool isInOutfitsSidePanel(LLPanel *panel)
 -{
 -	LLInventoryPanel *my_panel = dynamic_cast<LLInventoryPanel*>(panel);
 -	LLPanelOutfitsInventory *outfit_panel =
 -		dynamic_cast<LLPanelOutfitsInventory*>(LLSideTray::getInstance()->getPanel("panel_outfits_inventory"));
 -	if (!outfit_panel)
 -		return false;
 -	return outfit_panel->isAccordionPanel(my_panel);
 -
 -	//LLInventoryPanel *outfit_inv_panel = outfit_panel ? outfit_panel->getActivePanel(): NULL;
 -	//return (my_panel && (my_panel == outfit_inv_panel));
 -}
 -
 -void LLFolderBridge::folderOptionsMenu()
 -{
 -	std::vector<std::string> disabled_items;
 -
 -	LLInventoryModel* model = getInventoryModel();
 -	if(!model) return;
 -
 -	const LLInventoryCategory* category = model->getCategory(mUUID);
 -	LLFolderType::EType type = category->getPreferredType();
 -	const bool is_default_folder = category && LLFolderType::lookupIsProtectedType(type);
 -	// BAP change once we're no longer treating regular categories as ensembles.
 -	const bool is_ensemble = category && (type == LLFolderType::FT_NONE ||
 -										  LLFolderType::lookupIsEnsembleType(type));
 -	const bool is_sidepanel = isInOutfitsSidePanel(mInventoryPanel.get());
 -
 -	// calling card related functionality for folders.
 -
 -	if (is_sidepanel)
 -	{
 -		mItems.clear();
 -	}
 -
 -	// Only enable calling-card related options for non-default folders.
 -	if (!is_sidepanel && !is_default_folder)
 -	{
 -		LLIsType is_callingcard(LLAssetType::AT_CALLINGCARD);
 -		if (mCallingCards || checkFolderForContentsOfType(model, is_callingcard))
 -		{
 -			mItems.push_back(std::string("Calling Card Separator"));
 -			mItems.push_back(std::string("Conference Chat Folder"));
 -			mItems.push_back(std::string("IM All Contacts In Folder"));
 -		}
 -	}
 -
 -	// wearables related functionality for folders.
 -	//is_wearable
 -	LLFindWearables is_wearable;
 -	LLIsType is_object( LLAssetType::AT_OBJECT );
 -	LLIsType is_gesture( LLAssetType::AT_GESTURE );
 -
 -	if (mWearables ||
 -		checkFolderForContentsOfType(model, is_wearable)  ||
 -		checkFolderForContentsOfType(model, is_object) ||
 -		checkFolderForContentsOfType(model, is_gesture) )
 -	{
 -		mItems.push_back(std::string("Folder Wearables Separator"));
 -
 -		// Only enable add/replace outfit for non-default folders.
 -		if (!is_default_folder)
 -		{
 -			mItems.push_back(std::string("Add To Outfit"));
 -			mItems.push_back(std::string("Replace Outfit"));
 -		}
 -		if (is_ensemble)
 -		{
 -			mItems.push_back(std::string("Wear As Ensemble"));
 -		}
 -		mItems.push_back(std::string("Remove From Outfit"));
 -	}
 -	hide_context_entries(*mMenu, mItems, disabled_items);
 -
 -	// Reposition the menu, in case we're adding items to an existing menu.
 -	mMenu->needsArrange();
 -	mMenu->arrangeAndClear();
 -}
 -
 -BOOL LLFolderBridge::checkFolderForContentsOfType(LLInventoryModel* model, LLInventoryCollectFunctor& is_type)
 -{
 -	LLInventoryModel::cat_array_t cat_array;
 -	LLInventoryModel::item_array_t item_array;
 -	model->collectDescendentsIf(mUUID,
 -								cat_array,
 -								item_array,
 -								LLInventoryModel::EXCLUDE_TRASH,
 -								is_type);
 -	return ((item_array.count() > 0) ? TRUE : FALSE );
 -}
 -
 -// Flags unused
 -void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 -{
 -	mItems.clear();
 -	mDisabledItems.clear();
 -
 -	lldebugs << "LLFolderBridge::buildContextMenu()" << llendl;
 -//	std::vector<std::string> disabled_items;
 -	LLInventoryModel* model = getInventoryModel();
 -	if(!model) return;
 -	const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
 -	const LLUUID lost_and_found_id = model->findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);
 -
 -	mItems.clear(); //adding code to clear out member Items (which means Items should not have other data here at this point)
 -	mDisabledItems.clear(); //adding code to clear out disabled members from previous
 -	if (lost_and_found_id == mUUID)
 -	  {
 -		// This is the lost+found folder.
 -		  mItems.push_back(std::string("Empty Lost And Found"));
 -	  }
 -
 -	if(trash_id == mUUID)
 -	{
 -		// This is the trash.
 -		mItems.push_back(std::string("Empty Trash"));
 -	}
 -	else if(model->isObjectDescendentOf(mUUID, trash_id))
 -	{
 -		// This is a folder in the trash.
 -		mItems.clear(); // clear any items that used to exist
 -		mItems.push_back(std::string("Purge Item"));
 -		if (!isItemRemovable())
 -		{
 -			mDisabledItems.push_back(std::string("Purge Item"));
 -		}
 -
 -		mItems.push_back(std::string("Restore Item"));
 -	}
 -	else if(isAgentInventory()) // do not allow creating in library
 -	{
 -		LLViewerInventoryCategory *cat =  getCategory();
 -		// BAP removed protected check to re-enable standard ops in untyped folders.
 -		// Not sure what the right thing is to do here.
 -		if (!isCOFFolder() && cat /*&&
 -			LLAssetType::lookupIsProtectedCategoryType(cat->getPreferredType())*/)
 -		{
 -			// Do not allow to create 2-level subfolder in the Calling Card/Friends folder. EXT-694.
 -			if (!LLFriendCardsManager::instance().isCategoryInFriendFolder(cat))
 -				mItems.push_back(std::string("New Folder"));
 -			mItems.push_back(std::string("New Script"));
 -			mItems.push_back(std::string("New Note"));
 -			mItems.push_back(std::string("New Gesture"));
 -			mItems.push_back(std::string("New Clothes"));
 -			mItems.push_back(std::string("New Body Parts"));
 -			mItems.push_back(std::string("Change Type"));
 -
 -			LLViewerInventoryCategory *cat = getCategory();
 -			if (cat && LLFolderType::lookupIsProtectedType(cat->getPreferredType()))
 -			{
 -				mDisabledItems.push_back(std::string("Change Type"));
 -			}
 -
 -			getClipboardEntries(false, mItems, mDisabledItems, flags);
 -		}
 -		else
 -		{
 -			// Want some but not all of the items from getClipboardEntries for outfits.
 -			if (cat && cat->getPreferredType()==LLFolderType::FT_OUTFIT)
 -			{
 -				mItems.push_back(std::string("Rename"));
 -				mItems.push_back(std::string("Delete"));
 -			}
 -		}
 -
 -		//Added by spatters to force inventory pull on right-click to display folder options correctly. 07-17-06
 -		mCallingCards = mWearables = FALSE;
 -
 -		LLIsType is_callingcard(LLAssetType::AT_CALLINGCARD);
 -		if (checkFolderForContentsOfType(model, is_callingcard))
 -		{
 -			mCallingCards=TRUE;
 -		}
 -
 -		LLFindWearables is_wearable;
 -		LLIsType is_object( LLAssetType::AT_OBJECT );
 -		LLIsType is_gesture( LLAssetType::AT_GESTURE );
 -
 -		if (checkFolderForContentsOfType(model, is_wearable)  ||
 -			checkFolderForContentsOfType(model, is_object) ||
 -			checkFolderForContentsOfType(model, is_gesture) )
 -		{
 -			mWearables=TRUE;
 -		}
 -
 -		mMenu = &menu;
 -		sSelf = this;
 -		LLRightClickInventoryFetchDescendentsObserver* fetch = new LLRightClickInventoryFetchDescendentsObserver(FALSE);
 -
 -		LLInventoryFetchDescendentsObserver::folder_ref_t folders;
 -		LLViewerInventoryCategory* category = (LLViewerInventoryCategory*)model->getCategory(mUUID);
 -		if (category)
 -		{
 -			folders.push_back(category->getUUID());
 -		}
 -		fetch->fetchDescendents(folders);
 -		inc_busy_count();
 -		if(fetch->isEverythingComplete())
 -		{
 -			// everything is already here - call done.
 -			fetch->done();
 -		}
 -		else
 -		{
 -			// it's all on it's way - add an observer, and the inventory
 -			// will call done for us when everything is here.
 -			gInventory.addObserver(fetch);
 -		}
 -	}
 -	else
 -	{
 -		mItems.push_back(std::string("--no options--"));
 -		mDisabledItems.push_back(std::string("--no options--"));
 -	}
 -	hide_context_entries(menu, mItems, mDisabledItems);
 -}
 -
 -BOOL LLFolderBridge::hasChildren() const
 -{
 -	LLInventoryModel* model = getInventoryModel();
 -	if(!model) return FALSE;
 -	LLInventoryModel::EHasChildren has_children;
 -	has_children = gInventory.categoryHasChildren(mUUID);
 -	return has_children != LLInventoryModel::CHILDREN_NO;
 -}
 -
 -BOOL LLFolderBridge::dragOrDrop(MASK mask, BOOL drop,
 -								EDragAndDropType cargo_type,
 -								void* cargo_data)
 -{
 -	//llinfos << "LLFolderBridge::dragOrDrop()" << llendl;
 -	BOOL accept = FALSE;
 -	switch(cargo_type)
 -	{
 -		case DAD_TEXTURE:
 -		case DAD_SOUND:
 -		case DAD_CALLINGCARD:
 -		case DAD_LANDMARK:
 -		case DAD_SCRIPT:
 -		case DAD_OBJECT:
 -		case DAD_NOTECARD:
 -		case DAD_CLOTHING:
 -		case DAD_BODYPART:
 -		case DAD_ANIMATION:
 -		case DAD_GESTURE:
 -		case DAD_LINK:
 -			accept = dragItemIntoFolder((LLInventoryItem*)cargo_data,
 -										drop);
 -			break;
 -		case DAD_CATEGORY:
 -			if (LLFriendCardsManager::instance().isAnyFriendCategory(mUUID))
 -			{
 -				accept = FALSE;
 -			}
 -			else
 -			{
 -				accept = dragCategoryIntoFolder((LLInventoryCategory*)cargo_data, drop);
 -			}
 -			break;
 -		default:
 -			break;
 -	}
 -	return accept;
 -}
 -
 -LLViewerInventoryCategory* LLFolderBridge::getCategory() const
 -{
 -	LLViewerInventoryCategory* cat = NULL;
 -	LLInventoryModel* model = getInventoryModel();
 -	if(model)
 -	{
 -		cat = (LLViewerInventoryCategory*)model->getCategory(mUUID);
 -	}
 -	return cat;
 -}
 -
 -
 -// static
 -void LLFolderBridge::pasteClipboard(void* user_data)
 -{
 -	LLFolderBridge* self = (LLFolderBridge*)user_data;
 -	if(self) self->pasteFromClipboard();
 -}
 -
 -void LLFolderBridge::createNewCategory(void* user_data)
 -{
 -	LLFolderBridge* bridge = (LLFolderBridge*)user_data;
 -	if(!bridge) return;
 -	LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(bridge->mInventoryPanel.get());
 -	if (!panel) return;
 -	LLInventoryModel* model = panel->getModel();
 -	if(!model) return;
 -	LLUUID id;
 -	id = model->createNewCategory(bridge->getUUID(),
 -								  LLFolderType::FT_NONE,
 -								  LLStringUtil::null);
 -	model->notifyObservers();
 -
 -	// At this point, the bridge has probably been deleted, but the
 -	// view is still there.
 -	panel->setSelection(id, TAKE_FOCUS_YES);
 -}
 -
 -void LLFolderBridge::createNewShirt(void* user_data)
 -{
 -	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SHIRT);
 -}
 -
 -void LLFolderBridge::createNewPants(void* user_data)
 -{
 -	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_PANTS);
 -}
 -
 -void LLFolderBridge::createNewShoes(void* user_data)
 -{
 -	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SHOES);
 -}
 -
 -void LLFolderBridge::createNewSocks(void* user_data)
 -{
 -	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SOCKS);
 -}
 -
 -void LLFolderBridge::createNewJacket(void* user_data)
 -{
 -	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_JACKET);
 -}
 -
 -void LLFolderBridge::createNewSkirt(void* user_data)
 -{
 -	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SKIRT);
 -}
 -
 -void LLFolderBridge::createNewGloves(void* user_data)
 -{
 -	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_GLOVES);
 -}
 -
 -void LLFolderBridge::createNewUndershirt(void* user_data)
 -{
 -	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_UNDERSHIRT);
 -}
 -
 -void LLFolderBridge::createNewUnderpants(void* user_data)
 -{
 -	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_UNDERPANTS);
 -}
 -
 -void LLFolderBridge::createNewShape(void* user_data)
 -{
 -	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SHAPE);
 -}
 -
 -void LLFolderBridge::createNewSkin(void* user_data)
 -{
 -	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SKIN);
 -}
 -
 -void LLFolderBridge::createNewHair(void* user_data)
 -{
 -	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_HAIR);
 -}
 -
 -void LLFolderBridge::createNewEyes(void* user_data)
 -{
 -	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_EYES);
 -}
 -
 -// static
 -void LLFolderBridge::createWearable(LLFolderBridge* bridge, EWearableType type)
 -{
 -	if(!bridge) return;
 -	LLUUID parent_id = bridge->getUUID();
 -	createWearable(parent_id, type);
 -}
 -
 -// Separate function so can be called by global menu as well as right-click
 -// menu.
 -// static
 -void LLFolderBridge::createWearable(const LLUUID &parent_id, EWearableType type)
 -{
 -	LLWearable* wearable = LLWearableList::instance().createNewWearable(type);
 -	LLAssetType::EType asset_type = wearable->getAssetType();
 -	LLInventoryType::EType inv_type = LLInventoryType::IT_WEARABLE;
 -	create_inventory_item(gAgent.getID(), gAgent.getSessionID(),
 -		parent_id, wearable->getTransactionID(), wearable->getName(),
 -		wearable->getDescription(), asset_type, inv_type, wearable->getType(),
 -		wearable->getPermissions().getMaskNextOwner(),
 -		LLPointer<LLInventoryCallback>(NULL));
 -}
 -
 -void LLFolderBridge::modifyOutfit(BOOL append)
 -{
 -	LLInventoryModel* model = getInventoryModel();
 -	if(!model) return;
 -	LLViewerInventoryCategory* cat = getCategory();
 -	if(!cat) return;
 -
 -	// BAP - was:
 -	// wear_inventory_category_on_avatar( cat, append );
 -	LLAppearanceManager::instance().wearInventoryCategory( cat, FALSE, append );
 -}
 -
 -// helper stuff
 -bool move_task_inventory_callback(const LLSD& notification, const LLSD& response, LLMoveInv* move_inv)
 -{
 -	LLFloaterOpenObject::LLCatAndWear* cat_and_wear = (LLFloaterOpenObject::LLCatAndWear* )move_inv->mUserData;
 -	LLViewerObject* object = gObjectList.findObject(move_inv->mObjectID);
 -	S32 option = LLNotification::getSelectedOption(notification, response);
 -
 -	if(option == 0 && object)
 -	{
 -		if (cat_and_wear && cat_and_wear->mWear)
 -		{
 -			InventoryObjectList inventory_objects;
 -			object->getInventoryContents(inventory_objects);
 -			int contents_count = inventory_objects.size()-1; //subtract one for containing folder
 -
 -			LLInventoryCopyAndWearObserver* inventoryObserver = new LLInventoryCopyAndWearObserver(cat_and_wear->mCatID, contents_count);
 -			gInventory.addObserver(inventoryObserver);
 -		}
 -
 -		two_uuids_list_t::iterator move_it;
 -		for (move_it = move_inv->mMoveList.begin();
 -			move_it != move_inv->mMoveList.end();
 -			++move_it)
 -		{
 -			object->moveInventory(move_it->first, move_it->second);
 -		}
 -
 -		// update the UI.
 -		dialog_refresh_all();
 -	}
 -
 -	if (move_inv->mCallback)
 -	{
 -		move_inv->mCallback(option, move_inv->mUserData);
 -	}
 -
 -	delete move_inv;
 -	return false;
 -}
 -
 -/*
 -Next functions intended to reorder items in the inventory folder and save order on server
 -Is now used for Favorites folder.
 -
 -*TODO: refactoring is needed with Favorites Bar functionality. Probably should be moved in LLInventoryModel
 -*/
 -void saveItemsOrder(LLInventoryModel::item_array_t& items)
 -{
 -	int sortField = 0;
 -
 -	// current order is saved by setting incremental values (1, 2, 3, ...) for the sort field
 -	for (LLInventoryModel::item_array_t::iterator i = items.begin(); i != items.end(); ++i)
 -	{
 -		LLViewerInventoryItem* item = *i;
 -
 -		item->setSortField(++sortField);
 -		item->setComplete(TRUE);
 -		item->updateServer(FALSE);
 -
 -		gInventory.updateItem(item);
 -	}
 -
 -	gInventory.notifyObservers();
 -}
 -
 -LLInventoryModel::item_array_t::iterator findItemByUUID(LLInventoryModel::item_array_t& items, const LLUUID& id)
 -{
 -	LLInventoryModel::item_array_t::iterator result = items.end();
 -
 -	for (LLInventoryModel::item_array_t::iterator i = items.begin(); i != items.end(); ++i)
 -	{
 -		if ((*i)->getUUID() == id)
 -		{
 -			result = i;
 -			break;
 -		}
 -	}
 -
 -	return result;
 -}
 -
 -void updateItemsOrder(LLInventoryModel::item_array_t& items, const LLUUID& srcItemId, const LLUUID& destItemId)
 -{
 -	LLViewerInventoryItem* srcItem = gInventory.getItem(srcItemId);
 -	LLViewerInventoryItem* destItem = gInventory.getItem(destItemId);
 -
 -	items.erase(findItemByUUID(items, srcItem->getUUID()));
 -	items.insert(findItemByUUID(items, destItem->getUUID()), srcItem);
 -}
 -
 -BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
 -										BOOL drop)
 -{
 -	LLInventoryModel* model = getInventoryModel();
 -	if(!model || !inv_item) return FALSE;
 -
 -	// cannot drag into library
 -	if(!isAgentInventory())
 -	{
 -		return FALSE;
 -	}
 -
 -	LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
 -	if(!avatar) return FALSE;
 -
 -	LLToolDragAndDrop::ESource source = LLToolDragAndDrop::getInstance()->getSource();
 -	BOOL accept = FALSE;
 -	LLViewerObject* object = NULL;
 -	if(LLToolDragAndDrop::SOURCE_AGENT == source)
 -	{
 -
 -		BOOL is_movable = TRUE;
 -		switch( inv_item->getActualType() )
 -		{
 -		case LLAssetType::AT_CATEGORY:
 -			is_movable = !LLFolderType::lookupIsProtectedType(((LLInventoryCategory*)inv_item)->getPreferredType());
 -			break;
 -		default:
 -			break;
 -		}
 -
 -		const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
 -		BOOL move_is_into_trash = (mUUID == trash_id) || model->isObjectDescendentOf(mUUID, trash_id);
 -		const LLUUID current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
 -		BOOL move_is_into_current_outfit = (mUUID == current_outfit_id);
 -		BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT);
 -
 -		if(is_movable && move_is_into_trash)
 -		{
 -			switch(inv_item->getType())
 -			{
 -			case LLAssetType::AT_CLOTHING:
 -			case LLAssetType::AT_BODYPART:
 -				is_movable = !gAgentWearables.isWearingItem(inv_item->getUUID());
 -				break;
 -
 -			case LLAssetType::AT_OBJECT:
 -				is_movable = !avatar->isWearingAttachment(inv_item->getUUID());
 -				break;
 -			default:
 -				break;
 -			}
 -		}
 -
 -		if ( is_movable )
 -		{
 -			// Don't allow creating duplicates in the Calling Card/Friends
 -			// subfolders, see bug EXT-1599. Check is item direct descendent
 -			// of target folder and forbid item's movement if it so.
 -			// Note: isItemDirectDescendentOfCategory checks if
 -			// passed category is in the Calling Card/Friends folder
 -			is_movable = ! LLFriendCardsManager::instance()
 -				.isObjDirectDescendentOfCategory (inv_item, getCategory());
 -		}
 -
 -		const LLUUID& favorites_id = model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
 -		const LLUUID& landmarks_id = model->findCategoryUUIDForType(LLFolderType::FT_LANDMARK);
 -		const BOOL folder_allows_reorder = ((mUUID == landmarks_id) || (mUUID == favorites_id));
 -	   
 -		// we can move item inside a folder only if this folder is Favorites. See EXT-719
 -		accept = is_movable && ((mUUID != inv_item->getParentUUID()) || folder_allows_reorder);
 -		if(accept && drop)
 -		{
 -			if (inv_item->getType() == LLAssetType::AT_GESTURE
 -				&& LLGestureManager::instance().isGestureActive(inv_item->getUUID()) && move_is_into_trash)
 -			{
 -				LLGestureManager::instance().deactivateGesture(inv_item->getUUID());
 -			}
 -			// If an item is being dragged between windows, unselect
 -			// everything in the active window so that we don't follow
 -			// the selection to its new location (which is very
 -			// annoying).
 -			if (LLFloaterInventory::getActiveInventory())
 -			{
 -				LLInventoryPanel* active_panel = LLFloaterInventory::getActiveInventory()->getPanel();
 -				LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get());
 -				if (active_panel && (panel != active_panel))
 -				{
 -					active_panel->unSelectAll();
 -				}
 -			}
 -
 -			// if dragging from/into favorites folder only reorder items
 -			if ((mUUID == inv_item->getParentUUID()) && folder_allows_reorder)
 -			{
 -				LLInventoryModel::cat_array_t cats;
 -				LLInventoryModel::item_array_t items;
 -				LLIsType is_type(LLAssetType::AT_LANDMARK);
 -				model->collectDescendentsIf(mUUID, cats, items, LLInventoryModel::EXCLUDE_TRASH, is_type);
 -
 -				LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get());
 -				LLFolderViewItem* itemp = panel ? panel->getRootFolder()->getDraggingOverItem() : NULL;
 -				if (itemp)
 -				{
 -					LLUUID srcItemId = inv_item->getUUID();
 -					LLUUID destItemId = itemp->getListener()->getUUID();
 -
 -					// update order
 -					updateItemsOrder(items, srcItemId, destItemId);
 -
 -					saveItemsOrder(items);
 -				}
 -			}
 -			else if (favorites_id == mUUID) // if target is the favorites folder we use copy
 -			{
 -				copy_inventory_item(
 -					gAgent.getID(),
 -					inv_item->getPermissions().getOwner(),
 -					inv_item->getUUID(),
 -					mUUID,
 -					std::string(),
 -					LLPointer<LLInventoryCallback>(NULL));
 -			}
 -			else if (move_is_into_current_outfit || move_is_into_outfit)
 -			{
 -				// BAP - should skip if dup.
 -				if (move_is_into_current_outfit)
 -				{
 -					LLAppearanceManager::instance().addCOFItemLink(inv_item);
 -				}
 -				else
 -				{
 -					LLPointer<LLInventoryCallback> cb = NULL;
 -					link_inventory_item(
 -						gAgent.getID(),
 -						inv_item->getLinkedUUID(),
 -						mUUID,
 -						inv_item->getName(),
 -						LLAssetType::AT_LINK,
 -						cb);
 -				}
 -			}
 -			else
 -			{
 -				// restamp if the move is into the trash.
 -				LLInvFVBridge::changeItemParent(
 -					model,
 -					(LLViewerInventoryItem*)inv_item,
 -					mUUID,
 -					move_is_into_trash);
 -			}
 -		}
 -	}
 -	else if(LLToolDragAndDrop::SOURCE_WORLD == source)
 -	{
 -		// Make sure the object exists. If we allowed dragging from
 -		// anonymous objects, it would be possible to bypass
 -		// permissions.
 -		object = gObjectList.findObject(inv_item->getParentUUID());
 -		if(!object)
 -		{
 -			llinfos << "Object not found for drop." << llendl;
 -			return FALSE;
 -		}
 -
 -		// coming from a task. Need to figure out if the person can
 -		// move/copy this item.
 -		LLPermissions perm(inv_item->getPermissions());
 -		BOOL is_move = FALSE;
 -		if((perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID())
 -			&& perm.allowTransferTo(gAgent.getID())))
 -//		   || gAgent.isGodlike())
 -
 -		{
 -			accept = TRUE;
 -		}
 -		else if(object->permYouOwner())
 -		{
 -			// If the object cannot be copied, but the object the
 -			// inventory is owned by the agent, then the item can be
 -			// moved from the task to agent inventory.
 -			is_move = TRUE;
 -			accept = TRUE;
 -		}
 -		if(drop && accept)
 -		{
 -			LLMoveInv* move_inv = new LLMoveInv;
 -			move_inv->mObjectID = inv_item->getParentUUID();
 -			two_uuids_t item_pair(mUUID, inv_item->getUUID());
 -			move_inv->mMoveList.push_back(item_pair);
 -			move_inv->mCallback = NULL;
 -			move_inv->mUserData = NULL;
 -			if(is_move)
 -			{
 -				warn_move_inventory(object, move_inv);
 -			}
 -			else
 -			{
 -				LLNotification::Params params("MoveInventoryFromObject");
 -				params.functor.function(boost::bind(move_task_inventory_callback, _1, _2, move_inv));
 -				LLNotifications::instance().forceResponse(params, 0);
 -			}
 -		}
 -
 -	}
 -	else if(LLToolDragAndDrop::SOURCE_NOTECARD == source)
 -	{
 -		accept = TRUE;
 -		if(drop)
 -		{
 -			copy_inventory_from_notecard(LLToolDragAndDrop::getInstance()->getObjectID(),
 -				LLToolDragAndDrop::getInstance()->getSourceID(), inv_item);
 -		}
 -	}
 -	else if(LLToolDragAndDrop::SOURCE_LIBRARY == source)
 -	{
 -		LLViewerInventoryItem* item = (LLViewerInventoryItem*)inv_item;
 -		if(item && item->isComplete())
 -		{
 -			accept = TRUE;
 -			if(drop)
 -			{
 -				copy_inventory_item(
 -					gAgent.getID(),
 -					inv_item->getPermissions().getOwner(),
 -					inv_item->getUUID(),
 -					mUUID,
 -					std::string(),
 -					LLPointer<LLInventoryCallback>(NULL));
 -			}
 -		}
 -	}
 -	else
 -	{
 -		llwarns << "unhandled drag source" << llendl;
 -	}
 -	return accept;
 -}
 -
 -// +=================================================+
 -// |        LLScriptBridge (DEPRECTED)               |
 -// +=================================================+
 -
 -LLUIImagePtr LLScriptBridge::getIcon() const
 -{
 -	return get_item_icon(LLAssetType::AT_SCRIPT, LLInventoryType::IT_LSL, 0, FALSE);
 -}
 -
 -// +=================================================+
 -// |        LLTextureBridge                          |
 -// +=================================================+
 -
 -LLUIImagePtr LLTextureBridge::getIcon() const
 -{
 -	return get_item_icon(LLAssetType::AT_TEXTURE, mInvType, 0, FALSE);
 -}
 -
 -void LLTextureBridge::openItem()
 -{
 -	LLViewerInventoryItem* item = getItem();
 -
 -	if (item)
 -	{
 -		LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
 -	}
 -}
 -
 -void LLTextureBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 -{
 -	lldebugs << "LLTextureBridge::buildContextMenu()" << llendl;
 -	std::vector<std::string> items;
 -	std::vector<std::string> disabled_items;
 -	if(isInTrash())
 -	{
 -		items.push_back(std::string("Purge Item"));
 -		if (!isItemRemovable())
 -		{
 -			disabled_items.push_back(std::string("Purge Item"));
 -		}
 -
 -		items.push_back(std::string("Restore Item"));
 -	}
 -	else
 -	{
 -		items.push_back(std::string("Open"));
 -		items.push_back(std::string("Properties"));
 -
 -		getClipboardEntries(true, items, disabled_items, flags);
 -
 -		items.push_back(std::string("Texture Separator"));
 -		items.push_back(std::string("Save As"));
 -	}
 -	hide_context_entries(menu, items, disabled_items);	
 -}
 -
 -// virtual
 -void LLTextureBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
 -{
 -	if ("save_as" == action)
 -	{
 -		LLFloaterReg::showInstance("preview_texture", LLSD(mUUID), TAKE_FOCUS_YES);
 -		LLPreviewTexture* preview_texture = LLFloaterReg::findTypedInstance<LLPreviewTexture>("preview_texture", mUUID);
 -		if (preview_texture)
 -		{
 -			preview_texture->openToSave();
 -		}
 -	}
 -	else LLItemBridge::performAction(folder, model, action);
 -}
 -
 -// +=================================================+
 -// |        LLSoundBridge                            |
 -// +=================================================+
 -
 -LLUIImagePtr LLSoundBridge::getIcon() const
 -{
 -	return get_item_icon(LLAssetType::AT_SOUND, LLInventoryType::IT_SOUND, 0, FALSE);
 -}
 -
 -void LLSoundBridge::openItem()
 -{
 -	LLViewerInventoryItem* item = getItem();
 -
 -	if (item)
 -	{
 -		LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
 -	}
 -/*
 -// Changed this back to the way it USED to work:
 -// only open the preview dialog through the contextual right-click menu
 -// double-click just plays the sound
 -
 -	LLViewerInventoryItem* item = getItem();
 -	if(item)
 -	{
 -		openSoundPreview((void*)this);
 -		//send_uuid_sound_trigger(item->getAssetUUID(), 1.0);
 -	}
 -*/
 -}
 -
 -void LLSoundBridge::previewItem()
 -{
 -	LLViewerInventoryItem* item = getItem();
 -	if(item)
 -	{
 -		send_sound_trigger(item->getAssetUUID(), 1.0);
 -	}
 -}
 -
 -void LLSoundBridge::openSoundPreview(void* which)
 -{
 -	LLSoundBridge *me = (LLSoundBridge *)which;
 -	LLFloaterReg::showInstance("preview_sound", LLSD(me->mUUID), TAKE_FOCUS_YES);
 -}
 -
 -void LLSoundBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 -{
 -	lldebugs << "LLSoundBridge::buildContextMenu()" << llendl;
 -	std::vector<std::string> items;
 -	std::vector<std::string> disabled_items;
 -
 -	if(isInTrash())
 -	{
 -		items.push_back(std::string("Purge Item"));
 -		if (!isItemRemovable())
 -		{
 -			disabled_items.push_back(std::string("Purge Item"));
 -		}
 -
 -		items.push_back(std::string("Restore Item"));
 -	}
 -	else
 -	{
 -		items.push_back(std::string("Sound Open"));
 -		items.push_back(std::string("Properties"));
 -
 -		getClipboardEntries(true, items, disabled_items, flags);
 -	}
 -
 -	items.push_back(std::string("Sound Separator"));
 -	items.push_back(std::string("Sound Play"));
 -
 -	hide_context_entries(menu, items, disabled_items);
 -}
 -
 -// +=================================================+
 -// |        LLLandmarkBridge                         |
 -// +=================================================+
 -
 -LLLandmarkBridge::LLLandmarkBridge(LLInventoryPanel* inventory, const LLUUID& uuid, U32 flags/* = 0x00*/) :
 -LLItemBridge(inventory, uuid)
 -{
 -	mVisited = FALSE;
 -	if (flags & LLInventoryItem::II_FLAGS_LANDMARK_VISITED)
 -	{
 -		mVisited = TRUE;
 -	}
 -}
 -
 -LLUIImagePtr LLLandmarkBridge::getIcon() const
 -{
 -	return get_item_icon(LLAssetType::AT_LANDMARK, LLInventoryType::IT_LANDMARK, mVisited, FALSE);
 -}
 -
 -void LLLandmarkBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 -{
 -	std::vector<std::string> items;
 -	std::vector<std::string> disabled_items;
 -
 -	lldebugs << "LLLandmarkBridge::buildContextMenu()" << llendl;
 -	if(isInTrash())
 -	{
 -		items.push_back(std::string("Purge Item"));
 -		if (!isItemRemovable())
 -		{
 -			disabled_items.push_back(std::string("Purge Item"));
 -		}
 -
 -		items.push_back(std::string("Restore Item"));
 -	}
 -	else
 -	{
 -		items.push_back(std::string("Landmark Open"));
 -		items.push_back(std::string("Properties"));
 -
 -		getClipboardEntries(true, items, disabled_items, flags);
 -	}
 -
 -	items.push_back(std::string("Landmark Separator"));
 -	items.push_back(std::string("About Landmark"));
 -
 -	// Disable "About Landmark" menu item for
 -	// multiple landmarks selected. Only one landmark
 -	// info panel can be shown at a time.
 -	if ((flags & FIRST_SELECTED_ITEM) == 0)
 -	{
 -		disabled_items.push_back(std::string("About Landmark"));
 -	}
 -
 -	hide_context_entries(menu, items, disabled_items);
 -}
 -
 -// Convenience function for the two functions below.
 -void teleport_via_landmark(const LLUUID& asset_id)
 -{
 -	gAgent.teleportViaLandmark( asset_id );
 -
 -	// we now automatically track the landmark you're teleporting to
 -	// because you'll probably arrive at a telehub instead
 -	LLFloaterWorldMap* floater_world_map = LLFloaterWorldMap::getInstance();
 -	if( floater_world_map )
 -	{
 -		floater_world_map->trackLandmark( asset_id );
 -	}
 -}
 -
 -// virtual
 -void LLLandmarkBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
 -{
 -	if ("teleport" == action)
 -	{
 -		LLViewerInventoryItem* item = getItem();
 -		if(item)
 -		{
 -			teleport_via_landmark(item->getAssetUUID());
 -		}
 -	}
 -	else if ("about" == action)
 -	{
 -		LLViewerInventoryItem* item = getItem();
 -		if(item)
 -		{
 -			LLSD key;
 -			key["type"] = "landmark";
 -			key["id"] = item->getUUID();
 -
 -			LLSideTray::getInstance()->showPanel("panel_places", key);
 -		}
 -	}
 -	else
 -	{
 -		LLItemBridge::performAction(folder, model, action);
 -	}
 -}
 -
 -static bool open_landmark_callback(const LLSD& notification, const LLSD& response)
 -{
 -	S32 option = LLNotification::getSelectedOption(notification, response);
 -
 -	LLUUID asset_id = notification["payload"]["asset_id"].asUUID();
 -	if (option == 0)
 -	{
 -		teleport_via_landmark(asset_id);
 -	}
 -
 -	return false;
 -}
 -static LLNotificationFunctorRegistration open_landmark_callback_reg("TeleportFromLandmark", open_landmark_callback);
 -
 -
 -void LLLandmarkBridge::openItem()
 -{
 -	LLViewerInventoryItem* item = getItem();
 -
 -	if (item)
 -	{
 -		LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
 -	}
 -/*
 -	LLViewerInventoryItem* item = getItem();
 -	if( item )
 -	{
 -		// Opening (double-clicking) a landmark immediately teleports,
 -		// but warns you the first time.
 -		// open_landmark(item);
 -		LLSD payload;
 -		payload["asset_id"] = item->getAssetUUID();
 -		LLNotifications::instance().add("TeleportFromLandmark", LLSD(), payload);
 -	}
 -*/
 -}
 -
 -
 -// +=================================================+
 -// |        LLCallingCardObserver                    |
 -// +=================================================+
 -void LLCallingCardObserver::changed(U32 mask)
 -{
 -	mBridgep->refreshFolderViewItem();
 -}
 -
 -// +=================================================+
 -// |        LLCallingCardBridge                      |
 -// +=================================================+
 -
 -LLCallingCardBridge::LLCallingCardBridge( LLInventoryPanel* inventory, const LLUUID& uuid ) :
 -	LLItemBridge(inventory, uuid)
 -{
 -	mObserver = new LLCallingCardObserver(this);
 -	LLAvatarTracker::instance().addObserver(mObserver);
 -}
 -
 -LLCallingCardBridge::~LLCallingCardBridge()
 -{
 -	LLAvatarTracker::instance().removeObserver(mObserver);
 -	delete mObserver;
 -}
 -
 -void LLCallingCardBridge::refreshFolderViewItem()
 -{
 -	LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get());
 -	LLFolderViewItem* itemp = panel ? panel->getRootFolder()->getItemByID(mUUID) : NULL;
 -	if (itemp)
 -	{
 -		itemp->refresh();
 -	}
 -}
 -
 -// virtual
 -void LLCallingCardBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
 -{
 -	if ("begin_im" == action)
 -	{
 -		LLViewerInventoryItem *item = getItem();
 -		if (item && (item->getCreatorUUID() != gAgent.getID()) &&
 -			(!item->getCreatorUUID().isNull()))
 -		{
 -			std::string callingcard_name;
 -			gCacheName->getFullName(item->getCreatorUUID(), callingcard_name);
 -			LLUUID session_id = gIMMgr->addSession(callingcard_name, IM_NOTHING_SPECIAL, item->getCreatorUUID());
 -			if (session_id != LLUUID::null)
 -			{
 -				LLIMFloater::show(session_id);
 -			}
 -		}
 -	}
 -	else if ("lure" == action)
 -	{
 -		LLViewerInventoryItem *item = getItem();
 -		if (item && (item->getCreatorUUID() != gAgent.getID()) &&
 -			(!item->getCreatorUUID().isNull()))
 -		{
 -			LLAvatarActions::offerTeleport(item->getCreatorUUID());
 -		}
 -	}
 -	else LLItemBridge::performAction(folder, model, action);
 -}
 -
 -LLUIImagePtr LLCallingCardBridge::getIcon() const
 -{
 -	BOOL online = FALSE;
 -	LLViewerInventoryItem* item = getItem();
 -	if(item)
 -	{
 -		online = LLAvatarTracker::instance().isBuddyOnline(item->getCreatorUUID());
 -	}
 -	return get_item_icon(LLAssetType::AT_CALLINGCARD, LLInventoryType::IT_CALLINGCARD, online, FALSE);
 -}
 -
 -std::string LLCallingCardBridge::getLabelSuffix() const
 -{
 -	LLViewerInventoryItem* item = getItem();
 -	if( item && LLAvatarTracker::instance().isBuddyOnline(item->getCreatorUUID()) )
 -	{
 -		return LLItemBridge::getLabelSuffix() + " (online)";
 -	}
 -	else
 -	{
 -		return LLItemBridge::getLabelSuffix();
 -	}
 -}
 -
 -void LLCallingCardBridge::openItem()
 -{
 -	LLViewerInventoryItem* item = getItem();
 -
 -	if (item)
 -	{
 -		LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
 -	}
 -/*
 -	LLViewerInventoryItem* item = getItem();
 -	if(item && !item->getCreatorUUID().isNull())
 -	{
 -		LLAvatarActions::showProfile(item->getCreatorUUID());
 -	}
 -*/
 -}
 -
 -void LLCallingCardBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 -{
 -	lldebugs << "LLCallingCardBridge::buildContextMenu()" << llendl;
 -	std::vector<std::string> items;
 -	std::vector<std::string> disabled_items;
 -
 -	if(isInTrash())
 -	{
 -		items.push_back(std::string("Purge Item"));
 -		if (!isItemRemovable())
 -		{
 -			disabled_items.push_back(std::string("Purge Item"));
 -		}
 -
 -		items.push_back(std::string("Restore Item"));
 -	}
 -	else
 -	{
 -		items.push_back(std::string("Open"));
 -		items.push_back(std::string("Properties"));
 -
 -		getClipboardEntries(true, items, disabled_items, flags);
 -
 -		LLInventoryItem* item = getItem();
 -		BOOL good_card = (item
 -						  && (LLUUID::null != item->getCreatorUUID())
 -						  && (item->getCreatorUUID() != gAgent.getID()));
 -		BOOL user_online = (LLAvatarTracker::instance().isBuddyOnline(item->getCreatorUUID()));
 -		items.push_back(std::string("Send Instant Message Separator"));
 -		items.push_back(std::string("Send Instant Message"));
 -		items.push_back(std::string("Offer Teleport..."));
 -		items.push_back(std::string("Conference Chat"));
 -
 -		if (!good_card)
 -		{
 -			disabled_items.push_back(std::string("Send Instant Message"));
 -		}
 -		if (!good_card || !user_online)
 -		{
 -			disabled_items.push_back(std::string("Offer Teleport..."));
 -			disabled_items.push_back(std::string("Conference Chat"));
 -		}
 -	}
 -	hide_context_entries(menu, items, disabled_items);
 -}
 -
 -BOOL LLCallingCardBridge::dragOrDrop(MASK mask, BOOL drop,
 -									 EDragAndDropType cargo_type,
 -									 void* cargo_data)
 -{
 -	LLViewerInventoryItem* item = getItem();
 -	BOOL rv = FALSE;
 -	if(item)
 -	{
 -		// check the type
 -		switch(cargo_type)
 -		{
 -		case DAD_TEXTURE:
 -		case DAD_SOUND:
 -		case DAD_LANDMARK:
 -		case DAD_SCRIPT:
 -		case DAD_CLOTHING:
 -		case DAD_OBJECT:
 -		case DAD_NOTECARD:
 -		case DAD_BODYPART:
 -		case DAD_ANIMATION:
 -		case DAD_GESTURE:
 -			{
 -				LLInventoryItem* inv_item = (LLInventoryItem*)cargo_data;
 -				const LLPermissions& perm = inv_item->getPermissions();
 -				if(gInventory.getItem(inv_item->getUUID())
 -				   && perm.allowOperationBy(PERM_TRANSFER, gAgent.getID()))
 -				{
 -					rv = TRUE;
 -					if(drop)
 -					{
 -						LLToolDragAndDrop::giveInventory(item->getCreatorUUID(),
 -														 (LLInventoryItem*)cargo_data);
 -					}
 -				}
 -				else
 -				{
 -					// It's not in the user's inventory (it's probably in
 -					// an object's contents), so disallow dragging it here.
 -					// You can't give something you don't yet have.
 -					rv = FALSE;
 -				}
 -				break;
 -			}
 -		case DAD_CATEGORY:
 -			{
 -				LLInventoryCategory* inv_cat = (LLInventoryCategory*)cargo_data;
 -				if( gInventory.getCategory( inv_cat->getUUID() ) )
 -				{
 -					rv = TRUE;
 -					if(drop)
 -					{
 -						LLToolDragAndDrop::giveInventoryCategory(
 -							item->getCreatorUUID(),
 -							inv_cat);
 -					}
 -				}
 -				else
 -				{
 -					// It's not in the user's inventory (it's probably in
 -					// an object's contents), so disallow dragging it here.
 -					// You can't give something you don't yet have.
 -					rv = FALSE;
 -				}
 -				break;
 -			}
 -		default:
 -			break;
 -		}
 -	}
 -	return rv;
 -}
 -
 -BOOL LLCallingCardBridge::removeItem()
 -{
 -	if (LLFriendCardsManager::instance().isItemInAnyFriendsList(getItem()))
 -	{
 -		LLAvatarActions::removeFriendDialog(getItem()->getCreatorUUID());
 -		return FALSE;
 -	}
 -	else
 -	{
 -		return LLItemBridge::removeItem();
 -	}
 -}
 -// +=================================================+
 -// |        LLNotecardBridge                         |
 -// +=================================================+
 -
 -LLUIImagePtr LLNotecardBridge::getIcon() const
 -{
 -	return get_item_icon(LLAssetType::AT_NOTECARD, LLInventoryType::IT_NOTECARD, 0, FALSE);
 -}
 -
 -void LLNotecardBridge::openItem()
 -{
 -	LLViewerInventoryItem* item = getItem();
 -
 -	if (item)
 -	{
 -		LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
 -	}
 -
 -/*
 -	LLViewerInventoryItem* item = getItem();
 -	if (item)
 -	{
 -		LLFloaterReg::showInstance("preview_notecard", LLSD(item->getUUID()), TAKE_FOCUS_YES);
 -	}
 -*/
 -}
 -
 -
 -// +=================================================+
 -// |        LLGestureBridge                          |
 -// +=================================================+
 -
 -LLUIImagePtr LLGestureBridge::getIcon() const
 -{
 -	return get_item_icon(LLAssetType::AT_GESTURE, LLInventoryType::IT_GESTURE, 0, FALSE);
 -}
 -
 -LLFontGL::StyleFlags LLGestureBridge::getLabelStyle() const
 -{
 -	if( LLGestureManager::instance().isGestureActive(mUUID) )
 -	{
 -		return LLFontGL::BOLD;
 -	}
 -	else
 -	{
 -		return LLFontGL::NORMAL;
 -	}
 -}
 -
 -std::string LLGestureBridge::getLabelSuffix() const
 -{
 -	if( LLGestureManager::instance().isGestureActive(mUUID) )
 -	{
 -		return LLItemBridge::getLabelSuffix() + " (active)";
 -	}
 -	else
 -	{
 -		return LLItemBridge::getLabelSuffix();
 -	}
 -}
 -
 -// virtual
 -void LLGestureBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
 -{
 -	if ("activate" == action)
 -	{
 -		LLGestureManager::instance().activateGesture(mUUID);
 -
 -		LLViewerInventoryItem* item = gInventory.getItem(mUUID);
 -		if (!item) return;
 -
 -		// Since we just changed the suffix to indicate (active)
 -		// the server doesn't need to know, just the viewer.
 -		gInventory.updateItem(item);
 -		gInventory.notifyObservers();
 -	}
 -	else if ("deactivate" == action)
 -	{
 -		LLGestureManager::instance().deactivateGesture(mUUID);
 -
 -		LLViewerInventoryItem* item = gInventory.getItem(mUUID);
 -		if (!item) return;
 -
 -		// Since we just changed the suffix to indicate (active)
 -		// the server doesn't need to know, just the viewer.
 -		gInventory.updateItem(item);
 -		gInventory.notifyObservers();
 -	}
 -	else LLItemBridge::performAction(folder, model, action);
 -}
 -
 -void LLGestureBridge::openItem()
 -{
 -	LLViewerInventoryItem* item = getItem();
 -
 -	if (item)
 -	{
 -		LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
 -	}
 -/*
 -	LLViewerInventoryItem* item = getItem();
 -	if (item)
 -	{
 -		LLPreviewGesture* preview = LLPreviewGesture::show(mUUID, LLUUID::null);
 -		preview->setFocus(TRUE);
 -	}
 -*/
 -}
 -
 -BOOL LLGestureBridge::removeItem()
 -{
 -	// Force close the preview window, if it exists
 -	LLGestureManager::instance().deactivateGesture(mUUID);
 -	return LLItemBridge::removeItem();
 -}
 -
 -void LLGestureBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 -{
 -	lldebugs << "LLGestureBridge::buildContextMenu()" << llendl;
 -	std::vector<std::string> items;
 -	std::vector<std::string> disabled_items;
 -	if(isInTrash())
 -	{
 -		items.push_back(std::string("Purge Item"));
 -		if (!isItemRemovable())
 -		{
 -			disabled_items.push_back(std::string("Purge Item"));
 -		}
 -
 -		items.push_back(std::string("Restore Item"));
 -	}
 -	else
 -	{
 -		items.push_back(std::string("Open"));
 -		items.push_back(std::string("Properties"));
 -
 -		getClipboardEntries(true, items, disabled_items, flags);
 -
 -		items.push_back(std::string("Gesture Separator"));
 -		items.push_back(std::string("Activate"));
 -		items.push_back(std::string("Deactivate"));
 -	}
 -	hide_context_entries(menu, items, disabled_items);
 -}
 -
 -// +=================================================+
 -// |        LLAnimationBridge                        |
 -// +=================================================+
 -
 -LLUIImagePtr LLAnimationBridge::getIcon() const
 -{
 -	return get_item_icon(LLAssetType::AT_ANIMATION, LLInventoryType::IT_ANIMATION, 0, FALSE);
 -}
 -
 -void LLAnimationBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 -{
 -	std::vector<std::string> items;
 -	std::vector<std::string> disabled_items;
 -
 -	lldebugs << "LLAnimationBridge::buildContextMenu()" << llendl;
 -	if(isInTrash())
 -	{
 -		items.push_back(std::string("Purge Item"));
 -		if (!isItemRemovable())
 -		{
 -			disabled_items.push_back(std::string("Purge Item"));
 -		}
 -
 -		items.push_back(std::string("Restore Item"));
 -	}
 -	else
 -	{
 -		items.push_back(std::string("Animation Open"));
 -		items.push_back(std::string("Properties"));
 -
 -		getClipboardEntries(true, items, disabled_items, flags);
 -	}
 -
 -	items.push_back(std::string("Animation Separator"));
 -	items.push_back(std::string("Animation Play"));
 -	items.push_back(std::string("Animation Audition"));
 -
 -	hide_context_entries(menu, items, disabled_items);
 -
 -}
 -
 -// virtual
 -void LLAnimationBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
 -{
 -	if ((action == "playworld") || (action == "playlocal"))
 -	{
 -		if (getItem())
 -		{
 -			LLPreviewAnim::e_activation_type activate = LLPreviewAnim::NONE;
 -			if ("playworld" == action) activate = LLPreviewAnim::PLAY;
 -			if ("playlocal" == action) activate = LLPreviewAnim::AUDITION;
 -
 -			LLPreviewAnim* preview = LLFloaterReg::showTypedInstance<LLPreviewAnim>("preview_anim", LLSD(mUUID));
 -			if (preview)
 -			{
 -				preview->activate(activate);
 -			}
 -		}
 -	}
 -	else
 -	{
 -		LLItemBridge::performAction(folder, model, action);
 -	}
 -}
 -
 -void LLAnimationBridge::openItem()
 -{
 -	LLViewerInventoryItem* item = getItem();
 -
 -	if (item)
 -	{
 -		LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
 -	}
 -/*
 -	LLViewerInventoryItem* item = getItem();
 -	if (item)
 -	{
 -		LLFloaterReg::showInstance("preview_anim", LLSD(mUUID), TAKE_FOCUS_YES);
 -	}
 -*/
 -}
 -
 -// +=================================================+
 -// |        LLObjectBridge                           |
 -// +=================================================+
 -
 -// static
 -LLUUID LLObjectBridge::sContextMenuItemID;
 -
 -LLObjectBridge::LLObjectBridge(LLInventoryPanel* inventory, const LLUUID& uuid, LLInventoryType::EType type, U32 flags) :
 -LLItemBridge(inventory, uuid), mInvType(type)
 -{
 -	mAttachPt = (flags & 0xff); // low bye of inventory flags
 -
 -	mIsMultiObject = ( flags & LLInventoryItem::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS ) ?  TRUE: FALSE;
 -}
 -
 -LLUIImagePtr LLObjectBridge::getIcon() const
 -{
 -	return get_item_icon(LLAssetType::AT_OBJECT, mInvType, mAttachPt, mIsMultiObject );
 -}
 -
 -LLInventoryObject* LLObjectBridge::getObject() const
 -{
 -	LLInventoryObject* object = NULL;
 -	LLInventoryModel* model = getInventoryModel();
 -	if(model)
 -	{
 -		object = (LLInventoryObject*)model->getObject(mUUID);
 -	}
 -	return object;
 -}
 -
 -// virtual
 -void LLObjectBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
 -{
 -	if ("attach" == action)
 -	{
 -		LLUUID object_id = mUUID;
 -		LLViewerInventoryItem* item;
 -		item = (LLViewerInventoryItem*)gInventory.getItem(object_id);
 -		if(item && gInventory.isObjectDescendentOf(object_id, gInventory.getRootFolderID()))
 -		{
 -			rez_attachment(item, NULL);
 -		}
 -		else if(item && item->isComplete())
 -		{
 -			// must be in library. copy it to our inventory and put it on.
 -			LLPointer<LLInventoryCallback> cb = new RezAttachmentCallback(0);
 -			copy_inventory_item(
 -				gAgent.getID(),
 -				item->getPermissions().getOwner(),
 -				item->getUUID(),
 -				LLUUID::null,
 -				std::string(),
 -				cb);
 -		}
 -		gFocusMgr.setKeyboardFocus(NULL);
 -	}
 -	else if ("detach" == action)
 -	{
 -		LLInventoryItem* item = gInventory.getItem(mUUID);
 -		if(item)
 -		{
 -			gMessageSystem->newMessageFast(_PREHASH_DetachAttachmentIntoInv);
 -			gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
 -			gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
 -			gMessageSystem->addUUIDFast(_PREHASH_ItemID, item->getLinkedUUID());
 -			gMessageSystem->sendReliable( gAgent.getRegion()->getHost());
 -		}
 -		// this object might have been selected, so let the selection manager know it's gone now
 -		LLViewerObject *found_obj = gObjectList.findObject(item->getLinkedUUID());
 -		if (found_obj)
 -		{
 -			LLSelectMgr::getInstance()->remove(found_obj);
 -		}
 -	}
 -	else LLItemBridge::performAction(folder, model, action);
 -}
 -
 -void LLObjectBridge::openItem()
 -{
 -	LLViewerInventoryItem* item = getItem();
 -
 -	if (item)
 -	{
 -		LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
 -	}
 -
 -	LLSD key;
 -	key["id"] = mUUID;
 -	LLSideTray::getInstance()->showPanel("sidepanel_inventory", key);
 -
 -	// Disable old properties floater; this is replaced by the sidepanel.
 -	/*
 -	LLFloaterReg::showInstance("properties", mUUID);
 -	*/
 -}
 -
 -LLFontGL::StyleFlags LLObjectBridge::getLabelStyle() const
 -{
 -	U8 font = LLFontGL::NORMAL;
 -
 -	LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
 -	if( avatar && avatar->isWearingAttachment( mUUID ) )
 -	{
 -		font |= LLFontGL::BOLD;
 -	}
 -
 -	LLInventoryItem* item = getItem();
 -	if (item && item->getIsLinkType())
 -	{
 -		font |= LLFontGL::ITALIC;
 -	}
 -
 -	return (LLFontGL::StyleFlags)font;
 -}
 -
 -std::string LLObjectBridge::getLabelSuffix() const
 -{
 -	LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
 -	if( avatar && avatar->isWearingAttachment( mUUID ) )
 -	{
 -		std::string attachment_point_name = avatar->getAttachedPointName(mUUID);
 -
 -		// e.g. "(worn on ...)" / "(attached to ...)"
 -		LLStringUtil::format_map_t args;
 -		args["[ATTACHMENT_POINT]"] =  attachment_point_name.c_str();
 -		return LLItemBridge::getLabelSuffix() + LLTrans::getString("WornOnAttachmentPoint", args);
 -	}
 -	else
 -	{
 -		return LLItemBridge::getLabelSuffix();
 -	}
 -}
 -
 -void rez_attachment(LLViewerInventoryItem* item, LLViewerJointAttachment* attachment)
 -{
 -	LLSD payload;
 -	payload["item_id"] = item->getLinkedUUID(); // Wear the base object in case this is a link.
 -
 -	S32 attach_pt = 0;
 -	if (gAgent.getAvatarObject() && attachment)
 -	{
 -		for (LLVOAvatar::attachment_map_t::iterator iter = gAgent.getAvatarObject()->mAttachmentPoints.begin();
 -			 iter != gAgent.getAvatarObject()->mAttachmentPoints.end(); ++iter)
 -		{
 -			if (iter->second == attachment)
 -			{
 -				attach_pt = iter->first;
 -				break;
 -			}
 -		}
 -	}
 -
 -	payload["attachment_point"] = attach_pt;
 -
 -#if !ENABLE_MULTIATTACHMENTS
 -	if (attachment && attachment->getNumObjects() > 0)
 -	{
 -		LLNotifications::instance().add("ReplaceAttachment", LLSD(), payload, confirm_replace_attachment_rez);
 -	}
 -	else
 -#endif
 -	{
 -		LLNotifications::instance().forceResponse(LLNotification::Params("ReplaceAttachment").payload(payload), 0/*YES*/);
 -	}
 -}
 -
 -bool confirm_replace_attachment_rez(const LLSD& notification, const LLSD& response)
 -{
 -	LLVOAvatar *avatarp = gAgent.getAvatarObject();
 -
 -	if (!avatarp->canAttachMoreObjects())
 -	{
 -		LLSD args;
 -		args["MAX_ATTACHMENTS"] = llformat("%d", MAX_AGENT_ATTACHMENTS);
 -		LLNotifications::instance().add("MaxAttachmentsOnOutfit", args);
 -		return false;
 -	}
 -
 -	S32 option = LLNotification::getSelectedOption(notification, response);
 -	if (option == 0/*YES*/)
 -	{
 -		LLViewerInventoryItem* itemp = gInventory.getItem(notification["payload"]["item_id"].asUUID());
 -
 -		if (itemp)
 -		{
 -			LLMessageSystem* msg = gMessageSystem;
 -			msg->newMessageFast(_PREHASH_RezSingleAttachmentFromInv);
 -			msg->nextBlockFast(_PREHASH_AgentData);
 -			msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
 -			msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
 -			msg->nextBlockFast(_PREHASH_ObjectData);
 -			msg->addUUIDFast(_PREHASH_ItemID, itemp->getUUID());
 -			msg->addUUIDFast(_PREHASH_OwnerID, itemp->getPermissions().getOwner());
 -			U8 attachment_pt = notification["payload"]["attachment_point"].asInteger();
 -#if ENABLE_MULTIATTACHMENTS
 -			attachment_pt |= ATTACHMENT_ADD;
 -#endif
 -			msg->addU8Fast(_PREHASH_AttachmentPt, attachment_pt);
 -			pack_permissions_slam(msg, itemp->getFlags(), itemp->getPermissions());
 -			msg->addStringFast(_PREHASH_Name, itemp->getName());
 -			msg->addStringFast(_PREHASH_Description, itemp->getDescription());
 -			msg->sendReliable(gAgent.getRegion()->getHost());
 -		}
 -	}
 -	return false;
 -}
 -static LLNotificationFunctorRegistration confirm_replace_attachment_rez_reg("ReplaceAttachment", confirm_replace_attachment_rez);
 -
 -void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 -{
 -	std::vector<std::string> items;
 -	std::vector<std::string> disabled_items;
 -	if(isInTrash())
 -	{
 -		items.push_back(std::string("Purge Item"));
 -		if (!isItemRemovable())
 -		{
 -			disabled_items.push_back(std::string("Purge Item"));
 -		}
 -
 -		items.push_back(std::string("Restore Item"));
 -	}
 -	else
 -	{
 -		items.push_back(std::string("Properties"));
 -
 -		LLInventoryItem *item = getItem();
 -		getClipboardEntries(true, items, disabled_items, flags);
 -
 -		LLObjectBridge::sContextMenuItemID = mUUID;
 -
 -		if(item)
 -		{
 -			LLVOAvatarSelf* avatarp = gAgent.getAvatarObject();
 -			if( !avatarp )
 -			{
 -				return;
 -			}
 -
 -			if( avatarp->isWearingAttachment( mUUID ) )
 -			{
 -				items.push_back(std::string("Detach From Yourself"));
 -			}
 -			else
 -			if( !isInTrash() && !isLinkedObjectInTrash() )
 -			{
 -				items.push_back(std::string("Attach Separator"));
 -				items.push_back(std::string("Object Wear"));
 -				items.push_back(std::string("Attach To"));
 -				items.push_back(std::string("Attach To HUD"));
 -				// commented out for DEV-32347
 -				//items.push_back(std::string("Restore to Last Position"));
 -
 -				if (!avatarp->canAttachMoreObjects())
 -				{
 -					disabled_items.push_back(std::string("Object Wear"));
 -					disabled_items.push_back(std::string("Attach To"));
 -					disabled_items.push_back(std::string("Attach To HUD"));
 -				}
 -				LLMenuGL* attach_menu = menu.findChildMenuByName("Attach To", TRUE);
 -				LLMenuGL* attach_hud_menu = menu.findChildMenuByName("Attach To HUD", TRUE);
 -				LLVOAvatar *avatarp = gAgent.getAvatarObject();
 -				if (attach_menu
 -					&& (attach_menu->getChildCount() == 0)
 -					&& attach_hud_menu
 -					&& (attach_hud_menu->getChildCount() == 0)
 -					&& avatarp)
 -				{
 -					for (LLVOAvatar::attachment_map_t::iterator iter = avatarp->mAttachmentPoints.begin();
 -						 iter != avatarp->mAttachmentPoints.end(); )
 -					{
 -						LLVOAvatar::attachment_map_t::iterator curiter = iter++;
 -						LLViewerJointAttachment* attachment = curiter->second;
 -						LLMenuItemCallGL::Params p;
 -						std::string submenu_name = attachment->getName();
 -						if (LLTrans::getString(submenu_name) != "")
 -						{
 -						    p.name = (" ")+LLTrans::getString(submenu_name)+" ";
 -						}
 -						else
 -						{
 -							p.name = submenu_name;
 -						}
 -						LLSD cbparams;
 -						cbparams["index"] = curiter->first;
 -						cbparams["label"] = attachment->getName();
 -						p.on_click.function_name = "Inventory.AttachObject";
 -						p.on_click.parameter = LLSD(attachment->getName());
 -						p.on_enable.function_name = "Attachment.Label";
 -						p.on_enable.parameter = cbparams;
 -						LLView* parent = attachment->getIsHUDAttachment() ? attach_hud_menu : attach_menu;
 -						LLUICtrlFactory::create<LLMenuItemCallGL>(p, parent);
 -					}
 -				}
 -			}
 -		}
 -	}
 -	hide_context_entries(menu, items, disabled_items);
 -}
 -
 -BOOL LLObjectBridge::renameItem(const std::string& new_name)
 -{
 -	if(!isItemRenameable())
 -		return FALSE;
 -	LLPreview::dirty(mUUID);
 -	LLInventoryModel* model = getInventoryModel();
 -	if(!model)
 -		return FALSE;
 -	LLViewerInventoryItem* item = getItem();
 -	if(item && (item->getName() != new_name))
 -	{
 -		LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
 -		new_item->rename(new_name);
 -		buildDisplayName(new_item, mDisplayName);
 -		new_item->updateServer(FALSE);
 -		model->updateItem(new_item);
 -
 -		model->notifyObservers();
 -
 -		LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
 -		if( avatar )
 -		{
 -			LLViewerObject* obj = avatar->getWornAttachment( item->getUUID() );
 -			if( obj )
 -			{
 -				LLSelectMgr::getInstance()->deselectAll();
 -				LLSelectMgr::getInstance()->addAsIndividual( obj, SELECT_ALL_TES, FALSE );
 -				LLSelectMgr::getInstance()->selectionSetObjectName( new_name );
 -				LLSelectMgr::getInstance()->deselectAll();
 -			}
 -		}
 -	}
 -	// return FALSE because we either notified observers (& therefore
 -	// rebuilt) or we didn't update.
 -	return FALSE;
 -}
 -
 -// +=================================================+
 -// |        LLLSLTextBridge                          |
 -// +=================================================+
 -
 -LLUIImagePtr LLLSLTextBridge::getIcon() const
 -{
 -	return get_item_icon(LLAssetType::AT_SCRIPT, LLInventoryType::IT_LSL, 0, FALSE);
 -}
 -
 -void LLLSLTextBridge::openItem()
 -{
 -	LLViewerInventoryItem* item = getItem();
 -
 -	if (item)
 -	{
 -		LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
 -	}
 -	/*
 -	LLViewerInventoryItem* item = getItem();
 -	if (item)
 -	{
 -		LLFloaterReg::showInstance("preview_script", LLSD(mUUID), TAKE_FOCUS_YES);
 -	}
 -	*/
 -}
 -
 -// +=================================================+
 -// |        LLWearableBridge                         |
 -// +=================================================+
 -
 -// *NOTE: hack to get from avatar inventory to avatar
 -void wear_inventory_item_on_avatar( LLInventoryItem* item )
 -{
 -	if(item)
 -	{
 -		lldebugs << "wear_inventory_item_on_avatar( " << item->getName()
 -				 << " )" << llendl;
 -
 -		LLAppearanceManager::instance().addCOFItemLink(item);
 -	}
 -}
 -
 -void wear_add_inventory_item_on_avatar( LLInventoryItem* item )
 -{
 -	if(item)
 -	{
 -		lldebugs << "wear_add_inventory_item_on_avatar( " << item->getName()
 -				 << " )" << llendl;
 -
 -		LLWearableList::instance().getAsset(item->getAssetUUID(),
 -							   item->getName(),
 -							   item->getType(),
 -							   LLWearableBridge::onWearAddOnAvatarArrived,
 -							   new LLUUID(item->getUUID()));
 -	}
 -}
 -
 -void remove_inventory_category_from_avatar( LLInventoryCategory* category )
 -{
 -	if(!category) return;
 -	lldebugs << "remove_inventory_category_from_avatar( " << category->getName()
 -			 << " )" << llendl;
 -
 -
 -	if( gFloaterCustomize )
 -	{
 -		gFloaterCustomize->askToSaveIfDirty(
 -			boost::bind(remove_inventory_category_from_avatar_step2, _1, category->getUUID()));
 -	}
 -	else
 -	{
 -		remove_inventory_category_from_avatar_step2(TRUE, category->getUUID() );
 -	}
 -}
 -
 -struct OnRemoveStruct
 -{
 -	LLUUID mUUID;
 -	OnRemoveStruct(const LLUUID& uuid):
 -		mUUID(uuid)
 -	{
 -	}
 -};
 -
 -void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_id)
 -{
 -
 -	// Find all the wearables that are in the category's subtree.
 -	lldebugs << "remove_inventory_category_from_avatar_step2()" << llendl;
 -	if(proceed)
 -	{
 -		LLInventoryModel::cat_array_t cat_array;
 -		LLInventoryModel::item_array_t item_array;
 -		LLFindWearables is_wearable;
 -		gInventory.collectDescendentsIf(category_id,
 -										cat_array,
 -										item_array,
 -										LLInventoryModel::EXCLUDE_TRASH,
 -										is_wearable);
 -		S32 i;
 -		S32 wearable_count = item_array.count();
 -
 -		LLInventoryModel::cat_array_t	obj_cat_array;
 -		LLInventoryModel::item_array_t	obj_item_array;
 -		LLIsType is_object( LLAssetType::AT_OBJECT );
 -		gInventory.collectDescendentsIf(category_id,
 -										obj_cat_array,
 -										obj_item_array,
 -										LLInventoryModel::EXCLUDE_TRASH,
 -										is_object);
 -		S32 obj_count = obj_item_array.count();
 -
 -		// Find all gestures in this folder
 -		LLInventoryModel::cat_array_t	gest_cat_array;
 -		LLInventoryModel::item_array_t	gest_item_array;
 -		LLIsType is_gesture( LLAssetType::AT_GESTURE );
 -		gInventory.collectDescendentsIf(category_id,
 -										gest_cat_array,
 -										gest_item_array,
 -										LLInventoryModel::EXCLUDE_TRASH,
 -										is_gesture);
 -		S32 gest_count = gest_item_array.count();
 -
 -		if (wearable_count > 0)	//Loop through wearables.  If worn, remove.
 -		{
 -			for(i = 0; i  < wearable_count; ++i)
 -			{
 -				LLViewerInventoryItem *item = item_array.get(i);
 -				if (item->getType() == LLAssetType::AT_BODYPART)
 -					continue;
 -				if (gAgent.isTeen() && item->isWearableType() &&
 -					(item->getWearableType() == WT_UNDERPANTS || item->getWearableType() == WT_UNDERSHIRT))
 -					continue;
 -				if( gAgentWearables.isWearingItem (item->getLinkedUUID()) )
 -				{
 -					LLWearableList::instance().getAsset(item->getAssetUUID(),
 -														item->getName(),
 -														item->getType(),
 -														LLWearableBridge::onRemoveFromAvatarArrived,
 -														new OnRemoveStruct(item->getLinkedUUID()));
 -				}
 -			}
 -		}
 -
 -		if (obj_count > 0)
 -		{
 -			for(i = 0; i  < obj_count; ++i)
 -			{
 -				LLViewerInventoryItem *obj_item = obj_item_array.get(i);
 -				gMessageSystem->newMessageFast(_PREHASH_DetachAttachmentIntoInv);
 -				gMessageSystem->nextBlockFast(_PREHASH_ObjectData );
 -				gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
 -				gMessageSystem->addUUIDFast(_PREHASH_ItemID, obj_item->getLinkedUUID() );
 -
 -				gMessageSystem->sendReliable( gAgent.getRegion()->getHost() );
 -
 -				// this object might have been selected, so let the selection manager know it's gone now
 -				LLViewerObject *found_obj = gObjectList.findObject( obj_item->getLinkedUUID());
 -				if (found_obj)
 -				{
 -					LLSelectMgr::getInstance()->remove(found_obj);
 -				}
 -			}
 -		}
 -
 -		if (gest_count > 0)
 -		{
 -			for(i = 0; i  < gest_count; ++i)
 -			{
 -				LLViewerInventoryItem *gest_item = gest_item_array.get(i);
 -				if ( LLGestureManager::instance().isGestureActive( gest_item->getLinkedUUID()) )
 -				{
 -					LLGestureManager::instance().deactivateGesture( gest_item->getLinkedUUID() );
 -					gInventory.updateItem( gest_item );
 -					gInventory.notifyObservers();
 -				}
 -
 -			}
 -		}
 -	}
 -}
 -
 -BOOL LLWearableBridge::renameItem(const std::string& new_name)
 -{
 -	if( gAgentWearables.isWearingItem( mUUID ) )
 -	{
 -		gAgentWearables.setWearableName( mUUID, new_name );
 -	}
 -	return LLItemBridge::renameItem(new_name);
 -}
 -
 -std::string LLWearableBridge::getLabelSuffix() const
 -{
 -	if( gAgentWearables.isWearingItem( mUUID ) )
 -	{
 -		// e.g. "(worn)" 
 -		return LLItemBridge::getLabelSuffix() + LLTrans::getString("worn");
 -	}
 -	else
 -	{
 -		return LLItemBridge::getLabelSuffix();
 -	}
 -}
 -
 -LLUIImagePtr LLWearableBridge::getIcon() const
 -{
 -	return get_item_icon(mAssetType, mInvType, mWearableType, FALSE);
 -}
 -
 -// virtual
 -void LLWearableBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
 -{
 -	if ("wear" == action)
 -	{
 -		wearOnAvatar();
 -	}
 -	else if ("wear_add" == action)
 -	{
 -		wearAddOnAvatar();
 -	}
 -	else if ("edit" == action)
 -	{
 -		editOnAvatar();
 -		return;
 -	}
 -	else if ("take_off" == action)
 -	{
 -		if(gAgentWearables.isWearingItem(mUUID))
 -		{
 -			LLViewerInventoryItem* item = getItem();
 -			if (item)
 -			{
 -				LLWearableList::instance().getAsset(item->getAssetUUID(),
 -													item->getName(),
 -													item->getType(),
 -													LLWearableBridge::onRemoveFromAvatarArrived,
 -													new OnRemoveStruct(mUUID));
 -			}
 -		}
 -	}
 -	else LLItemBridge::performAction(folder, model, action);
 -}
 -
 -void LLWearableBridge::openItem()
 -{
 -	LLViewerInventoryItem* item = getItem();
 -
 -	if (item)
 -	{
 -		LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
 -	}
 -	/*
 -	if( isInTrash() )
 -	{
 -		LLNotifications::instance().add("CannotWearTrash");
 -	}
 -	else if(isAgentInventory())
 -	{
 -		if( !gAgentWearables.isWearingItem( mUUID ) )
 -		{
 -			wearOnAvatar();
 -		}
 -	}
 -	else
 -	{
 -		// must be in the inventory library. copy it to our inventory
 -		// and put it on right away.
 -		LLViewerInventoryItem* item = getItem();
 -		if(item && item->isComplete())
 -		{
 -			LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback();
 -			copy_inventory_item(
 -				gAgent.getID(),
 -				item->getPermissions().getOwner(),
 -				item->getUUID(),
 -				LLUUID::null,
 -				std::string(),
 -				cb);
 -		}
 -		else if(item)
 -		{
 -			// *TODO: We should fetch the item details, and then do
 -			// the operation above.
 -			LLNotifications::instance().add("CannotWearInfoNotComplete");
 -		}
 -	}
 -	*/
 -}
 -
 -void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 -{
 -	lldebugs << "LLWearableBridge::buildContextMenu()" << llendl;
 -	std::vector<std::string> items;
 -	std::vector<std::string> disabled_items;
 -	if(isInTrash())
 -	{
 -		items.push_back(std::string("Purge Item"));
 -		if (!isItemRemovable())
 -		{
 -			disabled_items.push_back(std::string("Purge Item"));
 -		}
 -
 -		items.push_back(std::string("Restore Item"));
 -	}
 -	else
 -	{	// FWIW, it looks like SUPPRESS_OPEN_ITEM is not set anywhere
 -		BOOL no_open = ((flags & SUPPRESS_OPEN_ITEM) == SUPPRESS_OPEN_ITEM);
 -
 -		// If we have clothing, don't add "Open" as it's the same action as "Wear"   SL-18976
 -		LLViewerInventoryItem* item = getItem();
 -		if( !no_open && item )
 -		{
 -			no_open = (item->getType() == LLAssetType::AT_CLOTHING) ||
 -					  (item->getType() == LLAssetType::AT_BODYPART);
 -		}
 -		if (!no_open)
 -		{
 -			items.push_back(std::string("Open"));
 -		}
 -
 -		items.push_back(std::string("Properties"));
 -
 -		getClipboardEntries(true, items, disabled_items, flags);
 -
 -		items.push_back(std::string("Wearable Separator"));
 -
 -		items.push_back(std::string("Wearable Wear"));
 -		items.push_back(std::string("Wearable Add"));
 -		items.push_back(std::string("Wearable Edit"));
 -
 -		if ((flags & FIRST_SELECTED_ITEM) == 0)
 -		{
 -			disabled_items.push_back(std::string("Wearable Edit"));
 -		}
 -		// Don't allow items to be worn if their baseobj is in the trash.
 -		if (isLinkedObjectInTrash())
 -		{
 -			disabled_items.push_back(std::string("Wearable Wear"));
 -			disabled_items.push_back(std::string("Wearable Add"));
 -			disabled_items.push_back(std::string("Wearable Edit"));
 -		}
 -
 -		// Disable wear and take off based on whether the item is worn.
 -		if(item)
 -		{
 -			switch (item->getType())
 -			{
 -				case LLAssetType::AT_CLOTHING:
 -					items.push_back(std::string("Take Off"));
 -				case LLAssetType::AT_BODYPART:
 -					if (gAgentWearables.isWearingItem(item->getUUID()))
 -					{
 -						disabled_items.push_back(std::string("Wearable Wear"));
 -						disabled_items.push_back(std::string("Wearable Add"));
 -					}
 -					else
 -					{
 -						disabled_items.push_back(std::string("Take Off"));
 -					}
 -					break;
 -				default:
 -					break;
 -			}
 -		}
 -	}
 -	hide_context_entries(menu, items, disabled_items);
 -}
 -
 -// Called from menus
 -// static
 -BOOL LLWearableBridge::canWearOnAvatar(void* user_data)
 -{
 -	LLWearableBridge* self = (LLWearableBridge*)user_data;
 -	if(!self) return FALSE;
 -	if(!self->isAgentInventory())
 -	{
 -		LLViewerInventoryItem* item = (LLViewerInventoryItem*)self->getItem();
 -		if(!item || !item->isComplete()) return FALSE;
 -	}
 -	return (!gAgentWearables.isWearingItem(self->mUUID));
 -}
 -
 -// Called from menus
 -// static
 -void LLWearableBridge::onWearOnAvatar(void* user_data)
 -{
 -	LLWearableBridge* self = (LLWearableBridge*)user_data;
 -	if(!self) return;
 -	self->wearOnAvatar();
 -}
 -
 -void LLWearableBridge::wearOnAvatar()
 -{
 -	// Don't wear anything until initial wearables are loaded, can
 -	// destroy clothing items.
 -	if (!gAgentWearables.areWearablesLoaded())
 -	{
 -		LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded");
 -		return;
 -	}
 -
 -	LLViewerInventoryItem* item = getItem();
 -	if(item)
 -	{
 -		if(!isAgentInventory())
 -		{
 -			LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback();
 -			copy_inventory_item(
 -				gAgent.getID(),
 -				item->getPermissions().getOwner(),
 -				item->getUUID(),
 -				LLUUID::null,
 -				std::string(),
 -				cb);
 -		}
 -		else
 -		{
 -			wear_inventory_item_on_avatar(item);
 -		}
 -	}
 -}
 -
 -void LLWearableBridge::wearAddOnAvatar()
 -{
 -	// Don't wear anything until initial wearables are loaded, can
 -	// destroy clothing items.
 -	if (!gAgentWearables.areWearablesLoaded())
 -	{
 -		LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded");
 -		return;
 -	}
 -
 -	LLViewerInventoryItem* item = getItem();
 -	if(item)
 -	{
 -		if(!isAgentInventory())
 -		{
 -			LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback();
 -			copy_inventory_item(
 -				gAgent.getID(),
 -				item->getPermissions().getOwner(),
 -				item->getUUID(),
 -				LLUUID::null,
 -				std::string(),
 -				cb);
 -		}
 -		else
 -		{
 -			wear_add_inventory_item_on_avatar(item);
 -		}
 -	}
 -}
 -
 -// static
 -void LLWearableBridge::onWearOnAvatarArrived( LLWearable* wearable, void* userdata )
 -{
 -	LLUUID* item_id = (LLUUID*) userdata;
 -	if(wearable)
 -	{
 -		LLViewerInventoryItem* item = NULL;
 -		item = (LLViewerInventoryItem*)gInventory.getItem(*item_id);
 -		if(item)
 -		{
 -			if(item->getAssetUUID() == wearable->getAssetID())
 -			{
 -				gAgentWearables.setWearableItem(item, wearable);
 -				gInventory.notifyObservers();
 -				//self->getFolderItem()->refreshFromRoot();
 -			}
 -			else
 -			{
 -				llinfos << "By the time wearable asset arrived, its inv item already pointed to a different asset." << llendl;
 -			}
 -		}
 -	}
 -	delete item_id;
 -}
 -
 -// static
 -// BAP remove the "add" code path once everything is fully COF-ified.
 -void LLWearableBridge::onWearAddOnAvatarArrived( LLWearable* wearable, void* userdata )
 -{
 -	LLUUID* item_id = (LLUUID*) userdata;
 -	if(wearable)
 -	{
 -		LLViewerInventoryItem* item = NULL;
 -		item = (LLViewerInventoryItem*)gInventory.getItem(*item_id);
 -		if(item)
 -		{
 -			if(item->getAssetUUID() == wearable->getAssetID())
 -			{
 -				bool do_append = true;
 -				gAgentWearables.setWearableItem(item, wearable, do_append);
 -				gInventory.notifyObservers();
 -				//self->getFolderItem()->refreshFromRoot();
 -			}
 -			else
 -			{
 -				llinfos << "By the time wearable asset arrived, its inv item already pointed to a different asset." << llendl;
 -			}
 -		}
 -	}
 -	delete item_id;
 -}
 -
 -// static
 -BOOL LLWearableBridge::canEditOnAvatar(void* user_data)
 -{
 -	LLWearableBridge* self = (LLWearableBridge*)user_data;
 -	if(!self) return FALSE;
 -
 -	return (gAgentWearables.isWearingItem(self->mUUID));
 -}
 -
 -// static
 -void LLWearableBridge::onEditOnAvatar(void* user_data)
 -{
 -	LLWearableBridge* self = (LLWearableBridge*)user_data;
 -	if(self)
 -	{
 -		self->editOnAvatar();
 -	}
 -}
 -
 -void LLWearableBridge::editOnAvatar()
 -{
 -	const LLWearable* wearable = gAgentWearables.getWearableFromItemID(mUUID);
 -	if( wearable )
 -	{
 -		// Set the tab to the right wearable.
 -		if (gFloaterCustomize)
 -			gFloaterCustomize->setCurrentWearableType( wearable->getType() );
 -
 -		if( CAMERA_MODE_CUSTOMIZE_AVATAR != gAgent.getCameraMode() )
 -		{
 -			// Start Avatar Customization
 -			gAgent.changeCameraToCustomizeAvatar();
 -		}
 -	}
 -}
 -
 -// static
 -BOOL LLWearableBridge::canRemoveFromAvatar(void* user_data)
 -{
 -	LLWearableBridge* self = (LLWearableBridge*)user_data;
 -	if( self && (LLAssetType::AT_BODYPART != self->mAssetType) )
 -	{
 -		return gAgentWearables.isWearingItem( self->mUUID );
 -	}
 -	return FALSE;
 -}
 -
 -// static
 -void LLWearableBridge::onRemoveFromAvatar(void* user_data)
 -{
 -	LLWearableBridge* self = (LLWearableBridge*)user_data;
 -	if(!self) return;
 -	if(gAgentWearables.isWearingItem(self->mUUID))
 -	{
 -		LLViewerInventoryItem* item = self->getItem();
 -		if (item)
 -		{
 -			LLUUID parent_id = item->getParentUUID();
 -			LLWearableList::instance().getAsset(item->getAssetUUID(),
 -												item->getName(),
 -												item->getType(),
 -												onRemoveFromAvatarArrived,
 -												new OnRemoveStruct(LLUUID(self->mUUID)));
 -		}
 -	}
 -}
 -
 -// static
 -void LLWearableBridge::onRemoveFromAvatarArrived(LLWearable* wearable,
 -												 void* userdata)
 -{
 -	OnRemoveStruct *on_remove_struct = (OnRemoveStruct*) userdata;
 -	const LLUUID &item_id = gInventory.getLinkedItemID(on_remove_struct->mUUID);
 -	if(wearable)
 -	{
 -		if( gAgentWearables.isWearingItem( item_id ) )
 -		{
 -			EWearableType type = wearable->getType();
 -
 -			if( !(type==WT_SHAPE || type==WT_SKIN || type==WT_HAIR || type==WT_EYES ) ) //&&
 -				//!((!gAgent.isTeen()) && ( type==WT_UNDERPANTS || type==WT_UNDERSHIRT )) )
 -			{
 -				// MULTI_WEARABLE: FIXME HACK - always remove all
 -				bool do_remove_all = false;
 -				gAgentWearables.removeWearable( type, do_remove_all, 0 );
 -			}
 -		}
 -	}
 -
 -	// Find and remove this item from the COF.
 -	LLInventoryModel::item_array_t items = gInventory.collectLinkedItems(item_id, LLAppearanceManager::instance().getCOF());
 -	llassert(items.size() == 1); // Should always have one and only one item linked to this in the COF.
 -	for (LLInventoryModel::item_array_t::const_iterator iter = items.begin();
 -		 iter != items.end();
 -		 ++iter)
 -	{
 -		const LLViewerInventoryItem *linked_item = (*iter);
 -		const LLUUID &item_id = linked_item->getUUID();
 -		gInventory.purgeObject(item_id);
 -	}
 -	gInventory.notifyObservers();
 -
 -	delete on_remove_struct;
 -}
 -
 -LLInvFVBridgeAction* LLInvFVBridgeAction::createAction(LLAssetType::EType asset_type,
 -													   const LLUUID& uuid,LLInventoryModel* model)
 -{
 -	LLInvFVBridgeAction* action = NULL;
 -	switch(asset_type)
 -	{
 -	case LLAssetType::AT_TEXTURE:
 -		action = new LLTextureBridgeAction(uuid,model);
 -		break;
 -
 -	case LLAssetType::AT_SOUND:
 -		action = new LLSoundBridgeAction(uuid,model);
 -		break;
 -
 -	case LLAssetType::AT_LANDMARK:
 -		action = new LLLandmarkBridgeAction(uuid,model);
 -		break;
 -
 -	case LLAssetType::AT_CALLINGCARD:
 -		action = new LLCallingCardBridgeAction(uuid,model);
 -		break;
 -
 -	case LLAssetType::AT_OBJECT:
 -		action = new LLObjectBridgeAction(uuid,model);
 -		break;
 -
 -	case LLAssetType::AT_NOTECARD:
 -		action = new LLNotecardBridgeAction(uuid,model);
 -		break;
 -
 -	case LLAssetType::AT_ANIMATION:
 -		action = new LLAnimationBridgeAction(uuid,model);
 -		break;
 -
 -	case LLAssetType::AT_GESTURE:
 -		action = new LLGestureBridgeAction(uuid,model);
 -		break;
 -
 -	case LLAssetType::AT_LSL_TEXT:
 -		action = new LLLSLTextBridgeAction(uuid,model);
 -		break;
 -
 -	case LLAssetType::AT_CLOTHING:
 -	case LLAssetType::AT_BODYPART:
 -		action = new LLWearableBridgeAction(uuid,model);
 -
 -		break;
 -
 -	default:
 -		break;
 -	}
 -	return action;
 -}
 -
 -//static
 -void LLInvFVBridgeAction::doAction(LLAssetType::EType asset_type,
 -								   const LLUUID& uuid,LLInventoryModel* model)
 -{
 -	LLInvFVBridgeAction* action = createAction(asset_type,uuid,model);
 -	if(action)
 -	{
 -		action->doIt();
 -		delete action;
 -	}
 -}
 -
 -//static
 -void LLInvFVBridgeAction::doAction(const LLUUID& uuid, LLInventoryModel* model)
 -{
 -	LLAssetType::EType asset_type = model->getItem(uuid)->getType();
 -	LLInvFVBridgeAction* action = createAction(asset_type,uuid,model);
 -	if(action)
 -	{
 -		action->doIt();
 -		delete action;
 -	}
 -}
 -
 -LLViewerInventoryItem* LLInvFVBridgeAction::getItem() const
 -{
 -	if(mModel)
 -		return (LLViewerInventoryItem*)mModel->getItem(mUUID);
 -	return NULL;
 -}
 -
 -//virtual
 -void	LLTextureBridgeAction::doIt()
 -{
 -	if (getItem())
 -	{
 -		LLFloaterReg::showInstance("preview_texture", LLSD(mUUID), TAKE_FOCUS_YES);
 -	}
 -
 -	LLInvFVBridgeAction::doIt();
 -}
 -
 -//virtual
 -void	LLSoundBridgeAction::doIt()
 -{
 -	LLViewerInventoryItem* item = getItem();
 -	if(item)
 -	{
 -		LLFloaterReg::showInstance("preview_sound", LLSD(mUUID), TAKE_FOCUS_YES);
 -	}
 -
 -	LLInvFVBridgeAction::doIt();
 -}
 -
 -
 -//virtual
 -void	LLLandmarkBridgeAction::doIt()
 -{
 -	LLViewerInventoryItem* item = getItem();
 -	if( item )
 -	{
 -		// Opening (double-clicking) a landmark immediately teleports,
 -		// but warns you the first time.
 -		LLSD payload;
 -		payload["asset_id"] = item->getAssetUUID();
 -		LLNotifications::instance().add("TeleportFromLandmark", LLSD(), payload);
 -	}
 -
 -	LLInvFVBridgeAction::doIt();
 -}
 -
 -
 -//virtual
 -void	LLCallingCardBridgeAction::doIt()
 -{
 -	LLViewerInventoryItem* item = getItem();
 -	if(item && item->getCreatorUUID().notNull())
 -	{
 -		LLAvatarActions::showProfile(item->getCreatorUUID());
 -	}
 -
 -	LLInvFVBridgeAction::doIt();
 -}
 -
 -//virtual
 -void
 -LLNotecardBridgeAction::doIt()
 -{
 -	LLViewerInventoryItem* item = getItem();
 -	if (item)
 -	{
 -		LLFloaterReg::showInstance("preview_notecard", LLSD(item->getUUID()), TAKE_FOCUS_YES);
 -	}
 -
 -	LLInvFVBridgeAction::doIt();
 -}
 -
 -//virtual
 -void	LLGestureBridgeAction::doIt()
 -{
 -	LLViewerInventoryItem* item = getItem();
 -	if (item)
 -	{
 -		LLPreviewGesture* preview = LLPreviewGesture::show(mUUID, LLUUID::null);
 -		preview->setFocus(TRUE);
 -	}
 -
 -	LLInvFVBridgeAction::doIt();
 -}
 -
 -//virtual
 -void	LLAnimationBridgeAction::doIt()
 -{
 -	LLViewerInventoryItem* item = getItem();
 -	if (item)
 -	{
 -		LLFloaterReg::showInstance("preview_anim", LLSD(mUUID), TAKE_FOCUS_YES);
 -	}
 -
 -	LLInvFVBridgeAction::doIt();
 -}
 -
 -
 -//virtual
 -void	LLObjectBridgeAction::doIt()
 -{
 -	LLFloaterReg::showInstance("properties", mUUID);
 -
 -	LLInvFVBridgeAction::doIt();
 -}
 -
 -
 -//virtual
 -void	LLLSLTextBridgeAction::doIt()
 -{
 -	LLViewerInventoryItem* item = getItem();
 -	if (item)
 -	{
 -		LLFloaterReg::showInstance("preview_script", LLSD(mUUID), TAKE_FOCUS_YES);
 -	}
 -
 -	LLInvFVBridgeAction::doIt();
 -}
 -
 -
 -BOOL LLWearableBridgeAction::isInTrash() const
 -{
 -	if(!mModel) return FALSE;
 -	const LLUUID trash_id = mModel->findCategoryUUIDForType(LLFolderType::FT_TRASH);
 -	return mModel->isObjectDescendentOf(mUUID, trash_id);
 -}
 -
 -BOOL LLWearableBridgeAction::isAgentInventory() const
 -{
 -	if(!mModel) return FALSE;
 -	if(gInventory.getRootFolderID() == mUUID) return TRUE;
 -	return mModel->isObjectDescendentOf(mUUID, gInventory.getRootFolderID());
 -}
 -
 -void LLWearableBridgeAction::wearOnAvatar()
 -{
 -	// Don't wear anything until initial wearables are loaded, can
 -	// destroy clothing items.
 -	if (!gAgentWearables.areWearablesLoaded())
 -	{
 -		LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded");
 -		return;
 -	}
 -
 -	LLViewerInventoryItem* item = getItem();
 -	if(item)
 -	{
 -		if(!isAgentInventory())
 -		{
 -			LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback();
 -			copy_inventory_item(
 -				gAgent.getID(),
 -				item->getPermissions().getOwner(),
 -				item->getUUID(),
 -				LLUUID::null,
 -				std::string(),
 -				cb);
 -		}
 -		else
 -		{
 -			wear_inventory_item_on_avatar(item);
 -		}
 -	}
 -}
 -
 -//virtual
 -void LLWearableBridgeAction::doIt()
 -{
 -	if(isInTrash())
 -	{
 -		LLNotifications::instance().add("CannotWearTrash");
 -	}
 -	else if(isAgentInventory())
 -	{
 -		if(!gAgentWearables.isWearingItem(mUUID))
 -		{
 -			wearOnAvatar();
 -		}
 -	}
 -	else
 -	{
 -		// must be in the inventory library. copy it to our inventory
 -		// and put it on right away.
 -		LLViewerInventoryItem* item = getItem();
 -		if(item && item->isComplete())
 -		{
 -			LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback();
 -			copy_inventory_item(
 -				gAgent.getID(),
 -				item->getPermissions().getOwner(),
 -				item->getUUID(),
 -				LLUUID::null,
 -				std::string(),
 -				cb);
 -		}
 -		else if(item)
 -		{
 -			// *TODO: We should fetch the item details, and then do
 -			// the operation above.
 -			LLNotifications::instance().add("CannotWearInfoNotComplete");
 -		}
 -	}
 -
 -	LLInvFVBridgeAction::doIt();
 -}
 -
 -// +=================================================+
 -// |        LLLinkItemBridge                         |
 -// +=================================================+
 -// For broken links
 -
 -std::string LLLinkItemBridge::sPrefix("Link: ");
 -
 -
 -LLUIImagePtr LLLinkItemBridge::getIcon() const
 -{
 -	if (LLViewerInventoryItem *item = getItem())
 -	{
 -		return get_item_icon(item->getActualType(), LLInventoryType::IT_NONE, 0, FALSE);
 -	}
 -	return get_item_icon(LLAssetType::AT_LINK, LLInventoryType::IT_NONE, 0, FALSE);
 -}
 -
 -void LLLinkItemBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 -{
 -	// *TODO: Translate
 -	lldebugs << "LLLink::buildContextMenu()" << llendl;
 -	std::vector<std::string> items;
 -	std::vector<std::string> disabled_items;
 -
 -	if(isInTrash())
 -	{
 -		items.push_back(std::string("Purge Item"));
 -		if (!isItemRemovable())
 -		{
 -			disabled_items.push_back(std::string("Purge Item"));
 -		}
 -
 -		items.push_back(std::string("Restore Item"));
 -	}
 -	else
 -	{
 -		items.push_back(std::string("Delete"));
 -		if (!isItemRemovable())
 -		{
 -			disabled_items.push_back(std::string("Delete"));
 -		}
 -	}
 -	hide_context_entries(menu, items, disabled_items);
 -}
 -
 -
 -// +=================================================+
 -// |        LLLinkBridge                             |
 -// +=================================================+
 -// For broken links.
 -
 -std::string LLLinkFolderBridge::sPrefix("Link: ");
 -
 -
 -LLUIImagePtr LLLinkFolderBridge::getIcon() const
 -{
 -	LLFolderType::EType preferred_type = LLFolderType::FT_NONE;
 -	if (LLViewerInventoryItem *item = getItem())
 -	{
 -		if (const LLViewerInventoryCategory* cat = item->getLinkedCategory())
 -		{
 -			preferred_type = cat->getPreferredType();
 -		}
 -	}
 -	return LLFolderBridge::getIcon(preferred_type);
 -}
 -
 -void LLLinkFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 -{
 -	// *TODO: Translate
 -	lldebugs << "LLLink::buildContextMenu()" << llendl;
 -	std::vector<std::string> items;
 -	std::vector<std::string> disabled_items;
 -
 -	if(isInTrash())
 -	{
 -		items.push_back(std::string("Purge Item"));
 -		if (!isItemRemovable())
 -		{
 -			disabled_items.push_back(std::string("Purge Item"));
 -		}
 -
 -		items.push_back(std::string("Restore Item"));
 -	}
 -	else
 -	{
 -		items.push_back(std::string("Find Original"));
 -		items.push_back(std::string("Delete"));
 -		if (!isItemRemovable())
 -		{
 -			disabled_items.push_back(std::string("Delete"));
 -		}
 -	}
 -	hide_context_entries(menu, items, disabled_items);
 -}
 -
 -void LLLinkFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
 -{
 -	if ("goto" == action)
 -	{
 -		gotoItem(folder);
 -		return;
 -	}
 -	LLItemBridge::performAction(folder,model,action);
 -}
 -
 -void LLLinkFolderBridge::gotoItem(LLFolderView *folder)
 -{
 -	const LLUUID &cat_uuid = getFolderID();
 -	if (!cat_uuid.isNull())
 -	{
 -		if (LLFolderViewItem *base_folder = folder->getItemByID(cat_uuid))
 -		{
 -			if (LLInventoryModel* model = getInventoryModel())
 -			{
 -				model->fetchDescendentsOf(cat_uuid);
 -			}
 -			base_folder->setOpen(TRUE);
 -			folder->setSelectionFromRoot(base_folder,TRUE);
 -			folder->scrollToShowSelection();
 -		}
 -	}
 -}
 -
 -const LLUUID &LLLinkFolderBridge::getFolderID() const
 -{
 -	if (LLViewerInventoryItem *link_item = getItem())
 -	{
 -		if (const LLViewerInventoryCategory *cat = link_item->getLinkedCategory())
 -		{
 -			const LLUUID& cat_uuid = cat->getUUID();
 -			return cat_uuid;
 -		}
 -	}
 -	return LLUUID::null;
 -}
 +/** + * @file llinventorybridge.cpp + * @brief Implementation of the Inventory-Folder-View-Bridge classes. + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-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 "llinventorybridge.h" + +#include "llagent.h" +#include "llagentwearables.h" +#include "llappearancemgr.h" +#include "llavataractions.h" +#include "llfloatercustomize.h" +#include "llfloaterinventory.h" +#include "llfloateropenobject.h" +#include "llfloaterreg.h" +#include "llfloaterworldmap.h" +#include "llfriendcard.h" +#include "llgesturemgr.h" +#include "llimfloater.h" +#include "llimview.h" +#include "llinventoryclipboard.h" +#include "llinventoryfunctions.h" +#include "llinventorymodel.h" +#include "llinventorypanel.h" +#include "llnotifications.h" +#include "llnotificationsutil.h" +#include "llpreviewanim.h" +#include "llpreviewgesture.h" +#include "llpreviewtexture.h" +#include "llselectmgr.h" +#include "llsidetray.h" +#include "lltrans.h" +#include "llviewerassettype.h" +#include "llviewermessage.h" +#include "llviewerobjectlist.h" +#include "llviewerwindow.h" +#include "llvoavatarself.h" +#include "llwearablelist.h" +#include "llpaneloutfitsinventory.h" + +using namespace LLOldEvents; + +// Helpers +// bug in busy count inc/dec right now, logic is complex... do we really need it? +void inc_busy_count() +{ +// 	gViewerWindow->getWindow()->incBusyCount(); +//  check balance of these calls if this code is changed to ever actually +//  *do* something! +} +void dec_busy_count() +{ +// 	gViewerWindow->getWindow()->decBusyCount(); +//  check balance of these calls if this code is changed to ever actually +//  *do* something! +} + +// Function declarations +void wear_add_inventory_item_on_avatar(LLInventoryItem* item); +void remove_inventory_category_from_avatar(LLInventoryCategory* category); +void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_id); +bool move_task_inventory_callback(const LLSD& notification, const LLSD& response, LLMoveInv*); +bool confirm_replace_attachment_rez(const LLSD& notification, const LLSD& response); + +std::string ICON_NAME[ICON_NAME_COUNT] = +{ +	"Inv_Texture", +	"Inv_Sound", +	"Inv_CallingCard", +	"Inv_CallingCard", +	"Inv_Landmark", +	"Inv_Landmark", +	"Inv_Script", +	"Inv_Clothing", +	"Inv_Object", +	"Inv_Object", +	"Inv_Notecard", +	"Inv_Skin", +	"Inv_Snapshot", + +	"Inv_BodyShape", +	"Inv_Skin", +	"Inv_Hair", +	"Inv_Eye", +	"Inv_Shirt", +	"Inv_Pants", +	"Inv_Shoe", +	"Inv_Socks", +	"Inv_Jacket", +	"Inv_Gloves", +	"Inv_Undershirt", +	"Inv_Underpants", +	"Inv_Skirt", +	"Inv_Alpha", +	"Inv_Tattoo", + +	"Inv_Animation", +	"Inv_Gesture", + +	"inv_item_linkitem.tga", +	"inv_item_linkfolder.tga" +}; + +// +=================================================+ +// |        LLInvFVBridge                            | +// +=================================================+ + +LLInvFVBridge::LLInvFVBridge(LLInventoryPanel* inventory, const LLUUID& uuid) : +mUUID(uuid), mInvType(LLInventoryType::IT_NONE) +{ +	mInventoryPanel = inventory->getHandle(); +} + +const std::string& LLInvFVBridge::getName() const +{ +	LLInventoryObject* obj = getInventoryObject(); +	if(obj) +	{ +		return obj->getName(); +	} +	return LLStringUtil::null; +} + +const std::string& LLInvFVBridge::getDisplayName() const +{ +	return getName(); +} + +// Folders have full perms +PermissionMask LLInvFVBridge::getPermissionMask() const +{ + +	return PERM_ALL; +} + +// virtual +LLFolderType::EType LLInvFVBridge::getPreferredType() const +{ +	return LLFolderType::FT_NONE; +} + + +// Folders don't have creation dates. +time_t LLInvFVBridge::getCreationDate() const +{ +	return 0; +} + +// Can be destroyed (or moved to trash) +BOOL LLInvFVBridge::isItemRemovable() +{ +	const LLInventoryModel* model = getInventoryModel(); +	if(!model)  +	{ +		return FALSE; +	} +	if(!model->isObjectDescendentOf(mUUID, gInventory.getRootFolderID())) +	{ +		return FALSE; +	} +	const LLInventoryObject *obj = model->getItem(mUUID); +	if (obj && obj->getIsLinkType()) +	{ +		return TRUE; +	} +	if (gAgentWearables.isWearingItem(mUUID)) +	{ +		return FALSE; +	} +	const LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); +	if (avatar && avatar->isWearingAttachment(mUUID)) +	{ +		return FALSE; +	} +	return TRUE; +} + +// Can be moved to another folder +BOOL LLInvFVBridge::isItemMovable() const +{ +	return TRUE; +} + +/*virtual*/ +/** + * @brief Adds this item into clipboard storage + */ +void LLInvFVBridge::cutToClipboard() +{ +	if(isItemMovable()) +	{ +		LLInventoryClipboard::instance().cut(mUUID); +	} +} +// *TODO: make sure this does the right thing +void LLInvFVBridge::showProperties() +{ +	LLSD key; +	key["id"] = mUUID; +	LLSideTray::getInstance()->showPanel("sidepanel_inventory", key); + +	// Disable old properties floater; this is replaced by the sidepanel. +	/* +	LLFloaterReg::showInstance("properties", mUUID); +	*/ +} + +void LLInvFVBridge::removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batch) +{ +	// Deactivate gestures when moving them into Trash +	LLInvFVBridge* bridge; +	LLInventoryModel* model = getInventoryModel(); +	LLViewerInventoryItem* item = NULL; +	LLViewerInventoryCategory* cat = NULL; +	LLInventoryModel::cat_array_t	descendent_categories; +	LLInventoryModel::item_array_t	descendent_items; +	S32 count = batch.count(); +	S32 i,j; +	for(i = 0; i < count; ++i) +	{ +		bridge = (LLInvFVBridge*)(batch.get(i)); +		if(!bridge || !bridge->isItemRemovable()) continue; +		item = (LLViewerInventoryItem*)model->getItem(bridge->getUUID()); +		if (item) +		{ +			if(LLAssetType::AT_GESTURE == item->getType()) +			{ +				LLGestureManager::instance().deactivateGesture(item->getUUID()); +			} +		} +	} +	for(i = 0; i < count; ++i) +	{ +		bridge = (LLInvFVBridge*)(batch.get(i)); +		if(!bridge || !bridge->isItemRemovable()) continue; +		cat = (LLViewerInventoryCategory*)model->getCategory(bridge->getUUID()); +		if (cat) +		{ +			gInventory.collectDescendents( cat->getUUID(), descendent_categories, descendent_items, FALSE ); +			for (j=0; j<descendent_items.count(); j++) +			{ +				if(LLAssetType::AT_GESTURE == descendent_items[j]->getType()) +				{ +					LLGestureManager::instance().deactivateGesture(descendent_items[j]->getUUID()); +				} +			} +		} +	} +	removeBatchNoCheck(batch); +} + +void LLInvFVBridge::removeBatchNoCheck(LLDynamicArray<LLFolderViewEventListener*>& batch) +{ +	// this method moves a bunch of items and folders to the trash. As +	// per design guidelines for the inventory model, the message is +	// built and the accounting is performed first. After all of that, +	// we call LLInventoryModel::moveObject() to move everything +	// around. +	LLInvFVBridge* bridge; +	LLInventoryModel* model = getInventoryModel(); +	if(!model) return; +	LLMessageSystem* msg = gMessageSystem; +	const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); +	LLViewerInventoryItem* item = NULL; +	LLViewerInventoryCategory* cat = NULL; +	std::vector<LLUUID> move_ids; +	LLInventoryModel::update_map_t update; +	bool start_new_message = true; +	S32 count = batch.count(); +	S32 i; +	for(i = 0; i < count; ++i) +	{ +		bridge = (LLInvFVBridge*)(batch.get(i)); +		if(!bridge || !bridge->isItemRemovable()) continue; +		item = (LLViewerInventoryItem*)model->getItem(bridge->getUUID()); +		if(item) +		{ +			if(item->getParentUUID() == trash_id) continue; +			move_ids.push_back(item->getUUID()); +			LLPreview::hide(item->getUUID()); +			--update[item->getParentUUID()]; +			++update[trash_id]; +			if(start_new_message) +			{ +				start_new_message = false; +				msg->newMessageFast(_PREHASH_MoveInventoryItem); +				msg->nextBlockFast(_PREHASH_AgentData); +				msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); +				msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); +				msg->addBOOLFast(_PREHASH_Stamp, TRUE); +			} +			msg->nextBlockFast(_PREHASH_InventoryData); +			msg->addUUIDFast(_PREHASH_ItemID, item->getUUID()); +			msg->addUUIDFast(_PREHASH_FolderID, trash_id); +			msg->addString("NewName", NULL); +			if(msg->isSendFullFast(_PREHASH_InventoryData)) +			{ +				start_new_message = true; +				gAgent.sendReliableMessage(); +				gInventory.accountForUpdate(update); +				update.clear(); +			} +		} +	} +	if(!start_new_message) +	{ +		start_new_message = true; +		gAgent.sendReliableMessage(); +		gInventory.accountForUpdate(update); +		update.clear(); +	} +	for(i = 0; i < count; ++i) +	{ +		bridge = (LLInvFVBridge*)(batch.get(i)); +		if(!bridge || !bridge->isItemRemovable()) continue; +		cat = (LLViewerInventoryCategory*)model->getCategory(bridge->getUUID()); +		if(cat) +		{ +			if(cat->getParentUUID() == trash_id) continue; +			move_ids.push_back(cat->getUUID()); +			--update[cat->getParentUUID()]; +			++update[trash_id]; +			if(start_new_message) +			{ +				start_new_message = false; +				msg->newMessageFast(_PREHASH_MoveInventoryFolder); +				msg->nextBlockFast(_PREHASH_AgentData); +				msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); +				msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); +				msg->addBOOL("Stamp", TRUE); +			} +			msg->nextBlockFast(_PREHASH_InventoryData); +			msg->addUUIDFast(_PREHASH_FolderID, cat->getUUID()); +			msg->addUUIDFast(_PREHASH_ParentID, trash_id); +			if(msg->isSendFullFast(_PREHASH_InventoryData)) +			{ +				start_new_message = true; +				gAgent.sendReliableMessage(); +				gInventory.accountForUpdate(update); +				update.clear(); +			} +		} +	} +	if(!start_new_message) +	{ +		gAgent.sendReliableMessage(); +		gInventory.accountForUpdate(update); +	} + +	// move everything. +	std::vector<LLUUID>::iterator it = move_ids.begin(); +	std::vector<LLUUID>::iterator end = move_ids.end(); +	for(; it != end; ++it) +	{ +		gInventory.moveObject((*it), trash_id); +	} + +	// notify inventory observers. +	model->notifyObservers(); +} + +BOOL LLInvFVBridge::isClipboardPasteable() const +{ +	if (!LLInventoryClipboard::instance().hasContents() || !isAgentInventory()) +	{ +		return FALSE; +	} +	LLInventoryModel* model = getInventoryModel(); +	if (!model) +	{ +		return FALSE; +	} + +	const LLUUID &agent_id = gAgent.getID(); + +	LLDynamicArray<LLUUID> objects; +	LLInventoryClipboard::instance().retrieve(objects); +	S32 count = objects.count(); +	for(S32 i = 0; i < count; i++) +	{ +		const LLUUID &item_id = objects.get(i); + +		// Can't paste folders +		const LLInventoryCategory *cat = model->getCategory(item_id); +		if (cat) +		{ +			return FALSE; +		} + +		const LLInventoryItem *item = model->getItem(item_id); +		if (item) +		{ +			if (!item->getPermissions().allowCopyBy(agent_id)) +			{ +				return FALSE; +			} +		} +	} +	return TRUE; +} + +BOOL LLInvFVBridge::isClipboardPasteableAsLink() const +{ +	if (!LLInventoryClipboard::instance().hasContents() || !isAgentInventory()) +	{ +		return FALSE; +	} +	const LLInventoryModel* model = getInventoryModel(); +	if (!model) +	{ +		return FALSE; +	} + +	LLDynamicArray<LLUUID> objects; +	LLInventoryClipboard::instance().retrieve(objects); +	S32 count = objects.count(); +	for(S32 i = 0; i < count; i++) +	{ +		const LLInventoryItem *item = model->getItem(objects.get(i)); +		if (item) +		{ +			if (!LLAssetType::lookupCanLink(item->getActualType())) +			{ +				return FALSE; +			} +		} +		const LLViewerInventoryCategory *cat = model->getCategory(objects.get(i)); +		if (cat && !LLFolderType::lookupIsProtectedType(cat->getPreferredType())) +		{ +			return FALSE; +		} +	} +	return TRUE; +} + +void hide_context_entries(LLMenuGL& menu,  +						const std::vector<std::string> &entries_to_show, +						const std::vector<std::string> &disabled_entries) +{ +	const LLView::child_list_t *list = menu.getChildList(); + +	LLView::child_list_t::const_iterator itor; +	for (itor = list->begin(); itor != list->end(); ++itor) +	{ +		std::string name = (*itor)->getName(); + +		// descend into split menus: +		LLMenuItemBranchGL* branchp = dynamic_cast<LLMenuItemBranchGL*>(*itor); +		if ((name == "More") && branchp) +		{ +			hide_context_entries(*branchp->getBranch(), entries_to_show, disabled_entries); +		} + + +		bool found = false; +		std::vector<std::string>::const_iterator itor2; +		for (itor2 = entries_to_show.begin(); itor2 != entries_to_show.end(); ++itor2) +		{ +			if (*itor2 == name) +			{ +				found = true; +			} +		} +		if (!found) +		{ +			(*itor)->setVisible(FALSE); +		} +		else +		{ +			(*itor)->setVisible(TRUE); +			for (itor2 = disabled_entries.begin(); itor2 != disabled_entries.end(); ++itor2) +			{ +				if (*itor2 == name) +				{ +					(*itor)->setEnabled(FALSE); +				} +			} +		} +	} +} + +// Helper for commonly-used entries +void LLInvFVBridge::getClipboardEntries(bool show_asset_id, +										std::vector<std::string> &items, +										std::vector<std::string> &disabled_items, U32 flags) +{ +	const LLInventoryObject *obj = getInventoryObject(); +	if (obj && obj->getIsLinkType()) +	{ +		items.push_back(std::string("Find Original")); +		if (LLAssetType::lookupIsLinkType(obj->getType())) +		{ +			disabled_items.push_back(std::string("Find Original")); +		} +	} +	else +	{ +		items.push_back(std::string("Rename")); +		if (!isItemRenameable() || (flags & FIRST_SELECTED_ITEM) == 0) +		{ +			disabled_items.push_back(std::string("Rename")); +		} +		 +		if (show_asset_id) +		{ +			items.push_back(std::string("Copy Asset UUID")); +			if ( (! ( isItemPermissive() || gAgent.isGodlike() ) ) +				 || (flags & FIRST_SELECTED_ITEM) == 0) +			{ +				disabled_items.push_back(std::string("Copy Asset UUID")); +			} +		} +		items.push_back(std::string("Copy Separator")); +		 +		items.push_back(std::string("Copy")); +		if (!isItemCopyable()) +		{ +			disabled_items.push_back(std::string("Copy")); +		} +	} + +	items.push_back(std::string("Paste")); +	if (!isClipboardPasteable() || (flags & FIRST_SELECTED_ITEM) == 0) +	{ +		disabled_items.push_back(std::string("Paste")); +	} + +	items.push_back(std::string("Paste As Link")); +	if (!isClipboardPasteableAsLink() || (flags & FIRST_SELECTED_ITEM) == 0) +	{ +		disabled_items.push_back(std::string("Paste As Link")); +	} +	items.push_back(std::string("Paste Separator")); + +	items.push_back(std::string("Delete")); +	if (!isItemRemovable()) +	{ +		disabled_items.push_back(std::string("Delete")); +	} + +	// If multiple items are selected, disable properties (if it exists). +	if ((flags & FIRST_SELECTED_ITEM) == 0) +	{ +		disabled_items.push_back(std::string("Properties")); +	} +} + +void LLInvFVBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ +	lldebugs << "LLInvFVBridge::buildContextMenu()" << llendl; +	std::vector<std::string> items; +	std::vector<std::string> disabled_items; +	if(isInTrash()) +	{ +		items.push_back(std::string("PurgeItem")); +		if (!isItemRemovable()) +		{ +			disabled_items.push_back(std::string("PurgeItem")); +		} +		items.push_back(std::string("RestoreItem")); +	} +	else +	{ +		items.push_back(std::string("Open")); +		items.push_back(std::string("Properties")); + +		getClipboardEntries(true, items, disabled_items, flags); +	} +	hide_context_entries(menu, items, disabled_items); +} + +// *TODO: remove this +BOOL LLInvFVBridge::startDrag(EDragAndDropType* type, LLUUID* id) const +{ +	BOOL rv = FALSE; + +	const LLInventoryObject* obj = getInventoryObject(); + +	if(obj) +	{ +		*type = LLViewerAssetType::lookupDragAndDropType(obj->getActualType()); +		if(*type == DAD_NONE) +		{ +			return FALSE; +		} + +		*id = obj->getUUID(); +		//object_ids.put(obj->getUUID()); + +		if (*type == DAD_CATEGORY) +		{ +			gInventory.startBackgroundFetch(obj->getUUID()); +		} + +		rv = TRUE; +	} + +	return rv; +} + +LLInventoryObject* LLInvFVBridge::getInventoryObject() const +{ +	LLInventoryObject* obj = NULL; +	LLInventoryModel* model = getInventoryModel(); +	if(model) +	{ +		obj = (LLInventoryObject*)model->getObject(mUUID); +	} +	return obj; +} + +LLInventoryModel* LLInvFVBridge::getInventoryModel() const +{ +	LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); +	return panel ? panel->getModel() : NULL; +} + +BOOL LLInvFVBridge::isInTrash() const +{ +	LLInventoryModel* model = getInventoryModel(); +	if(!model) return FALSE; +	const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); +	return model->isObjectDescendentOf(mUUID, trash_id); +} + +BOOL LLInvFVBridge::isLinkedObjectInTrash() const +{ +	if (isInTrash()) return TRUE; + +	const LLInventoryObject *obj = getInventoryObject(); +	if (obj && obj->getIsLinkType()) +	{ +		LLInventoryModel* model = getInventoryModel(); +		if(!model) return FALSE; +		const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); +		return model->isObjectDescendentOf(obj->getLinkedUUID(), trash_id); +	} +	return FALSE; +} + +BOOL LLInvFVBridge::isAgentInventory() const +{ +	const LLInventoryModel* model = getInventoryModel(); +	if(!model) return FALSE; +	if(gInventory.getRootFolderID() == mUUID) return TRUE; +	return model->isObjectDescendentOf(mUUID, gInventory.getRootFolderID()); +} + +BOOL LLInvFVBridge::isCOFFolder() const +{ +	const LLInventoryModel* model = getInventoryModel(); +	if(!model) return TRUE; +	const LLUUID cof_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); +	if (mUUID == cof_id || model->isObjectDescendentOf(mUUID, cof_id)) +	{ +		return TRUE; +	} +	return FALSE; +} + +BOOL LLInvFVBridge::isItemPermissive() const +{ +	return FALSE; +} + +// static +void LLInvFVBridge::changeItemParent(LLInventoryModel* model, +									 LLViewerInventoryItem* item, +									 const LLUUID& new_parent, +									 BOOL restamp) +{ +	if(item->getParentUUID() != new_parent) +	{ +		LLInventoryModel::update_list_t update; +		LLInventoryModel::LLCategoryUpdate old_folder(item->getParentUUID(),-1); +		update.push_back(old_folder); +		LLInventoryModel::LLCategoryUpdate new_folder(new_parent, 1); +		update.push_back(new_folder); +		gInventory.accountForUpdate(update); + +		LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); +		new_item->setParent(new_parent); +		new_item->updateParentOnServer(restamp); +		model->updateItem(new_item); +		model->notifyObservers(); +	} +} + +// static +void LLInvFVBridge::changeCategoryParent(LLInventoryModel* model, +										 LLViewerInventoryCategory* cat, +										 const LLUUID& new_parent, +										 BOOL restamp) +{ +	if(cat->getParentUUID() != new_parent) +	{ +		LLInventoryModel::update_list_t update; +		LLInventoryModel::LLCategoryUpdate old_folder(cat->getParentUUID(), -1); +		update.push_back(old_folder); +		LLInventoryModel::LLCategoryUpdate new_folder(new_parent, 1); +		update.push_back(new_folder); +		gInventory.accountForUpdate(update); + +		LLPointer<LLViewerInventoryCategory> new_cat = new LLViewerInventoryCategory(cat); +		new_cat->setParent(new_parent); +		new_cat->updateParentOnServer(restamp); +		model->updateCategory(new_cat); +		model->notifyObservers(); +	} +} + + +const std::string safe_inv_type_lookup(LLInventoryType::EType inv_type) +{ +	const std::string rv= LLInventoryType::lookup(inv_type); +	if(rv.empty()) +	{ +		return std::string("<invalid>"); +	} +	return rv; +} + +LLInvFVBridge* LLInvFVBridge::createBridge(LLAssetType::EType asset_type, +										   LLAssetType::EType actual_asset_type, +										   LLInventoryType::EType inv_type, +										   LLInventoryPanel* inventory, +										   const LLUUID& uuid, +										   U32 flags) +{ +	LLInvFVBridge* new_listener = NULL; +	switch(asset_type) +	{ +		case LLAssetType::AT_TEXTURE: +			if(!(inv_type == LLInventoryType::IT_TEXTURE || inv_type == LLInventoryType::IT_SNAPSHOT)) +			{ +				llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; +			} +			new_listener = new LLTextureBridge(inventory, uuid, inv_type); +			break; + +		case LLAssetType::AT_SOUND: +			if(!(inv_type == LLInventoryType::IT_SOUND)) +			{ +				llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; +			} +			new_listener = new LLSoundBridge(inventory, uuid); +			break; + +		case LLAssetType::AT_LANDMARK: +			if(!(inv_type == LLInventoryType::IT_LANDMARK)) +			{ +				llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; +			} +			new_listener = new LLLandmarkBridge(inventory, uuid, flags); +			break; + +		case LLAssetType::AT_CALLINGCARD: +			if(!(inv_type == LLInventoryType::IT_CALLINGCARD)) +			{ +				llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; +			} +			new_listener = new LLCallingCardBridge(inventory, uuid); +			break; + +		case LLAssetType::AT_SCRIPT: +			if(!(inv_type == LLInventoryType::IT_LSL)) +			{ +				llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; +			} +			new_listener = new LLScriptBridge(inventory, uuid); +			break; + +		case LLAssetType::AT_OBJECT: +			if(!(inv_type == LLInventoryType::IT_OBJECT || inv_type == LLInventoryType::IT_ATTACHMENT)) +			{ +				llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; +			} +			new_listener = new LLObjectBridge(inventory, uuid, inv_type, flags); +			break; + +		case LLAssetType::AT_NOTECARD: +			if(!(inv_type == LLInventoryType::IT_NOTECARD)) +			{ +				llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; +			} +			new_listener = new LLNotecardBridge(inventory, uuid); +			break; + +		case LLAssetType::AT_ANIMATION: +			if(!(inv_type == LLInventoryType::IT_ANIMATION)) +			{ +				llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; +			} +			new_listener = new LLAnimationBridge(inventory, uuid); +			break; + +		case LLAssetType::AT_GESTURE: +			if(!(inv_type == LLInventoryType::IT_GESTURE)) +			{ +				llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; +			} +			new_listener = new LLGestureBridge(inventory, uuid); +			break; + +		case LLAssetType::AT_LSL_TEXT: +			if(!(inv_type == LLInventoryType::IT_LSL)) +			{ +				llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; +			} +			new_listener = new LLLSLTextBridge(inventory, uuid); +			break; + +		case LLAssetType::AT_CLOTHING: +		case LLAssetType::AT_BODYPART: +			if(!(inv_type == LLInventoryType::IT_WEARABLE)) +			{ +				llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; +			} +			new_listener = new LLWearableBridge(inventory, uuid, asset_type, inv_type, (EWearableType)flags); +			break; +		case LLAssetType::AT_CATEGORY: +			if (actual_asset_type == LLAssetType::AT_LINK_FOLDER) +			{ +				// Create a link folder handler instead. +				new_listener = new LLLinkFolderBridge(inventory, uuid); +				break; +			} +			new_listener = new LLFolderBridge(inventory, uuid); +			break; +		case LLAssetType::AT_LINK: +			// Only should happen for broken links. +			new_listener = new LLLinkItemBridge(inventory, uuid); +			break; +		case LLAssetType::AT_LINK_FOLDER: +			// Only should happen for broken links. +			new_listener = new LLLinkItemBridge(inventory, uuid); +			break; +		default: +			llinfos << "Unhandled asset type (llassetstorage.h): " +					<< (S32)asset_type << llendl; +			break; +	} + +	if (new_listener) +	{ +		new_listener->mInvType = inv_type; +	} + +	return new_listener; +} + +void LLInvFVBridge::purgeItem(LLInventoryModel *model, const LLUUID &uuid) +{ +	LLInventoryCategory* cat = model->getCategory(uuid); +	if (cat) +	{ +		model->purgeDescendentsOf(uuid); +		model->notifyObservers(); +	} +	LLInventoryObject* obj = model->getObject(uuid); +	if (obj) +	{ +		model->purgeObject(uuid); +		model->notifyObservers(); +	} +} + +// +=================================================+ +// |        InventoryFVBridgeBuilder                 | +// +=================================================+ +LLInvFVBridge* LLInventoryFVBridgeBuilder::createBridge(LLAssetType::EType asset_type, +														LLAssetType::EType actual_asset_type, +														LLInventoryType::EType inv_type, +														LLInventoryPanel* inventory, +														const LLUUID& uuid, +														U32 flags /* = 0x00 */) const +{ +	return LLInvFVBridge::createBridge(asset_type, +		actual_asset_type, +		inv_type, +		inventory, +		uuid, +		flags); +} + +// +=================================================+ +// |        LLItemBridge                             | +// +=================================================+ + +void LLItemBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +{ +	if ("goto" == action) +	{ +		gotoItem(folder); +	} +	if ("open" == action) +	{ +		openItem(); +		return; +	} +	else if ("properties" == action) +	{ +		showProperties(); +		return; +	} +	else if ("purge" == action) +	{ +		purgeItem(model, mUUID); +		return; +	} +	else if ("restoreToWorld" == action) +	{ +		restoreToWorld(); +		return; +	} +	else if ("restore" == action) +	{ +		restoreItem(); +		return; +	} +	else if ("copy_uuid" == action) +	{ +		// Single item only +		LLInventoryItem* item = model->getItem(mUUID); +		if(!item) return; +		LLUUID asset_id = item->getAssetUUID(); +		std::string buffer; +		asset_id.toString(buffer); + +		gViewerWindow->mWindow->copyTextToClipboard(utf8str_to_wstring(buffer)); +		return; +	} +	else if ("copy" == action) +	{ +		copyToClipboard(); +		return; +	} +	else if ("paste" == action) +	{ +		// Single item only +		LLInventoryItem* itemp = model->getItem(mUUID); +		if (!itemp) return; + +		LLFolderViewItem* folder_view_itemp = folder->getItemByID(itemp->getParentUUID()); +		if (!folder_view_itemp) return; + +		folder_view_itemp->getListener()->pasteFromClipboard(); +		return; +	} +	else if ("paste_link" == action) +	{ +		// Single item only +		LLInventoryItem* itemp = model->getItem(mUUID); +		if (!itemp) return; + +		LLFolderViewItem* folder_view_itemp = folder->getItemByID(itemp->getParentUUID()); +		if (!folder_view_itemp) return; + +		folder_view_itemp->getListener()->pasteLinkFromClipboard(); +		return; +	} +} + +void LLItemBridge::selectItem() +{ +	LLViewerInventoryItem* item = (LLViewerInventoryItem*)getItem(); +	if(item && !item->isComplete()) +	{ +		item->fetchFromServer(); +	} +} + +void LLItemBridge::restoreItem() +{ +	LLViewerInventoryItem* item = (LLViewerInventoryItem*)getItem(); +	if(item) +	{ +		LLInventoryModel* model = getInventoryModel(); +		const LLUUID new_parent = model->findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(item->getType())); +		// do not restamp on restore. +		LLInvFVBridge::changeItemParent(model, item, new_parent, FALSE); +	} +} + +void LLItemBridge::restoreToWorld() +{ +	LLViewerInventoryItem* itemp = (LLViewerInventoryItem*)getItem(); +	if (itemp) +	{ +		LLMessageSystem* msg = gMessageSystem; +		msg->newMessage("RezRestoreToWorld"); +		msg->nextBlockFast(_PREHASH_AgentData); +		msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); +		msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + +		msg->nextBlockFast(_PREHASH_InventoryData); +		itemp->packMessage(msg); +		msg->sendReliable(gAgent.getRegion()->getHost()); +	} + +	//Similar functionality to the drag and drop rez logic +	BOOL remove_from_inventory = FALSE; + +	//remove local inventory copy, sim will deal with permissions and removing the item +	//from the actual inventory if its a no-copy etc +	if(!itemp->getPermissions().allowCopyBy(gAgent.getID())) +	{ +		remove_from_inventory = TRUE; +	} + +	// Check if it's in the trash. (again similar to the normal rez logic) +	const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); +	if(gInventory.isObjectDescendentOf(itemp->getUUID(), trash_id)) +	{ +		remove_from_inventory = TRUE; +	} + +	if(remove_from_inventory) +	{ +		gInventory.deleteObject(itemp->getUUID()); +		gInventory.notifyObservers(); +	} +} + +void LLItemBridge::gotoItem(LLFolderView *folder) +{ +	LLInventoryObject *obj = getInventoryObject(); +	if (obj && obj->getIsLinkType()) +	{ +		LLInventoryPanel* active_panel = LLFloaterInventory::getActiveInventory()->getPanel(); +		if (active_panel) +		{ +			active_panel->setSelection(obj->getLinkedUUID(), TAKE_FOCUS_NO); +		} +	} +} + +LLUIImagePtr LLItemBridge::getIcon() const +{ +	return LLUI::getUIImage(ICON_NAME[OBJECT_ICON_NAME]); +} + +PermissionMask LLItemBridge::getPermissionMask() const +{ +	LLViewerInventoryItem* item = getItem(); +	PermissionMask perm_mask = 0; +	if(item) +	{ +		BOOL copy = item->getPermissions().allowCopyBy(gAgent.getID()); +		BOOL mod = item->getPermissions().allowModifyBy(gAgent.getID()); +		BOOL xfer = item->getPermissions().allowOperationBy(PERM_TRANSFER, +															gAgent.getID()); + +		if (copy) perm_mask |= PERM_COPY; +		if (mod)  perm_mask |= PERM_MODIFY; +		if (xfer) perm_mask |= PERM_TRANSFER; + +	} +	return perm_mask; +} + +const std::string& LLItemBridge::getDisplayName() const +{ +	if(mDisplayName.empty()) +	{ +		buildDisplayName(getItem(), mDisplayName); +	} +	return mDisplayName; +} + +void LLItemBridge::buildDisplayName(LLInventoryItem* item, std::string& name) +{ +	if(item) +	{ +		name.assign(item->getName()); +	} +	else +	{ +		name.assign(LLStringUtil::null); +	} +} + +LLFontGL::StyleFlags LLItemBridge::getLabelStyle() const +{ +	U8 font = LLFontGL::NORMAL; + +	if( gAgentWearables.isWearingItem( mUUID ) ) +	{ +		// llinfos << "BOLD" << llendl; +		font |= LLFontGL::BOLD; +	} + +	const LLViewerInventoryItem* item = getItem(); +	if (item && item->getIsLinkType()) +	{ +		font |= LLFontGL::ITALIC; +	} +	return (LLFontGL::StyleFlags)font; +} + +std::string LLItemBridge::getLabelSuffix() const +{ +	// String table is loaded before login screen and inventory items are +	// loaded after login, so LLTrans should be ready. +	static std::string NO_COPY =LLTrans::getString("no_copy"); +	static std::string NO_MOD = LLTrans::getString("no_modify"); +	static std::string NO_XFER = LLTrans::getString("no_transfer"); +	static std::string LINK = LLTrans::getString("link"); +	static std::string BROKEN_LINK = LLTrans::getString("broken_link"); +	std::string suffix; +	LLInventoryItem* item = getItem(); +	if(item) +	{ +		// it's a bit confusing to put nocopy/nomod/etc on calling cards. +		if(LLAssetType::AT_CALLINGCARD != item->getType() +		   && item->getPermissions().getOwner() == gAgent.getID()) +		{ +			BOOL broken_link = LLAssetType::lookupIsLinkType(item->getType()); +			if (broken_link) return BROKEN_LINK; + +			BOOL link = item->getIsLinkType(); +			if (link) return LINK; + +			BOOL copy = item->getPermissions().allowCopyBy(gAgent.getID()); +			if (!copy) +			{ +				suffix += NO_COPY; +			} +			BOOL mod = item->getPermissions().allowModifyBy(gAgent.getID()); +			if (!mod) +			{ +				suffix += NO_MOD; +			} +			BOOL xfer = item->getPermissions().allowOperationBy(PERM_TRANSFER, +																gAgent.getID()); +			if (!xfer) +			{ +				suffix += NO_XFER; +			} +		} +	} +	return suffix; +} + +time_t LLItemBridge::getCreationDate() const +{ +	LLViewerInventoryItem* item = getItem(); +	if (item) +	{ +		return item->getCreationDate(); +	} +	return 0; +} + + +BOOL LLItemBridge::isItemRenameable() const +{ +	LLViewerInventoryItem* item = getItem(); +	if(item) +	{ +		// (For now) Don't allow calling card rename since that may confuse users as to +		// what the calling card points to. +		if (item->getInventoryType() == LLInventoryType::IT_CALLINGCARD) +		{ +			return FALSE; +		} +		return (item->getPermissions().allowModifyBy(gAgent.getID())); +	} +	return FALSE; +} + +BOOL LLItemBridge::renameItem(const std::string& new_name) +{ +	if(!isItemRenameable()) +		return FALSE; +	LLPreview::dirty(mUUID); +	LLInventoryModel* model = getInventoryModel(); +	if(!model) +		return FALSE; +	LLViewerInventoryItem* item = getItem(); +	if(item && (item->getName() != new_name)) +	{ +		LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); +		new_item->rename(new_name); +		buildDisplayName(new_item, mDisplayName); +		new_item->updateServer(FALSE); +		model->updateItem(new_item); + +		model->notifyObservers(); +	} +	// return FALSE because we either notified observers (& therefore +	// rebuilt) or we didn't update. +	return FALSE; +} + + +BOOL LLItemBridge::removeItem() +{ +	if(!isItemRemovable()) +	{ +		return FALSE; +	} +	// move it to the trash +	LLPreview::hide(mUUID, TRUE); +	LLInventoryModel* model = getInventoryModel(); +	if(!model) return FALSE; +	const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); +	LLViewerInventoryItem* item = getItem(); + +	// if item is not already in trash +	if(item && !model->isObjectDescendentOf(mUUID, trash_id)) +	{ +		// move to trash, and restamp +		LLInvFVBridge::changeItemParent(model, item, trash_id, TRUE); +		// delete was successful +		return TRUE; +	} +	else +	{ +		// tried to delete already item in trash (should purge?) +		return FALSE; +	} +} + +BOOL LLItemBridge::isItemCopyable() const +{ +	LLViewerInventoryItem* item = getItem(); +	if (item) +	{ +		// can't copy worn objects. DEV-15183 +		LLVOAvatarSelf *avatarp = gAgent.getAvatarObject(); +		if( !avatarp ) +		{ +			return FALSE; +		} + +		if(avatarp->isWearingAttachment(mUUID)) +		{ +			return FALSE; +		} + +		// All items can be copied, not all can be pasted. +		// The only time an item can't be copied is if it's a link +		// return (item->getPermissions().allowCopyBy(gAgent.getID())); +		if (item->getIsLinkType()) +		{ +			return FALSE; +		} +		return TRUE; +	} +	return FALSE; +} +BOOL LLItemBridge::copyToClipboard() const +{ +	if(isItemCopyable()) +	{ +		LLInventoryClipboard::instance().add(mUUID); +		return TRUE; +	} +	return FALSE; +} + +LLViewerInventoryItem* LLItemBridge::getItem() const +{ +	LLViewerInventoryItem* item = NULL; +	LLInventoryModel* model = getInventoryModel(); +	if(model) +	{ +		item = (LLViewerInventoryItem*)model->getItem(mUUID); +	} +	return item; +} + +BOOL LLItemBridge::isItemPermissive() const +{ +	LLViewerInventoryItem* item = getItem(); +	if(item) +	{ +		U32 mask = item->getPermissions().getMaskBase(); +		if((mask & PERM_ITEM_UNRESTRICTED) == PERM_ITEM_UNRESTRICTED) +		{ +			return TRUE; +		} +	} +	return FALSE; +} + +// +=================================================+ +// |        LLFolderBridge                           | +// +=================================================+ + +LLFolderBridge* LLFolderBridge::sSelf=NULL; + +// Can be moved to another folder +BOOL LLFolderBridge::isItemMovable() const +{ +	LLInventoryObject* obj = getInventoryObject(); +	if(obj) +	{ +		return (!LLFolderType::lookupIsProtectedType(((LLInventoryCategory*)obj)->getPreferredType())); +	} +	return FALSE; +} + +void LLFolderBridge::selectItem() +{ +} + + +// Iterate through a folder's children to determine if +// all the children are removable. +class LLIsItemRemovable : public LLFolderViewFunctor +{ +public: +	LLIsItemRemovable() : mPassed(TRUE) {} +	virtual void doFolder(LLFolderViewFolder* folder) +	{ +		mPassed &= folder->getListener()->isItemRemovable(); +	} +	virtual void doItem(LLFolderViewItem* item) +	{ +		mPassed &= item->getListener()->isItemRemovable(); +	} +	BOOL mPassed; +}; + +// Can be destroyed (or moved to trash) +BOOL LLFolderBridge::isItemRemovable() +{ +	LLInventoryModel* model = getInventoryModel(); +	if(!model) +	{ +		return FALSE; +	} + +	if(!model->isObjectDescendentOf(mUUID, gInventory.getRootFolderID())) +	{ +		return FALSE; +	} + +	LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); +	if( !avatar ) +	{ +		return FALSE; +	} + +	LLInventoryCategory* category = model->getCategory(mUUID); +	if( !category ) +	{ +		return FALSE; +	} +	// Allow protected types to be removed, but issue a warning. +	/* +	if(LLFolderType::lookupIsProtectedType(category->getPreferredType())) +	{ +		return FALSE; +	} +	*/ + +	LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); +	LLFolderViewFolder* folderp = dynamic_cast<LLFolderViewFolder*>(panel ? panel->getRootFolder()->getItemByID(mUUID) : NULL); +	if (folderp) +	{ +		LLIsItemRemovable folder_test; +		folderp->applyFunctorToChildren(folder_test); +		if (!folder_test.mPassed) +		{ +			return FALSE; +		} +	} +	return TRUE; +} + +BOOL LLFolderBridge::isUpToDate() const +{ +	LLInventoryModel* model = getInventoryModel(); +	if(!model) return FALSE; +	LLViewerInventoryCategory* category = (LLViewerInventoryCategory*)model->getCategory(mUUID); +	if( !category ) +	{ +		return FALSE; +	} + +	return category->getVersion() != LLViewerInventoryCategory::VERSION_UNKNOWN; +} + +BOOL LLFolderBridge::isItemCopyable() const +{ +	return TRUE; +} + +BOOL LLFolderBridge::copyToClipboard() const +{ +	if(isItemCopyable()) +	{ +		LLInventoryClipboard::instance().add(mUUID); +		return TRUE; +	} +	return FALSE; +} + +BOOL LLFolderBridge::isClipboardPasteable() const +{ +	if ( ! LLInvFVBridge::isClipboardPasteable() ) +		return FALSE; + +	// Don't allow pasting duplicates to the Calling Card/Friends subfolders, see bug EXT-1599 +	if ( LLFriendCardsManager::instance().isCategoryInFriendFolder( getCategory() ) ) +	{ +		LLInventoryModel* model = getInventoryModel(); +		if ( !model ) +		{ +			return FALSE; +		} + +		LLDynamicArray<LLUUID> objects; +		LLInventoryClipboard::instance().retrieve(objects); +		const LLViewerInventoryCategory *current_cat = getCategory(); + +		// Search for the direct descendent of current Friends subfolder among all pasted items, +		// and return false if is found. +		for(S32 i = objects.count() - 1; i >= 0; --i) +		{ +			const LLUUID &obj_id = objects.get(i); +			if ( LLFriendCardsManager::instance().isObjDirectDescendentOfCategory(model->getObject(obj_id), current_cat) ) +			{ +				return FALSE; +			} +		} + +	} +	return TRUE; +} + +BOOL LLFolderBridge::isClipboardPasteableAsLink() const +{ +	// Check normal paste-as-link permissions +	if (!LLInvFVBridge::isClipboardPasteableAsLink()) +	{ +		return FALSE; +	} + +	const LLInventoryModel* model = getInventoryModel(); +	if (!model) +	{ +		return FALSE; +	} + +	const LLViewerInventoryCategory *current_cat = getCategory(); +	if (current_cat) +	{ +		const BOOL is_in_friend_folder = LLFriendCardsManager::instance().isCategoryInFriendFolder( current_cat ); +		const LLUUID ¤t_cat_id = current_cat->getUUID(); +		LLDynamicArray<LLUUID> objects; +		LLInventoryClipboard::instance().retrieve(objects); +		S32 count = objects.count(); +		for(S32 i = 0; i < count; i++) +		{ +			const LLUUID &obj_id = objects.get(i); +			const LLInventoryCategory *cat = model->getCategory(obj_id); +			if (cat) +			{ +				const LLUUID &cat_id = cat->getUUID(); +				// Don't allow recursive pasting +				if ((cat_id == current_cat_id) || +					model->isObjectDescendentOf(current_cat_id, cat_id)) +				{ +					return FALSE; +				} +			} +			// Don't allow pasting duplicates to the Calling Card/Friends subfolders, see bug EXT-1599 +			if ( is_in_friend_folder ) +			{ +				// If object is direct descendent of current Friends subfolder than return false. +				// Note: We can't use 'const LLInventoryCategory *cat', because it may be null +				// in case type of obj_id is LLInventoryItem. +				if ( LLFriendCardsManager::instance().isObjDirectDescendentOfCategory(model->getObject(obj_id), current_cat) ) +				{ +					return FALSE; +				} +			} +		} +	} +	return TRUE; + +} + +BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, +											BOOL drop) +{ +	// This should never happen, but if an inventory item is incorrectly parented, +	// the UI will get confused and pass in a NULL. +	if(!inv_cat) return FALSE; + +	LLInventoryModel* model = getInventoryModel(); +	if(!model) return FALSE; + +	LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); +	if(!avatar) return FALSE; + +	// cannot drag categories into library +	if(!isAgentInventory()) +	{ +		return FALSE; +	} + +	// check to make sure source is agent inventory, and is represented there. +	LLToolDragAndDrop::ESource source = LLToolDragAndDrop::getInstance()->getSource(); +	BOOL is_agent_inventory = (model->getCategory(inv_cat->getUUID()) != NULL) +		&& (LLToolDragAndDrop::SOURCE_AGENT == source); + +	BOOL accept = FALSE; +	S32 i; +	LLInventoryModel::cat_array_t	descendent_categories; +	LLInventoryModel::item_array_t	descendent_items; +	if(is_agent_inventory) +	{ +		const LLUUID& cat_id = inv_cat->getUUID(); + +		// Is the destination the trash? +		const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); +		BOOL move_is_into_trash = (mUUID == trash_id) +				|| model->isObjectDescendentOf(mUUID, trash_id); +		BOOL is_movable = (!LLFolderType::lookupIsProtectedType(inv_cat->getPreferredType())); +		const LLUUID current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); +		BOOL move_is_into_current_outfit = (mUUID == current_outfit_id); +		BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT); +		if (move_is_into_current_outfit || move_is_into_outfit) +		{ +			// BAP - restrictions? +			is_movable = true; +		} + +		if (mUUID == gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE)) +		{ +			is_movable = FALSE; // It's generally movable but not into Favorites folder. EXT-1604 +		} + +		if( is_movable ) +		{ +			gInventory.collectDescendents( cat_id, descendent_categories, descendent_items, FALSE ); + +			for( i = 0; i < descendent_categories.count(); i++ ) +			{ +				LLInventoryCategory* category = descendent_categories[i]; +				if(LLFolderType::lookupIsProtectedType(category->getPreferredType())) +				{ +					// ...can't move "special folders" like Textures +					is_movable = FALSE; +					break; +				} +			} + +			if( is_movable ) +			{ +				if( move_is_into_trash ) +				{ +					for( i = 0; i < descendent_items.count(); i++ ) +					{ +						LLInventoryItem* item = descendent_items[i]; +						if( (item->getType() == LLAssetType::AT_CLOTHING) || +							(item->getType() == LLAssetType::AT_BODYPART) ) +						{ +							if( gAgentWearables.isWearingItem( item->getUUID() ) ) +							{ +								is_movable = FALSE;  // It's generally movable, but not into the trash! +								break; +							} +						} +						else +						if( item->getType() == LLAssetType::AT_OBJECT ) +						{ +							if( avatar->isWearingAttachment( item->getUUID() ) ) +							{ +								is_movable = FALSE;  // It's generally movable, but not into the trash! +								break; +							} +						} +					} +				} +			} +		} + + +		accept =	is_movable +					&& (mUUID != cat_id)								// Can't move a folder into itself +					&& (mUUID != inv_cat->getParentUUID())				// Avoid moves that would change nothing +					&& !(model->isObjectDescendentOf(mUUID, cat_id));	// Avoid circularity +		if(accept && drop) +		{ +			// Look for any gestures and deactivate them +			if (move_is_into_trash) +			{ +				for (i = 0; i < descendent_items.count(); i++) +				{ +					LLInventoryItem* item = descendent_items[i]; +					if (item->getType() == LLAssetType::AT_GESTURE +						&& LLGestureManager::instance().isGestureActive(item->getUUID())) +					{ +						LLGestureManager::instance().deactivateGesture(item->getUUID()); +					} +				} +			} +			// if target is an outfit or current outfit folder we use link +			if (move_is_into_current_outfit || move_is_into_outfit) +			{ +				if (inv_cat->getPreferredType() == LLFolderType::FT_NONE) +				{ +					if (move_is_into_current_outfit) +					{ +						// traverse category and add all contents to currently worn. +						BOOL append = true; +						LLAppearanceManager::instance().wearInventoryCategory(inv_cat, false, append); +					} +					else +					{ +						// Recursively create links in target outfit. +						LLInventoryModel::cat_array_t cats; +						LLInventoryModel::item_array_t items; +						gInventory.collectDescendents(inv_cat->getUUID(), cats, items, LLInventoryModel::EXCLUDE_TRASH); +						LLAppearanceManager::instance().linkAll(mUUID,items,NULL); +					} +				} +				else +				{ +#if SUPPORT_ENSEMBLES +				// BAP - should skip if dup. +				if (move_is_into_current_outfit) +				{ +					LLAppearanceManager::instance().addEnsembleLink(inv_cat); +				} +				else +				{ +					LLPointer<LLInventoryCallback> cb = NULL; +					link_inventory_item( +						gAgent.getID(), +						inv_cat->getUUID(), +						mUUID, +						inv_cat->getName(), +						LLAssetType::AT_LINK_FOLDER, +						cb); +				} +#endif +				} +			} +			else +			{ + +				// Reparent the folder and restamp children if it's moving +				// into trash. +				LLInvFVBridge::changeCategoryParent( +					model, +					(LLViewerInventoryCategory*)inv_cat, +					mUUID, +					move_is_into_trash); +			} +		} +	} +	else if(LLToolDragAndDrop::SOURCE_WORLD == source) +	{ +		// content category has same ID as object itself +		LLUUID object_id = inv_cat->getUUID(); +		LLUUID category_id = mUUID; +		accept = move_inv_category_world_to_agent(object_id, category_id, drop); +	} +	return accept; +} + +void warn_move_inventory(LLViewerObject* object, LLMoveInv* move_inv) +{ +	const char* dialog = NULL; +	if (object->flagScripted()) +	{ +		dialog = "MoveInventoryFromScriptedObject"; +	} +	else +	{ +		dialog = "MoveInventoryFromObject"; +	} +	LLNotificationsUtil::add(dialog, LLSD(), LLSD(), boost::bind(move_task_inventory_callback, _1, _2, move_inv)); +} + +// Move/copy all inventory items from the Contents folder of an in-world +// object to the agent's inventory, inside a given category. +BOOL move_inv_category_world_to_agent(const LLUUID& object_id, +									  const LLUUID& category_id, +									  BOOL drop, +									  void (*callback)(S32, void*), +									  void* user_data) +{ +	// Make sure the object exists. If we allowed dragging from +	// anonymous objects, it would be possible to bypass +	// permissions. +	// content category has same ID as object itself +	LLViewerObject* object = gObjectList.findObject(object_id); +	if(!object) +	{ +		llinfos << "Object not found for drop." << llendl; +		return FALSE; +	} + +	// this folder is coming from an object, as there is only one folder in an object, the root, +	// we need to collect the entire contents and handle them as a group +	InventoryObjectList inventory_objects; +	object->getInventoryContents(inventory_objects); + +	if (inventory_objects.empty()) +	{ +		llinfos << "Object contents not found for drop." << llendl; +		return FALSE; +	} + +	BOOL accept = TRUE; +	BOOL is_move = FALSE; + +	// coming from a task. Need to figure out if the person can +	// move/copy this item. +	InventoryObjectList::iterator it = inventory_objects.begin(); +	InventoryObjectList::iterator end = inventory_objects.end(); +	for ( ; it != end; ++it) +	{ +		// coming from a task. Need to figure out if the person can +		// move/copy this item. +		LLPermissions perm(((LLInventoryItem*)((LLInventoryObject*)(*it)))->getPermissions()); +		if((perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID()) +			&& perm.allowTransferTo(gAgent.getID()))) +//			|| gAgent.isGodlike()) +		{ +			accept = TRUE; +		} +		else if(object->permYouOwner()) +		{ +			// If the object cannot be copied, but the object the +			// inventory is owned by the agent, then the item can be +			// moved from the task to agent inventory. +			is_move = TRUE; +			accept = TRUE; +		} +		else +		{ +			accept = FALSE; +			break; +		} +	} + +	if(drop && accept) +	{ +		it = inventory_objects.begin(); +		InventoryObjectList::iterator first_it = inventory_objects.begin(); +		LLMoveInv* move_inv = new LLMoveInv; +		move_inv->mObjectID = object_id; +		move_inv->mCategoryID = category_id; +		move_inv->mCallback = callback; +		move_inv->mUserData = user_data; + +		for ( ; it != end; ++it) +		{ +			two_uuids_t two(category_id, (*it)->getUUID()); +			move_inv->mMoveList.push_back(two); +		} + +		if(is_move) +		{ +			// Callback called from within here. +			warn_move_inventory(object, move_inv); +		} +		else +		{ +			LLNotification::Params params("MoveInventoryFromObject"); +			params.functor.function(boost::bind(move_task_inventory_callback, _1, _2, move_inv)); +			LLNotifications::instance().forceResponse(params, 0); +		} +	} +	return accept; +} + +bool LLFindCOFValidItems::operator()(LLInventoryCategory* cat, +									 LLInventoryItem* item) +{ +	// Valid COF items are: +	// - links to wearables (body parts or clothing) +	// - links to attachments +	// - links to gestures +	// - links to ensemble folders +	LLViewerInventoryItem *linked_item = ((LLViewerInventoryItem*)item)->getLinkedItem(); // BAP - safe? +	if (linked_item) +	{ +		LLAssetType::EType type = linked_item->getType(); +		return (type == LLAssetType::AT_CLOTHING || +				type == LLAssetType::AT_BODYPART || +				type == LLAssetType::AT_GESTURE || +				type == LLAssetType::AT_OBJECT); +	} +	else +	{ +		LLViewerInventoryCategory *linked_category = ((LLViewerInventoryItem*)item)->getLinkedCategory(); // BAP - safe? +		// BAP remove AT_NONE support after ensembles are fully working? +		return (linked_category && +				((linked_category->getPreferredType() == LLFolderType::FT_NONE) || +				 (LLFolderType::lookupIsEnsembleType(linked_category->getPreferredType())))); +	} +} + + +bool LLFindWearables::operator()(LLInventoryCategory* cat, +								 LLInventoryItem* item) +{ +	if(item) +	{ +		if((item->getType() == LLAssetType::AT_CLOTHING) +		   || (item->getType() == LLAssetType::AT_BODYPART)) +		{ +			return TRUE; +		} +	} +	return FALSE; +} + + + +//Used by LLFolderBridge as callback for directory recursion. +class LLRightClickInventoryFetchObserver : public LLInventoryFetchObserver +{ +public: +	LLRightClickInventoryFetchObserver() : +		mCopyItems(false) +	{ }; +	LLRightClickInventoryFetchObserver(const LLUUID& cat_id, bool copy_items) : +		mCatID(cat_id), +		mCopyItems(copy_items) +		{ }; +	virtual void done() +	{ +		// we've downloaded all the items, so repaint the dialog +		LLFolderBridge::staticFolderOptionsMenu(); + +		gInventory.removeObserver(this); +		delete this; +	} + + +protected: +	LLUUID mCatID; +	bool mCopyItems; + +}; + +//Used by LLFolderBridge as callback for directory recursion. +class LLRightClickInventoryFetchDescendentsObserver : public LLInventoryFetchDescendentsObserver +{ +public: +	LLRightClickInventoryFetchDescendentsObserver(bool copy_items) : mCopyItems(copy_items) {} +	~LLRightClickInventoryFetchDescendentsObserver() {} +	virtual void done(); +protected: +	bool mCopyItems; +}; + +void LLRightClickInventoryFetchDescendentsObserver::done() +{ +	// Avoid passing a NULL-ref as mCompleteFolders.front() down to +	// gInventory.collectDescendents() +	if( mCompleteFolders.empty() ) +	{ +		llwarns << "LLRightClickInventoryFetchDescendentsObserver::done with empty mCompleteFolders" << llendl; +		dec_busy_count(); +		gInventory.removeObserver(this); +		delete this; +		return; +	} + +	// What we do here is get the complete information on the items in +	// the library, and set up an observer that will wait for that to +	// happen. +	LLInventoryModel::cat_array_t cat_array; +	LLInventoryModel::item_array_t item_array; +	gInventory.collectDescendents(mCompleteFolders.front(), +								  cat_array, +								  item_array, +								  LLInventoryModel::EXCLUDE_TRASH); +	S32 count = item_array.count(); +#if 0 // HACK/TODO: Why? +	// This early causes a giant menu to get produced, and doesn't seem to be needed. +	if(!count) +	{ +		llwarns << "Nothing fetched in category " << mCompleteFolders.front() +				<< llendl; +		dec_busy_count(); +		gInventory.removeObserver(this); +		delete this; +		return; +	} +#endif + +	LLRightClickInventoryFetchObserver* outfit; +	outfit = new LLRightClickInventoryFetchObserver(mCompleteFolders.front(), mCopyItems); +	LLInventoryFetchObserver::item_ref_t ids; +	for(S32 i = 0; i < count; ++i) +	{ +		ids.push_back(item_array.get(i)->getUUID()); +	} + +	// clean up, and remove this as an observer since the call to the +	// outfit could notify observers and throw us into an infinite +	// loop. +	dec_busy_count(); +	gInventory.removeObserver(this); +	delete this; + +	// increment busy count and either tell the inventory to check & +	// call done, or add this object to the inventory for observation. +	inc_busy_count(); + +	// do the fetch +	outfit->fetchItems(ids); +	outfit->done();				//Not interested in waiting and this will be right 99% of the time. +//Uncomment the following code for laggy Inventory UI. +/*	if(outfit->isEverythingComplete()) +	{ +		// everything is already here - call done. +		outfit->done(); +	} +	else +	{ +		// it's all on it's way - add an observer, and the inventory +		// will call done for us when everything is here. +		gInventory.addObserver(outfit); +	}*/ +} + + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLInventoryWearObserver +// +// Observer for "copy and wear" operation to support knowing +// when the all of the contents have been added to inventory. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLInventoryCopyAndWearObserver : public LLInventoryObserver +{ +public: +	LLInventoryCopyAndWearObserver(const LLUUID& cat_id, int count) :mCatID(cat_id), mContentsCount(count), mFolderAdded(FALSE) {} +	virtual ~LLInventoryCopyAndWearObserver() {} +	virtual void changed(U32 mask); + +protected: +	LLUUID mCatID; +	int    mContentsCount; +	BOOL   mFolderAdded; +}; + + + +void LLInventoryCopyAndWearObserver::changed(U32 mask) +{ +	if((mask & (LLInventoryObserver::ADD)) != 0) +	{ +		if (!mFolderAdded) +		{ +			const std::set<LLUUID>& changed_items = gInventory.getChangedIDs(); + +			std::set<LLUUID>::const_iterator id_it = changed_items.begin(); +			std::set<LLUUID>::const_iterator id_end = changed_items.end(); +			for (;id_it != id_end; ++id_it) +			{ +				if ((*id_it) == mCatID) +				{ +					mFolderAdded = TRUE; +					break; +				} +			} +		} + +		if (mFolderAdded) +		{ +			LLViewerInventoryCategory* category = gInventory.getCategory(mCatID); + +			if (NULL == category) +			{ +				llwarns << "gInventory.getCategory(" << mCatID +					<< ") was NULL" << llendl; +			} +			else +			{ +				if (category->getDescendentCount() == +				    mContentsCount) +				{ +					gInventory.removeObserver(this); +					LLAppearanceManager::instance().wearInventoryCategory(category, FALSE, TRUE); +					delete this; +				} +			} +		} + +	} +} + + + +void LLFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +{ +	if ("open" == action) +	{ +		openItem(); +		return; +	} +	else if ("paste" == action) +	{ +		pasteFromClipboard(); +		return; +	} +	else if ("paste_link" == action) +	{ +		pasteLinkFromClipboard(); +		return; +	} +	else if ("properties" == action) +	{ +		showProperties(); +		return; +	} +	else if ("replaceoutfit" == action) +	{ +		modifyOutfit(FALSE); +		return; +	} +#if SUPPORT_ENSEMBLES +	else if ("wearasensemble" == action) +	{ +		LLInventoryModel* model = getInventoryModel(); +		if(!model) return; +		LLViewerInventoryCategory* cat = getCategory(); +		if(!cat) return; +		LLAppearanceManager::instance().addEnsembleLink(cat,true); +		return; +	} +#endif +	else if ("addtooutfit" == action) +	{ +		modifyOutfit(TRUE); +		return; +	} +	else if ("copy" == action) +	{ +		copyToClipboard(); +		return; +	} +	else if ("removefromoutfit" == action) +	{ +		LLInventoryModel* model = getInventoryModel(); +		if(!model) return; +		LLViewerInventoryCategory* cat = getCategory(); +		if(!cat) return; + +		remove_inventory_category_from_avatar ( cat ); +		return; +	} +	else if ("purge" == action) +	{ +		purgeItem(model, mUUID); +		return; +	} +	else if ("restore" == action) +	{ +		restoreItem(); +		return; +	} +} + +void LLFolderBridge::openItem() +{ +	lldebugs << "LLFolderBridge::openItem()" << llendl; +	LLInventoryModel* model = getInventoryModel(); +	if(!model) return; +	if(mUUID.isNull()) return; +	bool fetching_inventory = model->fetchDescendentsOf(mUUID); +	// Only change folder type if we have the folder contents. +	if (!fetching_inventory) +	{ +		// Disabling this for now, it's causing crash when new items are added to folders +		// since folder type may change before new item item has finished processing. +		// determineFolderType(); +	} +} + +void LLFolderBridge::closeItem() +{ +	determineFolderType(); +} + +void LLFolderBridge::determineFolderType() +{ +	if (isUpToDate()) +	{ +		LLInventoryModel* model = getInventoryModel(); +		LLViewerInventoryCategory* category = model->getCategory(mUUID); +		category->determineFolderType(); +	} +} + +BOOL LLFolderBridge::isItemRenameable() const +{ +	LLViewerInventoryCategory* cat = (LLViewerInventoryCategory*)getCategory(); +	if(cat && !LLFolderType::lookupIsProtectedType(cat->getPreferredType()) +	   && (cat->getOwnerID() == gAgent.getID())) +	{ +		return TRUE; +	} +	return FALSE; +} + +void LLFolderBridge::restoreItem() +{ +	LLViewerInventoryCategory* cat; +	cat = (LLViewerInventoryCategory*)getCategory(); +	if(cat) +	{ +		LLInventoryModel* model = getInventoryModel(); +		const LLUUID new_parent = model->findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(cat->getType())); +		// do not restamp children on restore +		LLInvFVBridge::changeCategoryParent(model, cat, new_parent, FALSE); +	} +} + +LLFolderType::EType LLFolderBridge::getPreferredType() const +{ +	LLFolderType::EType preferred_type = LLFolderType::FT_NONE; +	LLViewerInventoryCategory* cat = getCategory(); +	if(cat) +	{ +		preferred_type = cat->getPreferredType(); +	} + +	return preferred_type; +} + +// Icons for folders are based on the preferred type +LLUIImagePtr LLFolderBridge::getIcon() const +{ +	LLFolderType::EType preferred_type = LLFolderType::FT_NONE; +	LLViewerInventoryCategory* cat = getCategory(); +	if(cat) +	{ +		preferred_type = cat->getPreferredType(); +	} +	return getIcon(preferred_type); +} + +LLUIImagePtr LLFolderBridge::getIcon(LLFolderType::EType preferred_type) +{ +	// we only have one folder image now +	return LLUI::getUIImage("Inv_FolderClosed"); +} + +BOOL LLFolderBridge::renameItem(const std::string& new_name) +{ +	if(!isItemRenameable()) +		return FALSE; +	LLInventoryModel* model = getInventoryModel(); +	if(!model) +		return FALSE; +	LLViewerInventoryCategory* cat = getCategory(); +	if(cat && (cat->getName() != new_name)) +	{ +		LLPointer<LLViewerInventoryCategory> new_cat = new LLViewerInventoryCategory(cat); +		new_cat->rename(new_name); +		new_cat->updateServer(FALSE); +		model->updateCategory(new_cat); + +		model->notifyObservers(); +	} +	// return FALSE because we either notified observers (& therefore +	// rebuilt) or we didn't update. +	return FALSE; +} + +BOOL LLFolderBridge::removeItem() +{ +	if(!isItemRemovable()) +	{ +		return FALSE; +	} +	const LLViewerInventoryCategory *cat = getCategory(); +	 +	LLSD payload; +	LLSD args; +	args["FOLDERNAME"] = cat->getName(); + +	LLNotification::Params params("ConfirmDeleteProtectedCategory"); +	params.payload(payload).substitutions(args).functor.function(boost::bind(&LLFolderBridge::removeItemResponse, this, _1, _2)); +	//params.functor.function(boost::bind(&LLFolderBridge::removeItemResponse, this, _1, _2)); +	/* +	LLNotification::Params params("ChangeLindenEstate"); +	params.functor.function(boost::bind(&LLPanelEstateInfo::callbackChangeLindenEstate, this, _1, _2)); +	*/ +	if (LLFolderType::lookupIsProtectedType(cat->getPreferredType())) +	{ +		LLNotifications::instance().add(params); +	} +	else +	{ +		LLNotifications::instance().forceResponse(params, 0); +	} +	return TRUE; +} + +bool LLFolderBridge::removeItemResponse(const LLSD& notification, const LLSD& response) +{ +	S32 option = LLNotification::getSelectedOption(notification, response); + +	// if they choose delete, do it.  Otherwise, don't do anything +	if(option == 0)  +	{ +		// move it to the trash +		LLPreview::hide(mUUID); +		LLInventoryModel* model = getInventoryModel(); +		if(!model) return FALSE; +		 +		const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); +		 +		// Look for any gestures and deactivate them +		LLInventoryModel::cat_array_t	descendent_categories; +		LLInventoryModel::item_array_t	descendent_items; +		gInventory.collectDescendents( mUUID, descendent_categories, descendent_items, FALSE ); +		 +		S32 i; +		for (i = 0; i < descendent_items.count(); i++) +		{ +			LLInventoryItem* item = descendent_items[i]; +			if (item->getType() == LLAssetType::AT_GESTURE +				&& LLGestureManager::instance().isGestureActive(item->getUUID())) +			{ +				LLGestureManager::instance().deactivateGesture(item->getUUID()); +			} +		} +		 +		// go ahead and do the normal remove if no 'last calling +		// cards' are being removed. +		LLViewerInventoryCategory* cat = getCategory(); +		if(cat) +		{ +			LLInvFVBridge::changeCategoryParent(model, cat, trash_id, TRUE); +		} +		return TRUE; +	} +	return FALSE; +} + +void LLFolderBridge::pasteFromClipboard() +{ +	LLInventoryModel* model = getInventoryModel(); +	if(model && isClipboardPasteable()) +	{ +		LLInventoryItem* item = NULL; +		LLDynamicArray<LLUUID> objects; +		LLInventoryClipboard::instance().retrieve(objects); +		S32 count = objects.count(); +		const LLUUID parent_id(mUUID); +		for(S32 i = 0; i < count; i++) +		{ +			item = model->getItem(objects.get(i)); +			if (item) +			{ +				if(LLInventoryClipboard::instance().isCutMode()) +				{ +					// move_inventory_item() is not enough, +					//we have to update inventory locally too +					changeItemParent(model, dynamic_cast<LLViewerInventoryItem*>(item), parent_id, FALSE); +				} +				else +				{ +					copy_inventory_item( +						gAgent.getID(), +						item->getPermissions().getOwner(), +						item->getUUID(), +						parent_id, +						std::string(), +						LLPointer<LLInventoryCallback>(NULL)); +				} +			} +		} +	} +} + +void LLFolderBridge::pasteLinkFromClipboard() +{ +	const LLInventoryModel* model = getInventoryModel(); +	if(model) +	{ +		LLDynamicArray<LLUUID> objects; +		LLInventoryClipboard::instance().retrieve(objects); +		S32 count = objects.count(); +		LLUUID parent_id(mUUID); +		for(S32 i = 0; i < count; i++) +		{ +			const LLUUID &object_id = objects.get(i); +#if SUPPORT_ENSEMBLES +			if (LLInventoryCategory *cat = model->getCategory(object_id)) +			{ +				link_inventory_item( +					gAgent.getID(), +					cat->getUUID(), +					parent_id, +					cat->getName(), +					LLAssetType::AT_LINK_FOLDER, +					LLPointer<LLInventoryCallback>(NULL)); +			} +			else +#endif +			if (LLInventoryItem *item = model->getItem(object_id)) +			{ +				link_inventory_item( +					gAgent.getID(), +					item->getLinkedUUID(), +					parent_id, +					item->getName(), +					LLAssetType::AT_LINK, +					LLPointer<LLInventoryCallback>(NULL)); +			} +		} +	} +} + +void LLFolderBridge::staticFolderOptionsMenu() +{ +	if (!sSelf) return; +	sSelf->folderOptionsMenu(); +} + +bool isInOutfitsSidePanel(LLPanel *panel) +{ +	LLInventoryPanel *my_panel = dynamic_cast<LLInventoryPanel*>(panel); +	LLPanelOutfitsInventory *outfit_panel = +		dynamic_cast<LLPanelOutfitsInventory*>(LLSideTray::getInstance()->getPanel("panel_outfits_inventory")); +	if (!outfit_panel) +		return false; +	return outfit_panel->isAccordionPanel(my_panel); + +	//LLInventoryPanel *outfit_inv_panel = outfit_panel ? outfit_panel->getActivePanel(): NULL; +	//return (my_panel && (my_panel == outfit_inv_panel)); +} + +void LLFolderBridge::folderOptionsMenu() +{ +	std::vector<std::string> disabled_items; + +	LLInventoryModel* model = getInventoryModel(); +	if(!model) return; + +	const LLInventoryCategory* category = model->getCategory(mUUID); +	LLFolderType::EType type = category->getPreferredType(); +	const bool is_default_folder = category && LLFolderType::lookupIsProtectedType(type); +	// BAP change once we're no longer treating regular categories as ensembles. +	const bool is_ensemble = category && (type == LLFolderType::FT_NONE || +										  LLFolderType::lookupIsEnsembleType(type)); +	const bool is_sidepanel = isInOutfitsSidePanel(mInventoryPanel.get()); + +	// calling card related functionality for folders. + +	if (is_sidepanel) +	{ +		mItems.clear(); +	} + +	// Only enable calling-card related options for non-default folders. +	if (!is_sidepanel && !is_default_folder) +	{ +		LLIsType is_callingcard(LLAssetType::AT_CALLINGCARD); +		if (mCallingCards || checkFolderForContentsOfType(model, is_callingcard)) +		{ +			mItems.push_back(std::string("Calling Card Separator")); +			mItems.push_back(std::string("Conference Chat Folder")); +			mItems.push_back(std::string("IM All Contacts In Folder")); +		} +	} + +	// wearables related functionality for folders. +	//is_wearable +	LLFindWearables is_wearable; +	LLIsType is_object( LLAssetType::AT_OBJECT ); +	LLIsType is_gesture( LLAssetType::AT_GESTURE ); + +	if (mWearables || +		checkFolderForContentsOfType(model, is_wearable)  || +		checkFolderForContentsOfType(model, is_object) || +		checkFolderForContentsOfType(model, is_gesture) ) +	{ +		mItems.push_back(std::string("Folder Wearables Separator")); + +		// Only enable add/replace outfit for non-default folders. +		if (!is_default_folder) +		{ +			mItems.push_back(std::string("Add To Outfit")); +			mItems.push_back(std::string("Replace Outfit")); +		} +		if (is_ensemble) +		{ +			mItems.push_back(std::string("Wear As Ensemble")); +		} +		mItems.push_back(std::string("Remove From Outfit")); +	} +	hide_context_entries(*mMenu, mItems, disabled_items); + +	// Reposition the menu, in case we're adding items to an existing menu. +	mMenu->needsArrange(); +	mMenu->arrangeAndClear(); +} + +BOOL LLFolderBridge::checkFolderForContentsOfType(LLInventoryModel* model, LLInventoryCollectFunctor& is_type) +{ +	LLInventoryModel::cat_array_t cat_array; +	LLInventoryModel::item_array_t item_array; +	model->collectDescendentsIf(mUUID, +								cat_array, +								item_array, +								LLInventoryModel::EXCLUDE_TRASH, +								is_type); +	return ((item_array.count() > 0) ? TRUE : FALSE ); +} + +// Flags unused +void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ +	mItems.clear(); +	mDisabledItems.clear(); + +	lldebugs << "LLFolderBridge::buildContextMenu()" << llendl; +//	std::vector<std::string> disabled_items; +	LLInventoryModel* model = getInventoryModel(); +	if(!model) return; +	const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); +	const LLUUID lost_and_found_id = model->findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND); + +	mItems.clear(); //adding code to clear out member Items (which means Items should not have other data here at this point) +	mDisabledItems.clear(); //adding code to clear out disabled members from previous +	if (lost_and_found_id == mUUID) +	  { +		// This is the lost+found folder. +		  mItems.push_back(std::string("Empty Lost And Found")); +	  } + +	if(trash_id == mUUID) +	{ +		// This is the trash. +		mItems.push_back(std::string("Empty Trash")); +	} +	else if(model->isObjectDescendentOf(mUUID, trash_id)) +	{ +		// This is a folder in the trash. +		mItems.clear(); // clear any items that used to exist +		mItems.push_back(std::string("Purge Item")); +		if (!isItemRemovable()) +		{ +			mDisabledItems.push_back(std::string("Purge Item")); +		} + +		mItems.push_back(std::string("Restore Item")); +	} +	else if(isAgentInventory()) // do not allow creating in library +	{ +		LLViewerInventoryCategory *cat =  getCategory(); +		// BAP removed protected check to re-enable standard ops in untyped folders. +		// Not sure what the right thing is to do here. +		if (!isCOFFolder() && cat /*&& +			LLAssetType::lookupIsProtectedCategoryType(cat->getPreferredType())*/) +		{ +			// Do not allow to create 2-level subfolder in the Calling Card/Friends folder. EXT-694. +			if (!LLFriendCardsManager::instance().isCategoryInFriendFolder(cat)) +				mItems.push_back(std::string("New Folder")); +			mItems.push_back(std::string("New Script")); +			mItems.push_back(std::string("New Note")); +			mItems.push_back(std::string("New Gesture")); +			mItems.push_back(std::string("New Clothes")); +			mItems.push_back(std::string("New Body Parts")); +			mItems.push_back(std::string("Change Type")); + +			LLViewerInventoryCategory *cat = getCategory(); +			if (cat && LLFolderType::lookupIsProtectedType(cat->getPreferredType())) +			{ +				mDisabledItems.push_back(std::string("Change Type")); +			} + +			getClipboardEntries(false, mItems, mDisabledItems, flags); +		} +		else +		{ +			// Want some but not all of the items from getClipboardEntries for outfits. +			if (cat && cat->getPreferredType()==LLFolderType::FT_OUTFIT) +			{ +				mItems.push_back(std::string("Rename")); +				mItems.push_back(std::string("Delete")); +			} +		} + +		//Added by spatters to force inventory pull on right-click to display folder options correctly. 07-17-06 +		mCallingCards = mWearables = FALSE; + +		LLIsType is_callingcard(LLAssetType::AT_CALLINGCARD); +		if (checkFolderForContentsOfType(model, is_callingcard)) +		{ +			mCallingCards=TRUE; +		} + +		LLFindWearables is_wearable; +		LLIsType is_object( LLAssetType::AT_OBJECT ); +		LLIsType is_gesture( LLAssetType::AT_GESTURE ); + +		if (checkFolderForContentsOfType(model, is_wearable)  || +			checkFolderForContentsOfType(model, is_object) || +			checkFolderForContentsOfType(model, is_gesture) ) +		{ +			mWearables=TRUE; +		} + +		mMenu = &menu; +		sSelf = this; +		LLRightClickInventoryFetchDescendentsObserver* fetch = new LLRightClickInventoryFetchDescendentsObserver(FALSE); + +		LLInventoryFetchDescendentsObserver::folder_ref_t folders; +		LLViewerInventoryCategory* category = (LLViewerInventoryCategory*)model->getCategory(mUUID); +		if (category) +		{ +			folders.push_back(category->getUUID()); +		} +		fetch->fetchDescendents(folders); +		inc_busy_count(); +		if(fetch->isEverythingComplete()) +		{ +			// everything is already here - call done. +			fetch->done(); +		} +		else +		{ +			// it's all on it's way - add an observer, and the inventory +			// will call done for us when everything is here. +			gInventory.addObserver(fetch); +		} +	} +	else +	{ +		mItems.push_back(std::string("--no options--")); +		mDisabledItems.push_back(std::string("--no options--")); +	} +	hide_context_entries(menu, mItems, mDisabledItems); +} + +BOOL LLFolderBridge::hasChildren() const +{ +	LLInventoryModel* model = getInventoryModel(); +	if(!model) return FALSE; +	LLInventoryModel::EHasChildren has_children; +	has_children = gInventory.categoryHasChildren(mUUID); +	return has_children != LLInventoryModel::CHILDREN_NO; +} + +BOOL LLFolderBridge::dragOrDrop(MASK mask, BOOL drop, +								EDragAndDropType cargo_type, +								void* cargo_data) +{ +	//llinfos << "LLFolderBridge::dragOrDrop()" << llendl; +	BOOL accept = FALSE; +	switch(cargo_type) +	{ +		case DAD_TEXTURE: +		case DAD_SOUND: +		case DAD_CALLINGCARD: +		case DAD_LANDMARK: +		case DAD_SCRIPT: +		case DAD_OBJECT: +		case DAD_NOTECARD: +		case DAD_CLOTHING: +		case DAD_BODYPART: +		case DAD_ANIMATION: +		case DAD_GESTURE: +		case DAD_LINK: +			accept = dragItemIntoFolder((LLInventoryItem*)cargo_data, +										drop); +			break; +		case DAD_CATEGORY: +			if (LLFriendCardsManager::instance().isAnyFriendCategory(mUUID)) +			{ +				accept = FALSE; +			} +			else +			{ +				accept = dragCategoryIntoFolder((LLInventoryCategory*)cargo_data, drop); +			} +			break; +		default: +			break; +	} +	return accept; +} + +LLViewerInventoryCategory* LLFolderBridge::getCategory() const +{ +	LLViewerInventoryCategory* cat = NULL; +	LLInventoryModel* model = getInventoryModel(); +	if(model) +	{ +		cat = (LLViewerInventoryCategory*)model->getCategory(mUUID); +	} +	return cat; +} + + +// static +void LLFolderBridge::pasteClipboard(void* user_data) +{ +	LLFolderBridge* self = (LLFolderBridge*)user_data; +	if(self) self->pasteFromClipboard(); +} + +void LLFolderBridge::createNewCategory(void* user_data) +{ +	LLFolderBridge* bridge = (LLFolderBridge*)user_data; +	if(!bridge) return; +	LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(bridge->mInventoryPanel.get()); +	if (!panel) return; +	LLInventoryModel* model = panel->getModel(); +	if(!model) return; +	LLUUID id; +	id = model->createNewCategory(bridge->getUUID(), +								  LLFolderType::FT_NONE, +								  LLStringUtil::null); +	model->notifyObservers(); + +	// At this point, the bridge has probably been deleted, but the +	// view is still there. +	panel->setSelection(id, TAKE_FOCUS_YES); +} + +void LLFolderBridge::createNewShirt(void* user_data) +{ +	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SHIRT); +} + +void LLFolderBridge::createNewPants(void* user_data) +{ +	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_PANTS); +} + +void LLFolderBridge::createNewShoes(void* user_data) +{ +	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SHOES); +} + +void LLFolderBridge::createNewSocks(void* user_data) +{ +	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SOCKS); +} + +void LLFolderBridge::createNewJacket(void* user_data) +{ +	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_JACKET); +} + +void LLFolderBridge::createNewSkirt(void* user_data) +{ +	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SKIRT); +} + +void LLFolderBridge::createNewGloves(void* user_data) +{ +	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_GLOVES); +} + +void LLFolderBridge::createNewUndershirt(void* user_data) +{ +	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_UNDERSHIRT); +} + +void LLFolderBridge::createNewUnderpants(void* user_data) +{ +	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_UNDERPANTS); +} + +void LLFolderBridge::createNewShape(void* user_data) +{ +	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SHAPE); +} + +void LLFolderBridge::createNewSkin(void* user_data) +{ +	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SKIN); +} + +void LLFolderBridge::createNewHair(void* user_data) +{ +	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_HAIR); +} + +void LLFolderBridge::createNewEyes(void* user_data) +{ +	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_EYES); +} + +// static +void LLFolderBridge::createWearable(LLFolderBridge* bridge, EWearableType type) +{ +	if(!bridge) return; +	LLUUID parent_id = bridge->getUUID(); +	createWearable(parent_id, type); +} + +// Separate function so can be called by global menu as well as right-click +// menu. +// static +void LLFolderBridge::createWearable(const LLUUID &parent_id, EWearableType type) +{ +	LLWearable* wearable = LLWearableList::instance().createNewWearable(type); +	LLAssetType::EType asset_type = wearable->getAssetType(); +	LLInventoryType::EType inv_type = LLInventoryType::IT_WEARABLE; +	create_inventory_item(gAgent.getID(), gAgent.getSessionID(), +		parent_id, wearable->getTransactionID(), wearable->getName(), +		wearable->getDescription(), asset_type, inv_type, wearable->getType(), +		wearable->getPermissions().getMaskNextOwner(), +		LLPointer<LLInventoryCallback>(NULL)); +} + +void LLFolderBridge::modifyOutfit(BOOL append) +{ +	LLInventoryModel* model = getInventoryModel(); +	if(!model) return; +	LLViewerInventoryCategory* cat = getCategory(); +	if(!cat) return; + +	// BAP - was: +	// wear_inventory_category_on_avatar( cat, append ); +	LLAppearanceManager::instance().wearInventoryCategory( cat, FALSE, append ); +} + +// helper stuff +bool move_task_inventory_callback(const LLSD& notification, const LLSD& response, LLMoveInv* move_inv) +{ +	LLFloaterOpenObject::LLCatAndWear* cat_and_wear = (LLFloaterOpenObject::LLCatAndWear* )move_inv->mUserData; +	LLViewerObject* object = gObjectList.findObject(move_inv->mObjectID); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + +	if(option == 0 && object) +	{ +		if (cat_and_wear && cat_and_wear->mWear) +		{ +			InventoryObjectList inventory_objects; +			object->getInventoryContents(inventory_objects); +			int contents_count = inventory_objects.size()-1; //subtract one for containing folder + +			LLInventoryCopyAndWearObserver* inventoryObserver = new LLInventoryCopyAndWearObserver(cat_and_wear->mCatID, contents_count); +			gInventory.addObserver(inventoryObserver); +		} + +		two_uuids_list_t::iterator move_it; +		for (move_it = move_inv->mMoveList.begin(); +			move_it != move_inv->mMoveList.end(); +			++move_it) +		{ +			object->moveInventory(move_it->first, move_it->second); +		} + +		// update the UI. +		dialog_refresh_all(); +	} + +	if (move_inv->mCallback) +	{ +		move_inv->mCallback(option, move_inv->mUserData); +	} + +	delete move_inv; +	return false; +} + +/* +Next functions intended to reorder items in the inventory folder and save order on server +Is now used for Favorites folder. + +*TODO: refactoring is needed with Favorites Bar functionality. Probably should be moved in LLInventoryModel +*/ +void saveItemsOrder(LLInventoryModel::item_array_t& items) +{ +	int sortField = 0; + +	// current order is saved by setting incremental values (1, 2, 3, ...) for the sort field +	for (LLInventoryModel::item_array_t::iterator i = items.begin(); i != items.end(); ++i) +	{ +		LLViewerInventoryItem* item = *i; + +		item->setSortField(++sortField); +		item->setComplete(TRUE); +		item->updateServer(FALSE); + +		gInventory.updateItem(item); +	} + +	gInventory.notifyObservers(); +} + +LLInventoryModel::item_array_t::iterator findItemByUUID(LLInventoryModel::item_array_t& items, const LLUUID& id) +{ +	LLInventoryModel::item_array_t::iterator result = items.end(); + +	for (LLInventoryModel::item_array_t::iterator i = items.begin(); i != items.end(); ++i) +	{ +		if ((*i)->getUUID() == id) +		{ +			result = i; +			break; +		} +	} + +	return result; +} + +void updateItemsOrder(LLInventoryModel::item_array_t& items, const LLUUID& srcItemId, const LLUUID& destItemId) +{ +	LLViewerInventoryItem* srcItem = gInventory.getItem(srcItemId); +	LLViewerInventoryItem* destItem = gInventory.getItem(destItemId); + +	items.erase(findItemByUUID(items, srcItem->getUUID())); +	items.insert(findItemByUUID(items, destItem->getUUID()), srcItem); +} + +BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item, +										BOOL drop) +{ +	LLInventoryModel* model = getInventoryModel(); +	if(!model || !inv_item) return FALSE; + +	// cannot drag into library +	if(!isAgentInventory()) +	{ +		return FALSE; +	} + +	LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); +	if(!avatar) return FALSE; + +	LLToolDragAndDrop::ESource source = LLToolDragAndDrop::getInstance()->getSource(); +	BOOL accept = FALSE; +	LLViewerObject* object = NULL; +	if(LLToolDragAndDrop::SOURCE_AGENT == source) +	{ + +		BOOL is_movable = TRUE; +		switch( inv_item->getActualType() ) +		{ +		case LLAssetType::AT_CATEGORY: +			is_movable = !LLFolderType::lookupIsProtectedType(((LLInventoryCategory*)inv_item)->getPreferredType()); +			break; +		default: +			break; +		} + +		const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); +		BOOL move_is_into_trash = (mUUID == trash_id) || model->isObjectDescendentOf(mUUID, trash_id); +		const LLUUID current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); +		BOOL move_is_into_current_outfit = (mUUID == current_outfit_id); +		BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT); + +		if(is_movable && move_is_into_trash) +		{ +			switch(inv_item->getType()) +			{ +			case LLAssetType::AT_CLOTHING: +			case LLAssetType::AT_BODYPART: +				is_movable = !gAgentWearables.isWearingItem(inv_item->getUUID()); +				break; + +			case LLAssetType::AT_OBJECT: +				is_movable = !avatar->isWearingAttachment(inv_item->getUUID()); +				break; +			default: +				break; +			} +		} + +		if ( is_movable ) +		{ +			// Don't allow creating duplicates in the Calling Card/Friends +			// subfolders, see bug EXT-1599. Check is item direct descendent +			// of target folder and forbid item's movement if it so. +			// Note: isItemDirectDescendentOfCategory checks if +			// passed category is in the Calling Card/Friends folder +			is_movable = ! LLFriendCardsManager::instance() +				.isObjDirectDescendentOfCategory (inv_item, getCategory()); +		} + +		const LLUUID& favorites_id = model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE); +		const LLUUID& landmarks_id = model->findCategoryUUIDForType(LLFolderType::FT_LANDMARK); +		const BOOL folder_allows_reorder = ((mUUID == landmarks_id) || (mUUID == favorites_id)); +	    +		// we can move item inside a folder only if this folder is Favorites. See EXT-719 +		accept = is_movable && ((mUUID != inv_item->getParentUUID()) || folder_allows_reorder); +		if(accept && drop) +		{ +			if (inv_item->getType() == LLAssetType::AT_GESTURE +				&& LLGestureManager::instance().isGestureActive(inv_item->getUUID()) && move_is_into_trash) +			{ +				LLGestureManager::instance().deactivateGesture(inv_item->getUUID()); +			} +			// If an item is being dragged between windows, unselect +			// everything in the active window so that we don't follow +			// the selection to its new location (which is very +			// annoying). +			if (LLFloaterInventory::getActiveInventory()) +			{ +				LLInventoryPanel* active_panel = LLFloaterInventory::getActiveInventory()->getPanel(); +				LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); +				if (active_panel && (panel != active_panel)) +				{ +					active_panel->unSelectAll(); +				} +			} + +			// if dragging from/into favorites folder only reorder items +			if ((mUUID == inv_item->getParentUUID()) && folder_allows_reorder) +			{ +				LLInventoryModel::cat_array_t cats; +				LLInventoryModel::item_array_t items; +				LLIsType is_type(LLAssetType::AT_LANDMARK); +				model->collectDescendentsIf(mUUID, cats, items, LLInventoryModel::EXCLUDE_TRASH, is_type); + +				LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); +				LLFolderViewItem* itemp = panel ? panel->getRootFolder()->getDraggingOverItem() : NULL; +				if (itemp) +				{ +					LLUUID srcItemId = inv_item->getUUID(); +					LLUUID destItemId = itemp->getListener()->getUUID(); + +					// update order +					updateItemsOrder(items, srcItemId, destItemId); + +					saveItemsOrder(items); +				} +			} +			else if (favorites_id == mUUID) // if target is the favorites folder we use copy +			{ +				copy_inventory_item( +					gAgent.getID(), +					inv_item->getPermissions().getOwner(), +					inv_item->getUUID(), +					mUUID, +					std::string(), +					LLPointer<LLInventoryCallback>(NULL)); +			} +			else if (move_is_into_current_outfit || move_is_into_outfit) +			{ +				// BAP - should skip if dup. +				if (move_is_into_current_outfit) +				{ +					LLAppearanceManager::instance().addCOFItemLink(inv_item); +				} +				else +				{ +					LLPointer<LLInventoryCallback> cb = NULL; +					link_inventory_item( +						gAgent.getID(), +						inv_item->getLinkedUUID(), +						mUUID, +						inv_item->getName(), +						LLAssetType::AT_LINK, +						cb); +				} +			} +			else +			{ +				// restamp if the move is into the trash. +				LLInvFVBridge::changeItemParent( +					model, +					(LLViewerInventoryItem*)inv_item, +					mUUID, +					move_is_into_trash); +			} +		} +	} +	else if(LLToolDragAndDrop::SOURCE_WORLD == source) +	{ +		// Make sure the object exists. If we allowed dragging from +		// anonymous objects, it would be possible to bypass +		// permissions. +		object = gObjectList.findObject(inv_item->getParentUUID()); +		if(!object) +		{ +			llinfos << "Object not found for drop." << llendl; +			return FALSE; +		} + +		// coming from a task. Need to figure out if the person can +		// move/copy this item. +		LLPermissions perm(inv_item->getPermissions()); +		BOOL is_move = FALSE; +		if((perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID()) +			&& perm.allowTransferTo(gAgent.getID()))) +//		   || gAgent.isGodlike()) + +		{ +			accept = TRUE; +		} +		else if(object->permYouOwner()) +		{ +			// If the object cannot be copied, but the object the +			// inventory is owned by the agent, then the item can be +			// moved from the task to agent inventory. +			is_move = TRUE; +			accept = TRUE; +		} +		if(drop && accept) +		{ +			LLMoveInv* move_inv = new LLMoveInv; +			move_inv->mObjectID = inv_item->getParentUUID(); +			two_uuids_t item_pair(mUUID, inv_item->getUUID()); +			move_inv->mMoveList.push_back(item_pair); +			move_inv->mCallback = NULL; +			move_inv->mUserData = NULL; +			if(is_move) +			{ +				warn_move_inventory(object, move_inv); +			} +			else +			{ +				LLNotification::Params params("MoveInventoryFromObject"); +				params.functor.function(boost::bind(move_task_inventory_callback, _1, _2, move_inv)); +				LLNotifications::instance().forceResponse(params, 0); +			} +		} + +	} +	else if(LLToolDragAndDrop::SOURCE_NOTECARD == source) +	{ +		accept = TRUE; +		if(drop) +		{ +			copy_inventory_from_notecard(LLToolDragAndDrop::getInstance()->getObjectID(), +				LLToolDragAndDrop::getInstance()->getSourceID(), inv_item); +		} +	} +	else if(LLToolDragAndDrop::SOURCE_LIBRARY == source) +	{ +		LLViewerInventoryItem* item = (LLViewerInventoryItem*)inv_item; +		if(item && item->isComplete()) +		{ +			accept = TRUE; +			if(drop) +			{ +				copy_inventory_item( +					gAgent.getID(), +					inv_item->getPermissions().getOwner(), +					inv_item->getUUID(), +					mUUID, +					std::string(), +					LLPointer<LLInventoryCallback>(NULL)); +			} +		} +	} +	else +	{ +		llwarns << "unhandled drag source" << llendl; +	} +	return accept; +} + +// +=================================================+ +// |        LLScriptBridge (DEPRECTED)               | +// +=================================================+ + +LLUIImagePtr LLScriptBridge::getIcon() const +{ +	return get_item_icon(LLAssetType::AT_SCRIPT, LLInventoryType::IT_LSL, 0, FALSE); +} + +// +=================================================+ +// |        LLTextureBridge                          | +// +=================================================+ + +LLUIImagePtr LLTextureBridge::getIcon() const +{ +	return get_item_icon(LLAssetType::AT_TEXTURE, mInvType, 0, FALSE); +} + +void LLTextureBridge::openItem() +{ +	LLViewerInventoryItem* item = getItem(); + +	if (item) +	{ +		LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); +	} +} + +void LLTextureBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ +	lldebugs << "LLTextureBridge::buildContextMenu()" << llendl; +	std::vector<std::string> items; +	std::vector<std::string> disabled_items; +	if(isInTrash()) +	{ +		items.push_back(std::string("Purge Item")); +		if (!isItemRemovable()) +		{ +			disabled_items.push_back(std::string("Purge Item")); +		} + +		items.push_back(std::string("Restore Item")); +	} +	else +	{ +		items.push_back(std::string("Open")); +		items.push_back(std::string("Properties")); + +		getClipboardEntries(true, items, disabled_items, flags); + +		items.push_back(std::string("Texture Separator")); +		items.push_back(std::string("Save As")); +	} +	hide_context_entries(menu, items, disabled_items);	 +} + +// virtual +void LLTextureBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +{ +	if ("save_as" == action) +	{ +		LLFloaterReg::showInstance("preview_texture", LLSD(mUUID), TAKE_FOCUS_YES); +		LLPreviewTexture* preview_texture = LLFloaterReg::findTypedInstance<LLPreviewTexture>("preview_texture", mUUID); +		if (preview_texture) +		{ +			preview_texture->openToSave(); +		} +	} +	else LLItemBridge::performAction(folder, model, action); +} + +// +=================================================+ +// |        LLSoundBridge                            | +// +=================================================+ + +LLUIImagePtr LLSoundBridge::getIcon() const +{ +	return get_item_icon(LLAssetType::AT_SOUND, LLInventoryType::IT_SOUND, 0, FALSE); +} + +void LLSoundBridge::openItem() +{ +	LLViewerInventoryItem* item = getItem(); + +	if (item) +	{ +		LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); +	} +/* +// Changed this back to the way it USED to work: +// only open the preview dialog through the contextual right-click menu +// double-click just plays the sound + +	LLViewerInventoryItem* item = getItem(); +	if(item) +	{ +		openSoundPreview((void*)this); +		//send_uuid_sound_trigger(item->getAssetUUID(), 1.0); +	} +*/ +} + +void LLSoundBridge::previewItem() +{ +	LLViewerInventoryItem* item = getItem(); +	if(item) +	{ +		send_sound_trigger(item->getAssetUUID(), 1.0); +	} +} + +void LLSoundBridge::openSoundPreview(void* which) +{ +	LLSoundBridge *me = (LLSoundBridge *)which; +	LLFloaterReg::showInstance("preview_sound", LLSD(me->mUUID), TAKE_FOCUS_YES); +} + +void LLSoundBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ +	lldebugs << "LLSoundBridge::buildContextMenu()" << llendl; +	std::vector<std::string> items; +	std::vector<std::string> disabled_items; + +	if(isInTrash()) +	{ +		items.push_back(std::string("Purge Item")); +		if (!isItemRemovable()) +		{ +			disabled_items.push_back(std::string("Purge Item")); +		} + +		items.push_back(std::string("Restore Item")); +	} +	else +	{ +		items.push_back(std::string("Sound Open")); +		items.push_back(std::string("Properties")); + +		getClipboardEntries(true, items, disabled_items, flags); +	} + +	items.push_back(std::string("Sound Separator")); +	items.push_back(std::string("Sound Play")); + +	hide_context_entries(menu, items, disabled_items); +} + +// +=================================================+ +// |        LLLandmarkBridge                         | +// +=================================================+ + +LLLandmarkBridge::LLLandmarkBridge(LLInventoryPanel* inventory, const LLUUID& uuid, U32 flags/* = 0x00*/) : +LLItemBridge(inventory, uuid) +{ +	mVisited = FALSE; +	if (flags & LLInventoryItem::II_FLAGS_LANDMARK_VISITED) +	{ +		mVisited = TRUE; +	} +} + +LLUIImagePtr LLLandmarkBridge::getIcon() const +{ +	return get_item_icon(LLAssetType::AT_LANDMARK, LLInventoryType::IT_LANDMARK, mVisited, FALSE); +} + +void LLLandmarkBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ +	std::vector<std::string> items; +	std::vector<std::string> disabled_items; + +	lldebugs << "LLLandmarkBridge::buildContextMenu()" << llendl; +	if(isInTrash()) +	{ +		items.push_back(std::string("Purge Item")); +		if (!isItemRemovable()) +		{ +			disabled_items.push_back(std::string("Purge Item")); +		} + +		items.push_back(std::string("Restore Item")); +	} +	else +	{ +		items.push_back(std::string("Landmark Open")); +		items.push_back(std::string("Properties")); + +		getClipboardEntries(true, items, disabled_items, flags); +	} + +	items.push_back(std::string("Landmark Separator")); +	items.push_back(std::string("About Landmark")); + +	// Disable "About Landmark" menu item for +	// multiple landmarks selected. Only one landmark +	// info panel can be shown at a time. +	if ((flags & FIRST_SELECTED_ITEM) == 0) +	{ +		disabled_items.push_back(std::string("About Landmark")); +	} + +	hide_context_entries(menu, items, disabled_items); +} + +// Convenience function for the two functions below. +void teleport_via_landmark(const LLUUID& asset_id) +{ +	gAgent.teleportViaLandmark( asset_id ); + +	// we now automatically track the landmark you're teleporting to +	// because you'll probably arrive at a telehub instead +	LLFloaterWorldMap* floater_world_map = LLFloaterWorldMap::getInstance(); +	if( floater_world_map ) +	{ +		floater_world_map->trackLandmark( asset_id ); +	} +} + +// virtual +void LLLandmarkBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +{ +	if ("teleport" == action) +	{ +		LLViewerInventoryItem* item = getItem(); +		if(item) +		{ +			teleport_via_landmark(item->getAssetUUID()); +		} +	} +	else if ("about" == action) +	{ +		LLViewerInventoryItem* item = getItem(); +		if(item) +		{ +			LLSD key; +			key["type"] = "landmark"; +			key["id"] = item->getUUID(); + +			LLSideTray::getInstance()->showPanel("panel_places", key); +		} +	} +	else +	{ +		LLItemBridge::performAction(folder, model, action); +	} +} + +static bool open_landmark_callback(const LLSD& notification, const LLSD& response) +{ +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + +	LLUUID asset_id = notification["payload"]["asset_id"].asUUID(); +	if (option == 0) +	{ +		teleport_via_landmark(asset_id); +	} + +	return false; +} +static LLNotificationFunctorRegistration open_landmark_callback_reg("TeleportFromLandmark", open_landmark_callback); + + +void LLLandmarkBridge::openItem() +{ +	LLViewerInventoryItem* item = getItem(); + +	if (item) +	{ +		LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); +	} +/* +	LLViewerInventoryItem* item = getItem(); +	if( item ) +	{ +		// Opening (double-clicking) a landmark immediately teleports, +		// but warns you the first time. +		// open_landmark(item); +		LLSD payload; +		payload["asset_id"] = item->getAssetUUID(); +		LLNotificationsUtil::add("TeleportFromLandmark", LLSD(), payload); +	} +*/ +} + + +// +=================================================+ +// |        LLCallingCardObserver                    | +// +=================================================+ +void LLCallingCardObserver::changed(U32 mask) +{ +	mBridgep->refreshFolderViewItem(); +} + +// +=================================================+ +// |        LLCallingCardBridge                      | +// +=================================================+ + +LLCallingCardBridge::LLCallingCardBridge( LLInventoryPanel* inventory, const LLUUID& uuid ) : +	LLItemBridge(inventory, uuid) +{ +	mObserver = new LLCallingCardObserver(this); +	LLAvatarTracker::instance().addObserver(mObserver); +} + +LLCallingCardBridge::~LLCallingCardBridge() +{ +	LLAvatarTracker::instance().removeObserver(mObserver); +	delete mObserver; +} + +void LLCallingCardBridge::refreshFolderViewItem() +{ +	LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); +	LLFolderViewItem* itemp = panel ? panel->getRootFolder()->getItemByID(mUUID) : NULL; +	if (itemp) +	{ +		itemp->refresh(); +	} +} + +// virtual +void LLCallingCardBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +{ +	if ("begin_im" == action) +	{ +		LLViewerInventoryItem *item = getItem(); +		if (item && (item->getCreatorUUID() != gAgent.getID()) && +			(!item->getCreatorUUID().isNull())) +		{ +			std::string callingcard_name; +			gCacheName->getFullName(item->getCreatorUUID(), callingcard_name); +			LLUUID session_id = gIMMgr->addSession(callingcard_name, IM_NOTHING_SPECIAL, item->getCreatorUUID()); +			if (session_id != LLUUID::null) +			{ +				LLIMFloater::show(session_id); +			} +		} +	} +	else if ("lure" == action) +	{ +		LLViewerInventoryItem *item = getItem(); +		if (item && (item->getCreatorUUID() != gAgent.getID()) && +			(!item->getCreatorUUID().isNull())) +		{ +			LLAvatarActions::offerTeleport(item->getCreatorUUID()); +		} +	} +	else LLItemBridge::performAction(folder, model, action); +} + +LLUIImagePtr LLCallingCardBridge::getIcon() const +{ +	BOOL online = FALSE; +	LLViewerInventoryItem* item = getItem(); +	if(item) +	{ +		online = LLAvatarTracker::instance().isBuddyOnline(item->getCreatorUUID()); +	} +	return get_item_icon(LLAssetType::AT_CALLINGCARD, LLInventoryType::IT_CALLINGCARD, online, FALSE); +} + +std::string LLCallingCardBridge::getLabelSuffix() const +{ +	LLViewerInventoryItem* item = getItem(); +	if( item && LLAvatarTracker::instance().isBuddyOnline(item->getCreatorUUID()) ) +	{ +		return LLItemBridge::getLabelSuffix() + " (online)"; +	} +	else +	{ +		return LLItemBridge::getLabelSuffix(); +	} +} + +void LLCallingCardBridge::openItem() +{ +	LLViewerInventoryItem* item = getItem(); + +	if (item) +	{ +		LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); +	} +/* +	LLViewerInventoryItem* item = getItem(); +	if(item && !item->getCreatorUUID().isNull()) +	{ +		LLAvatarActions::showProfile(item->getCreatorUUID()); +	} +*/ +} + +void LLCallingCardBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ +	lldebugs << "LLCallingCardBridge::buildContextMenu()" << llendl; +	std::vector<std::string> items; +	std::vector<std::string> disabled_items; + +	if(isInTrash()) +	{ +		items.push_back(std::string("Purge Item")); +		if (!isItemRemovable()) +		{ +			disabled_items.push_back(std::string("Purge Item")); +		} + +		items.push_back(std::string("Restore Item")); +	} +	else +	{ +		items.push_back(std::string("Open")); +		items.push_back(std::string("Properties")); + +		getClipboardEntries(true, items, disabled_items, flags); + +		LLInventoryItem* item = getItem(); +		BOOL good_card = (item +						  && (LLUUID::null != item->getCreatorUUID()) +						  && (item->getCreatorUUID() != gAgent.getID())); +		BOOL user_online = (LLAvatarTracker::instance().isBuddyOnline(item->getCreatorUUID())); +		items.push_back(std::string("Send Instant Message Separator")); +		items.push_back(std::string("Send Instant Message")); +		items.push_back(std::string("Offer Teleport...")); +		items.push_back(std::string("Conference Chat")); + +		if (!good_card) +		{ +			disabled_items.push_back(std::string("Send Instant Message")); +		} +		if (!good_card || !user_online) +		{ +			disabled_items.push_back(std::string("Offer Teleport...")); +			disabled_items.push_back(std::string("Conference Chat")); +		} +	} +	hide_context_entries(menu, items, disabled_items); +} + +BOOL LLCallingCardBridge::dragOrDrop(MASK mask, BOOL drop, +									 EDragAndDropType cargo_type, +									 void* cargo_data) +{ +	LLViewerInventoryItem* item = getItem(); +	BOOL rv = FALSE; +	if(item) +	{ +		// check the type +		switch(cargo_type) +		{ +		case DAD_TEXTURE: +		case DAD_SOUND: +		case DAD_LANDMARK: +		case DAD_SCRIPT: +		case DAD_CLOTHING: +		case DAD_OBJECT: +		case DAD_NOTECARD: +		case DAD_BODYPART: +		case DAD_ANIMATION: +		case DAD_GESTURE: +			{ +				LLInventoryItem* inv_item = (LLInventoryItem*)cargo_data; +				const LLPermissions& perm = inv_item->getPermissions(); +				if(gInventory.getItem(inv_item->getUUID()) +				   && perm.allowOperationBy(PERM_TRANSFER, gAgent.getID())) +				{ +					rv = TRUE; +					if(drop) +					{ +						LLToolDragAndDrop::giveInventory(item->getCreatorUUID(), +														 (LLInventoryItem*)cargo_data); +					} +				} +				else +				{ +					// It's not in the user's inventory (it's probably in +					// an object's contents), so disallow dragging it here. +					// You can't give something you don't yet have. +					rv = FALSE; +				} +				break; +			} +		case DAD_CATEGORY: +			{ +				LLInventoryCategory* inv_cat = (LLInventoryCategory*)cargo_data; +				if( gInventory.getCategory( inv_cat->getUUID() ) ) +				{ +					rv = TRUE; +					if(drop) +					{ +						LLToolDragAndDrop::giveInventoryCategory( +							item->getCreatorUUID(), +							inv_cat); +					} +				} +				else +				{ +					// It's not in the user's inventory (it's probably in +					// an object's contents), so disallow dragging it here. +					// You can't give something you don't yet have. +					rv = FALSE; +				} +				break; +			} +		default: +			break; +		} +	} +	return rv; +} + +BOOL LLCallingCardBridge::removeItem() +{ +	if (LLFriendCardsManager::instance().isItemInAnyFriendsList(getItem())) +	{ +		LLAvatarActions::removeFriendDialog(getItem()->getCreatorUUID()); +		return FALSE; +	} +	else +	{ +		return LLItemBridge::removeItem(); +	} +} +// +=================================================+ +// |        LLNotecardBridge                         | +// +=================================================+ + +LLUIImagePtr LLNotecardBridge::getIcon() const +{ +	return get_item_icon(LLAssetType::AT_NOTECARD, LLInventoryType::IT_NOTECARD, 0, FALSE); +} + +void LLNotecardBridge::openItem() +{ +	LLViewerInventoryItem* item = getItem(); + +	if (item) +	{ +		LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); +	} + +/* +	LLViewerInventoryItem* item = getItem(); +	if (item) +	{ +		LLFloaterReg::showInstance("preview_notecard", LLSD(item->getUUID()), TAKE_FOCUS_YES); +	} +*/ +} + + +// +=================================================+ +// |        LLGestureBridge                          | +// +=================================================+ + +LLUIImagePtr LLGestureBridge::getIcon() const +{ +	return get_item_icon(LLAssetType::AT_GESTURE, LLInventoryType::IT_GESTURE, 0, FALSE); +} + +LLFontGL::StyleFlags LLGestureBridge::getLabelStyle() const +{ +	if( LLGestureManager::instance().isGestureActive(mUUID) ) +	{ +		return LLFontGL::BOLD; +	} +	else +	{ +		return LLFontGL::NORMAL; +	} +} + +std::string LLGestureBridge::getLabelSuffix() const +{ +	if( LLGestureManager::instance().isGestureActive(mUUID) ) +	{ +		return LLItemBridge::getLabelSuffix() + " (active)"; +	} +	else +	{ +		return LLItemBridge::getLabelSuffix(); +	} +} + +// virtual +void LLGestureBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +{ +	if ("activate" == action) +	{ +		LLGestureManager::instance().activateGesture(mUUID); + +		LLViewerInventoryItem* item = gInventory.getItem(mUUID); +		if (!item) return; + +		// Since we just changed the suffix to indicate (active) +		// the server doesn't need to know, just the viewer. +		gInventory.updateItem(item); +		gInventory.notifyObservers(); +	} +	else if ("deactivate" == action) +	{ +		LLGestureManager::instance().deactivateGesture(mUUID); + +		LLViewerInventoryItem* item = gInventory.getItem(mUUID); +		if (!item) return; + +		// Since we just changed the suffix to indicate (active) +		// the server doesn't need to know, just the viewer. +		gInventory.updateItem(item); +		gInventory.notifyObservers(); +	} +	else LLItemBridge::performAction(folder, model, action); +} + +void LLGestureBridge::openItem() +{ +	LLViewerInventoryItem* item = getItem(); + +	if (item) +	{ +		LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); +	} +/* +	LLViewerInventoryItem* item = getItem(); +	if (item) +	{ +		LLPreviewGesture* preview = LLPreviewGesture::show(mUUID, LLUUID::null); +		preview->setFocus(TRUE); +	} +*/ +} + +BOOL LLGestureBridge::removeItem() +{ +	// Force close the preview window, if it exists +	LLGestureManager::instance().deactivateGesture(mUUID); +	return LLItemBridge::removeItem(); +} + +void LLGestureBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ +	lldebugs << "LLGestureBridge::buildContextMenu()" << llendl; +	std::vector<std::string> items; +	std::vector<std::string> disabled_items; +	if(isInTrash()) +	{ +		items.push_back(std::string("Purge Item")); +		if (!isItemRemovable()) +		{ +			disabled_items.push_back(std::string("Purge Item")); +		} + +		items.push_back(std::string("Restore Item")); +	} +	else +	{ +		items.push_back(std::string("Open")); +		items.push_back(std::string("Properties")); + +		getClipboardEntries(true, items, disabled_items, flags); + +		items.push_back(std::string("Gesture Separator")); +		items.push_back(std::string("Activate")); +		items.push_back(std::string("Deactivate")); +	} +	hide_context_entries(menu, items, disabled_items); +} + +// +=================================================+ +// |        LLAnimationBridge                        | +// +=================================================+ + +LLUIImagePtr LLAnimationBridge::getIcon() const +{ +	return get_item_icon(LLAssetType::AT_ANIMATION, LLInventoryType::IT_ANIMATION, 0, FALSE); +} + +void LLAnimationBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ +	std::vector<std::string> items; +	std::vector<std::string> disabled_items; + +	lldebugs << "LLAnimationBridge::buildContextMenu()" << llendl; +	if(isInTrash()) +	{ +		items.push_back(std::string("Purge Item")); +		if (!isItemRemovable()) +		{ +			disabled_items.push_back(std::string("Purge Item")); +		} + +		items.push_back(std::string("Restore Item")); +	} +	else +	{ +		items.push_back(std::string("Animation Open")); +		items.push_back(std::string("Properties")); + +		getClipboardEntries(true, items, disabled_items, flags); +	} + +	items.push_back(std::string("Animation Separator")); +	items.push_back(std::string("Animation Play")); +	items.push_back(std::string("Animation Audition")); + +	hide_context_entries(menu, items, disabled_items); + +} + +// virtual +void LLAnimationBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +{ +	if ((action == "playworld") || (action == "playlocal")) +	{ +		if (getItem()) +		{ +			LLPreviewAnim::e_activation_type activate = LLPreviewAnim::NONE; +			if ("playworld" == action) activate = LLPreviewAnim::PLAY; +			if ("playlocal" == action) activate = LLPreviewAnim::AUDITION; + +			LLPreviewAnim* preview = LLFloaterReg::showTypedInstance<LLPreviewAnim>("preview_anim", LLSD(mUUID)); +			if (preview) +			{ +				preview->activate(activate); +			} +		} +	} +	else +	{ +		LLItemBridge::performAction(folder, model, action); +	} +} + +void LLAnimationBridge::openItem() +{ +	LLViewerInventoryItem* item = getItem(); + +	if (item) +	{ +		LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); +	} +/* +	LLViewerInventoryItem* item = getItem(); +	if (item) +	{ +		LLFloaterReg::showInstance("preview_anim", LLSD(mUUID), TAKE_FOCUS_YES); +	} +*/ +} + +// +=================================================+ +// |        LLObjectBridge                           | +// +=================================================+ + +// static +LLUUID LLObjectBridge::sContextMenuItemID; + +LLObjectBridge::LLObjectBridge(LLInventoryPanel* inventory, const LLUUID& uuid, LLInventoryType::EType type, U32 flags) : +LLItemBridge(inventory, uuid), mInvType(type) +{ +	mAttachPt = (flags & 0xff); // low bye of inventory flags + +	mIsMultiObject = ( flags & LLInventoryItem::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS ) ?  TRUE: FALSE; +} + +LLUIImagePtr LLObjectBridge::getIcon() const +{ +	return get_item_icon(LLAssetType::AT_OBJECT, mInvType, mAttachPt, mIsMultiObject ); +} + +LLInventoryObject* LLObjectBridge::getObject() const +{ +	LLInventoryObject* object = NULL; +	LLInventoryModel* model = getInventoryModel(); +	if(model) +	{ +		object = (LLInventoryObject*)model->getObject(mUUID); +	} +	return object; +} + +// virtual +void LLObjectBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +{ +	if ("attach" == action) +	{ +		LLUUID object_id = mUUID; +		LLViewerInventoryItem* item; +		item = (LLViewerInventoryItem*)gInventory.getItem(object_id); +		if(item && gInventory.isObjectDescendentOf(object_id, gInventory.getRootFolderID())) +		{ +			rez_attachment(item, NULL); +		} +		else if(item && item->isComplete()) +		{ +			// must be in library. copy it to our inventory and put it on. +			LLPointer<LLInventoryCallback> cb = new RezAttachmentCallback(0); +			copy_inventory_item( +				gAgent.getID(), +				item->getPermissions().getOwner(), +				item->getUUID(), +				LLUUID::null, +				std::string(), +				cb); +		} +		gFocusMgr.setKeyboardFocus(NULL); +	} +	else if ("detach" == action) +	{ +		LLInventoryItem* item = gInventory.getItem(mUUID); +		if(item) +		{ +			gMessageSystem->newMessageFast(_PREHASH_DetachAttachmentIntoInv); +			gMessageSystem->nextBlockFast(_PREHASH_ObjectData); +			gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); +			gMessageSystem->addUUIDFast(_PREHASH_ItemID, item->getLinkedUUID()); +			gMessageSystem->sendReliable( gAgent.getRegion()->getHost()); +		} +		// this object might have been selected, so let the selection manager know it's gone now +		LLViewerObject *found_obj = gObjectList.findObject(item->getLinkedUUID()); +		if (found_obj) +		{ +			LLSelectMgr::getInstance()->remove(found_obj); +		} +	} +	else LLItemBridge::performAction(folder, model, action); +} + +void LLObjectBridge::openItem() +{ +	LLViewerInventoryItem* item = getItem(); + +	if (item) +	{ +		LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); +	} + +	LLSD key; +	key["id"] = mUUID; +	LLSideTray::getInstance()->showPanel("sidepanel_inventory", key); + +	// Disable old properties floater; this is replaced by the sidepanel. +	/* +	LLFloaterReg::showInstance("properties", mUUID); +	*/ +} + +LLFontGL::StyleFlags LLObjectBridge::getLabelStyle() const +{ +	U8 font = LLFontGL::NORMAL; + +	LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); +	if( avatar && avatar->isWearingAttachment( mUUID ) ) +	{ +		font |= LLFontGL::BOLD; +	} + +	LLInventoryItem* item = getItem(); +	if (item && item->getIsLinkType()) +	{ +		font |= LLFontGL::ITALIC; +	} + +	return (LLFontGL::StyleFlags)font; +} + +std::string LLObjectBridge::getLabelSuffix() const +{ +	LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); +	if( avatar && avatar->isWearingAttachment( mUUID ) ) +	{ +		std::string attachment_point_name = avatar->getAttachedPointName(mUUID); + +		// e.g. "(worn on ...)" / "(attached to ...)" +		LLStringUtil::format_map_t args; +		args["[ATTACHMENT_POINT]"] =  attachment_point_name.c_str(); +		return LLItemBridge::getLabelSuffix() + LLTrans::getString("WornOnAttachmentPoint", args); +	} +	else +	{ +		return LLItemBridge::getLabelSuffix(); +	} +} + +void rez_attachment(LLViewerInventoryItem* item, LLViewerJointAttachment* attachment) +{ +	LLSD payload; +	payload["item_id"] = item->getLinkedUUID(); // Wear the base object in case this is a link. + +	S32 attach_pt = 0; +	if (gAgent.getAvatarObject() && attachment) +	{ +		for (LLVOAvatar::attachment_map_t::iterator iter = gAgent.getAvatarObject()->mAttachmentPoints.begin(); +			 iter != gAgent.getAvatarObject()->mAttachmentPoints.end(); ++iter) +		{ +			if (iter->second == attachment) +			{ +				attach_pt = iter->first; +				break; +			} +		} +	} + +	payload["attachment_point"] = attach_pt; + +#if !ENABLE_MULTIATTACHMENTS +	if (attachment && attachment->getNumObjects() > 0) +	{ +		LLNotificationsUtil::add("ReplaceAttachment", LLSD(), payload, confirm_replace_attachment_rez); +	} +	else +#endif +	{ +		LLNotifications::instance().forceResponse(LLNotification::Params("ReplaceAttachment").payload(payload), 0/*YES*/); +	} +} + +bool confirm_replace_attachment_rez(const LLSD& notification, const LLSD& response) +{ +	LLVOAvatar *avatarp = gAgent.getAvatarObject(); + +	if (!avatarp->canAttachMoreObjects()) +	{ +		LLSD args; +		args["MAX_ATTACHMENTS"] = llformat("%d", MAX_AGENT_ATTACHMENTS); +		LLNotificationsUtil::add("MaxAttachmentsOnOutfit", args); +		return false; +	} + +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response); +	if (option == 0/*YES*/) +	{ +		LLViewerInventoryItem* itemp = gInventory.getItem(notification["payload"]["item_id"].asUUID()); + +		if (itemp) +		{ +			LLMessageSystem* msg = gMessageSystem; +			msg->newMessageFast(_PREHASH_RezSingleAttachmentFromInv); +			msg->nextBlockFast(_PREHASH_AgentData); +			msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); +			msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); +			msg->nextBlockFast(_PREHASH_ObjectData); +			msg->addUUIDFast(_PREHASH_ItemID, itemp->getUUID()); +			msg->addUUIDFast(_PREHASH_OwnerID, itemp->getPermissions().getOwner()); +			U8 attachment_pt = notification["payload"]["attachment_point"].asInteger(); +#if ENABLE_MULTIATTACHMENTS +			attachment_pt |= ATTACHMENT_ADD; +#endif +			msg->addU8Fast(_PREHASH_AttachmentPt, attachment_pt); +			pack_permissions_slam(msg, itemp->getFlags(), itemp->getPermissions()); +			msg->addStringFast(_PREHASH_Name, itemp->getName()); +			msg->addStringFast(_PREHASH_Description, itemp->getDescription()); +			msg->sendReliable(gAgent.getRegion()->getHost()); +		} +	} +	return false; +} +static LLNotificationFunctorRegistration confirm_replace_attachment_rez_reg("ReplaceAttachment", confirm_replace_attachment_rez); + +void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ +	std::vector<std::string> items; +	std::vector<std::string> disabled_items; +	if(isInTrash()) +	{ +		items.push_back(std::string("Purge Item")); +		if (!isItemRemovable()) +		{ +			disabled_items.push_back(std::string("Purge Item")); +		} + +		items.push_back(std::string("Restore Item")); +	} +	else +	{ +		items.push_back(std::string("Properties")); + +		LLInventoryItem *item = getItem(); +		getClipboardEntries(true, items, disabled_items, flags); + +		LLObjectBridge::sContextMenuItemID = mUUID; + +		if(item) +		{ +			LLVOAvatarSelf* avatarp = gAgent.getAvatarObject(); +			if( !avatarp ) +			{ +				return; +			} + +			if( avatarp->isWearingAttachment( mUUID ) ) +			{ +				items.push_back(std::string("Detach From Yourself")); +			} +			else +			if( !isInTrash() && !isLinkedObjectInTrash() ) +			{ +				items.push_back(std::string("Attach Separator")); +				items.push_back(std::string("Object Wear")); +				items.push_back(std::string("Attach To")); +				items.push_back(std::string("Attach To HUD")); +				// commented out for DEV-32347 +				//items.push_back(std::string("Restore to Last Position")); + +				if (!avatarp->canAttachMoreObjects()) +				{ +					disabled_items.push_back(std::string("Object Wear")); +					disabled_items.push_back(std::string("Attach To")); +					disabled_items.push_back(std::string("Attach To HUD")); +				} +				LLMenuGL* attach_menu = menu.findChildMenuByName("Attach To", TRUE); +				LLMenuGL* attach_hud_menu = menu.findChildMenuByName("Attach To HUD", TRUE); +				LLVOAvatar *avatarp = gAgent.getAvatarObject(); +				if (attach_menu +					&& (attach_menu->getChildCount() == 0) +					&& attach_hud_menu +					&& (attach_hud_menu->getChildCount() == 0) +					&& avatarp) +				{ +					for (LLVOAvatar::attachment_map_t::iterator iter = avatarp->mAttachmentPoints.begin(); +						 iter != avatarp->mAttachmentPoints.end(); ) +					{ +						LLVOAvatar::attachment_map_t::iterator curiter = iter++; +						LLViewerJointAttachment* attachment = curiter->second; +						LLMenuItemCallGL::Params p; +						std::string submenu_name = attachment->getName(); +						if (LLTrans::getString(submenu_name) != "") +						{ +						    p.name = (" ")+LLTrans::getString(submenu_name)+" "; +						} +						else +						{ +							p.name = submenu_name; +						} +						LLSD cbparams; +						cbparams["index"] = curiter->first; +						cbparams["label"] = attachment->getName(); +						p.on_click.function_name = "Inventory.AttachObject"; +						p.on_click.parameter = LLSD(attachment->getName()); +						p.on_enable.function_name = "Attachment.Label"; +						p.on_enable.parameter = cbparams; +						LLView* parent = attachment->getIsHUDAttachment() ? attach_hud_menu : attach_menu; +						LLUICtrlFactory::create<LLMenuItemCallGL>(p, parent); +					} +				} +			} +		} +	} +	hide_context_entries(menu, items, disabled_items); +} + +BOOL LLObjectBridge::renameItem(const std::string& new_name) +{ +	if(!isItemRenameable()) +		return FALSE; +	LLPreview::dirty(mUUID); +	LLInventoryModel* model = getInventoryModel(); +	if(!model) +		return FALSE; +	LLViewerInventoryItem* item = getItem(); +	if(item && (item->getName() != new_name)) +	{ +		LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); +		new_item->rename(new_name); +		buildDisplayName(new_item, mDisplayName); +		new_item->updateServer(FALSE); +		model->updateItem(new_item); + +		model->notifyObservers(); + +		LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); +		if( avatar ) +		{ +			LLViewerObject* obj = avatar->getWornAttachment( item->getUUID() ); +			if( obj ) +			{ +				LLSelectMgr::getInstance()->deselectAll(); +				LLSelectMgr::getInstance()->addAsIndividual( obj, SELECT_ALL_TES, FALSE ); +				LLSelectMgr::getInstance()->selectionSetObjectName( new_name ); +				LLSelectMgr::getInstance()->deselectAll(); +			} +		} +	} +	// return FALSE because we either notified observers (& therefore +	// rebuilt) or we didn't update. +	return FALSE; +} + +// +=================================================+ +// |        LLLSLTextBridge                          | +// +=================================================+ + +LLUIImagePtr LLLSLTextBridge::getIcon() const +{ +	return get_item_icon(LLAssetType::AT_SCRIPT, LLInventoryType::IT_LSL, 0, FALSE); +} + +void LLLSLTextBridge::openItem() +{ +	LLViewerInventoryItem* item = getItem(); + +	if (item) +	{ +		LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); +	} +	/* +	LLViewerInventoryItem* item = getItem(); +	if (item) +	{ +		LLFloaterReg::showInstance("preview_script", LLSD(mUUID), TAKE_FOCUS_YES); +	} +	*/ +} + +// +=================================================+ +// |        LLWearableBridge                         | +// +=================================================+ + +// *NOTE: hack to get from avatar inventory to avatar +void wear_inventory_item_on_avatar( LLInventoryItem* item ) +{ +	if(item) +	{ +		lldebugs << "wear_inventory_item_on_avatar( " << item->getName() +				 << " )" << llendl; + +		LLAppearanceManager::instance().addCOFItemLink(item); +	} +} + +void wear_add_inventory_item_on_avatar( LLInventoryItem* item ) +{ +	if(item) +	{ +		lldebugs << "wear_add_inventory_item_on_avatar( " << item->getName() +				 << " )" << llendl; + +		LLWearableList::instance().getAsset(item->getAssetUUID(), +							   item->getName(), +							   item->getType(), +							   LLWearableBridge::onWearAddOnAvatarArrived, +							   new LLUUID(item->getUUID())); +	} +} + +void remove_inventory_category_from_avatar( LLInventoryCategory* category ) +{ +	if(!category) return; +	lldebugs << "remove_inventory_category_from_avatar( " << category->getName() +			 << " )" << llendl; + + +	if( gFloaterCustomize ) +	{ +		gFloaterCustomize->askToSaveIfDirty( +			boost::bind(remove_inventory_category_from_avatar_step2, _1, category->getUUID())); +	} +	else +	{ +		remove_inventory_category_from_avatar_step2(TRUE, category->getUUID() ); +	} +} + +struct OnRemoveStruct +{ +	LLUUID mUUID; +	OnRemoveStruct(const LLUUID& uuid): +		mUUID(uuid) +	{ +	} +}; + +void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_id) +{ + +	// Find all the wearables that are in the category's subtree. +	lldebugs << "remove_inventory_category_from_avatar_step2()" << llendl; +	if(proceed) +	{ +		LLInventoryModel::cat_array_t cat_array; +		LLInventoryModel::item_array_t item_array; +		LLFindWearables is_wearable; +		gInventory.collectDescendentsIf(category_id, +										cat_array, +										item_array, +										LLInventoryModel::EXCLUDE_TRASH, +										is_wearable); +		S32 i; +		S32 wearable_count = item_array.count(); + +		LLInventoryModel::cat_array_t	obj_cat_array; +		LLInventoryModel::item_array_t	obj_item_array; +		LLIsType is_object( LLAssetType::AT_OBJECT ); +		gInventory.collectDescendentsIf(category_id, +										obj_cat_array, +										obj_item_array, +										LLInventoryModel::EXCLUDE_TRASH, +										is_object); +		S32 obj_count = obj_item_array.count(); + +		// Find all gestures in this folder +		LLInventoryModel::cat_array_t	gest_cat_array; +		LLInventoryModel::item_array_t	gest_item_array; +		LLIsType is_gesture( LLAssetType::AT_GESTURE ); +		gInventory.collectDescendentsIf(category_id, +										gest_cat_array, +										gest_item_array, +										LLInventoryModel::EXCLUDE_TRASH, +										is_gesture); +		S32 gest_count = gest_item_array.count(); + +		if (wearable_count > 0)	//Loop through wearables.  If worn, remove. +		{ +			for(i = 0; i  < wearable_count; ++i) +			{ +				LLViewerInventoryItem *item = item_array.get(i); +				if (item->getType() == LLAssetType::AT_BODYPART) +					continue; +				if (gAgent.isTeen() && item->isWearableType() && +					(item->getWearableType() == WT_UNDERPANTS || item->getWearableType() == WT_UNDERSHIRT)) +					continue; +				if( gAgentWearables.isWearingItem (item->getLinkedUUID()) ) +				{ +					LLWearableList::instance().getAsset(item->getAssetUUID(), +														item->getName(), +														item->getType(), +														LLWearableBridge::onRemoveFromAvatarArrived, +														new OnRemoveStruct(item->getLinkedUUID())); +				} +			} +		} + +		if (obj_count > 0) +		{ +			for(i = 0; i  < obj_count; ++i) +			{ +				LLViewerInventoryItem *obj_item = obj_item_array.get(i); +				gMessageSystem->newMessageFast(_PREHASH_DetachAttachmentIntoInv); +				gMessageSystem->nextBlockFast(_PREHASH_ObjectData ); +				gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); +				gMessageSystem->addUUIDFast(_PREHASH_ItemID, obj_item->getLinkedUUID() ); + +				gMessageSystem->sendReliable( gAgent.getRegion()->getHost() ); + +				// this object might have been selected, so let the selection manager know it's gone now +				LLViewerObject *found_obj = gObjectList.findObject( obj_item->getLinkedUUID()); +				if (found_obj) +				{ +					LLSelectMgr::getInstance()->remove(found_obj); +				} +			} +		} + +		if (gest_count > 0) +		{ +			for(i = 0; i  < gest_count; ++i) +			{ +				LLViewerInventoryItem *gest_item = gest_item_array.get(i); +				if ( LLGestureManager::instance().isGestureActive( gest_item->getLinkedUUID()) ) +				{ +					LLGestureManager::instance().deactivateGesture( gest_item->getLinkedUUID() ); +					gInventory.updateItem( gest_item ); +					gInventory.notifyObservers(); +				} + +			} +		} +	} +} + +BOOL LLWearableBridge::renameItem(const std::string& new_name) +{ +	if( gAgentWearables.isWearingItem( mUUID ) ) +	{ +		gAgentWearables.setWearableName( mUUID, new_name ); +	} +	return LLItemBridge::renameItem(new_name); +} + +std::string LLWearableBridge::getLabelSuffix() const +{ +	if( gAgentWearables.isWearingItem( mUUID ) ) +	{ +		// e.g. "(worn)"  +		return LLItemBridge::getLabelSuffix() + LLTrans::getString("worn"); +	} +	else +	{ +		return LLItemBridge::getLabelSuffix(); +	} +} + +LLUIImagePtr LLWearableBridge::getIcon() const +{ +	return get_item_icon(mAssetType, mInvType, mWearableType, FALSE); +} + +// virtual +void LLWearableBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +{ +	if ("wear" == action) +	{ +		wearOnAvatar(); +	} +	else if ("wear_add" == action) +	{ +		wearAddOnAvatar(); +	} +	else if ("edit" == action) +	{ +		editOnAvatar(); +		return; +	} +	else if ("take_off" == action) +	{ +		if(gAgentWearables.isWearingItem(mUUID)) +		{ +			LLViewerInventoryItem* item = getItem(); +			if (item) +			{ +				LLWearableList::instance().getAsset(item->getAssetUUID(), +													item->getName(), +													item->getType(), +													LLWearableBridge::onRemoveFromAvatarArrived, +													new OnRemoveStruct(mUUID)); +			} +		} +	} +	else LLItemBridge::performAction(folder, model, action); +} + +void LLWearableBridge::openItem() +{ +	LLViewerInventoryItem* item = getItem(); + +	if (item) +	{ +		LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); +	} +	/* +	if( isInTrash() ) +	{ +		LLNotificationsUtil::add("CannotWearTrash"); +	} +	else if(isAgentInventory()) +	{ +		if( !gAgentWearables.isWearingItem( mUUID ) ) +		{ +			wearOnAvatar(); +		} +	} +	else +	{ +		// must be in the inventory library. copy it to our inventory +		// and put it on right away. +		LLViewerInventoryItem* item = getItem(); +		if(item && item->isComplete()) +		{ +			LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(); +			copy_inventory_item( +				gAgent.getID(), +				item->getPermissions().getOwner(), +				item->getUUID(), +				LLUUID::null, +				std::string(), +				cb); +		} +		else if(item) +		{ +			// *TODO: We should fetch the item details, and then do +			// the operation above. +			LLNotificationsUtil::add("CannotWearInfoNotComplete"); +		} +	} +	*/ +} + +void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ +	lldebugs << "LLWearableBridge::buildContextMenu()" << llendl; +	std::vector<std::string> items; +	std::vector<std::string> disabled_items; +	if(isInTrash()) +	{ +		items.push_back(std::string("Purge Item")); +		if (!isItemRemovable()) +		{ +			disabled_items.push_back(std::string("Purge Item")); +		} + +		items.push_back(std::string("Restore Item")); +	} +	else +	{	// FWIW, it looks like SUPPRESS_OPEN_ITEM is not set anywhere +		BOOL no_open = ((flags & SUPPRESS_OPEN_ITEM) == SUPPRESS_OPEN_ITEM); + +		// If we have clothing, don't add "Open" as it's the same action as "Wear"   SL-18976 +		LLViewerInventoryItem* item = getItem(); +		if( !no_open && item ) +		{ +			no_open = (item->getType() == LLAssetType::AT_CLOTHING) || +					  (item->getType() == LLAssetType::AT_BODYPART); +		} +		if (!no_open) +		{ +			items.push_back(std::string("Open")); +		} + +		items.push_back(std::string("Properties")); + +		getClipboardEntries(true, items, disabled_items, flags); + +		items.push_back(std::string("Wearable Separator")); + +		items.push_back(std::string("Wearable Wear")); +		items.push_back(std::string("Wearable Add")); +		items.push_back(std::string("Wearable Edit")); + +		if ((flags & FIRST_SELECTED_ITEM) == 0) +		{ +			disabled_items.push_back(std::string("Wearable Edit")); +		} +		// Don't allow items to be worn if their baseobj is in the trash. +		if (isLinkedObjectInTrash()) +		{ +			disabled_items.push_back(std::string("Wearable Wear")); +			disabled_items.push_back(std::string("Wearable Add")); +			disabled_items.push_back(std::string("Wearable Edit")); +		} + +		// Disable wear and take off based on whether the item is worn. +		if(item) +		{ +			switch (item->getType()) +			{ +				case LLAssetType::AT_CLOTHING: +					items.push_back(std::string("Take Off")); +				case LLAssetType::AT_BODYPART: +					if (gAgentWearables.isWearingItem(item->getUUID())) +					{ +						disabled_items.push_back(std::string("Wearable Wear")); +						disabled_items.push_back(std::string("Wearable Add")); +					} +					else +					{ +						disabled_items.push_back(std::string("Take Off")); +					} +					break; +				default: +					break; +			} +		} +	} +	hide_context_entries(menu, items, disabled_items); +} + +// Called from menus +// static +BOOL LLWearableBridge::canWearOnAvatar(void* user_data) +{ +	LLWearableBridge* self = (LLWearableBridge*)user_data; +	if(!self) return FALSE; +	if(!self->isAgentInventory()) +	{ +		LLViewerInventoryItem* item = (LLViewerInventoryItem*)self->getItem(); +		if(!item || !item->isComplete()) return FALSE; +	} +	return (!gAgentWearables.isWearingItem(self->mUUID)); +} + +// Called from menus +// static +void LLWearableBridge::onWearOnAvatar(void* user_data) +{ +	LLWearableBridge* self = (LLWearableBridge*)user_data; +	if(!self) return; +	self->wearOnAvatar(); +} + +void LLWearableBridge::wearOnAvatar() +{ +	// Don't wear anything until initial wearables are loaded, can +	// destroy clothing items. +	if (!gAgentWearables.areWearablesLoaded()) +	{ +		LLNotificationsUtil::add("CanNotChangeAppearanceUntilLoaded"); +		return; +	} + +	LLViewerInventoryItem* item = getItem(); +	if(item) +	{ +		if(!isAgentInventory()) +		{ +			LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(); +			copy_inventory_item( +				gAgent.getID(), +				item->getPermissions().getOwner(), +				item->getUUID(), +				LLUUID::null, +				std::string(), +				cb); +		} +		else +		{ +			wear_inventory_item_on_avatar(item); +		} +	} +} + +void LLWearableBridge::wearAddOnAvatar() +{ +	// Don't wear anything until initial wearables are loaded, can +	// destroy clothing items. +	if (!gAgentWearables.areWearablesLoaded()) +	{ +		LLNotificationsUtil::add("CanNotChangeAppearanceUntilLoaded"); +		return; +	} + +	LLViewerInventoryItem* item = getItem(); +	if(item) +	{ +		if(!isAgentInventory()) +		{ +			LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(); +			copy_inventory_item( +				gAgent.getID(), +				item->getPermissions().getOwner(), +				item->getUUID(), +				LLUUID::null, +				std::string(), +				cb); +		} +		else +		{ +			wear_add_inventory_item_on_avatar(item); +		} +	} +} + +// static +void LLWearableBridge::onWearOnAvatarArrived( LLWearable* wearable, void* userdata ) +{ +	LLUUID* item_id = (LLUUID*) userdata; +	if(wearable) +	{ +		LLViewerInventoryItem* item = NULL; +		item = (LLViewerInventoryItem*)gInventory.getItem(*item_id); +		if(item) +		{ +			if(item->getAssetUUID() == wearable->getAssetID()) +			{ +				gAgentWearables.setWearableItem(item, wearable); +				gInventory.notifyObservers(); +				//self->getFolderItem()->refreshFromRoot(); +			} +			else +			{ +				llinfos << "By the time wearable asset arrived, its inv item already pointed to a different asset." << llendl; +			} +		} +	} +	delete item_id; +} + +// static +// BAP remove the "add" code path once everything is fully COF-ified. +void LLWearableBridge::onWearAddOnAvatarArrived( LLWearable* wearable, void* userdata ) +{ +	LLUUID* item_id = (LLUUID*) userdata; +	if(wearable) +	{ +		LLViewerInventoryItem* item = NULL; +		item = (LLViewerInventoryItem*)gInventory.getItem(*item_id); +		if(item) +		{ +			if(item->getAssetUUID() == wearable->getAssetID()) +			{ +				bool do_append = true; +				gAgentWearables.setWearableItem(item, wearable, do_append); +				gInventory.notifyObservers(); +				//self->getFolderItem()->refreshFromRoot(); +			} +			else +			{ +				llinfos << "By the time wearable asset arrived, its inv item already pointed to a different asset." << llendl; +			} +		} +	} +	delete item_id; +} + +// static +BOOL LLWearableBridge::canEditOnAvatar(void* user_data) +{ +	LLWearableBridge* self = (LLWearableBridge*)user_data; +	if(!self) return FALSE; + +	return (gAgentWearables.isWearingItem(self->mUUID)); +} + +// static +void LLWearableBridge::onEditOnAvatar(void* user_data) +{ +	LLWearableBridge* self = (LLWearableBridge*)user_data; +	if(self) +	{ +		self->editOnAvatar(); +	} +} + +void LLWearableBridge::editOnAvatar() +{ +	const LLWearable* wearable = gAgentWearables.getWearableFromItemID(mUUID); +	if( wearable ) +	{ +		// Set the tab to the right wearable. +		if (gFloaterCustomize) +			gFloaterCustomize->setCurrentWearableType( wearable->getType() ); + +		if( CAMERA_MODE_CUSTOMIZE_AVATAR != gAgent.getCameraMode() ) +		{ +			// Start Avatar Customization +			gAgent.changeCameraToCustomizeAvatar(); +		} +	} +} + +// static +BOOL LLWearableBridge::canRemoveFromAvatar(void* user_data) +{ +	LLWearableBridge* self = (LLWearableBridge*)user_data; +	if( self && (LLAssetType::AT_BODYPART != self->mAssetType) ) +	{ +		return gAgentWearables.isWearingItem( self->mUUID ); +	} +	return FALSE; +} + +// static +void LLWearableBridge::onRemoveFromAvatar(void* user_data) +{ +	LLWearableBridge* self = (LLWearableBridge*)user_data; +	if(!self) return; +	if(gAgentWearables.isWearingItem(self->mUUID)) +	{ +		LLViewerInventoryItem* item = self->getItem(); +		if (item) +		{ +			LLUUID parent_id = item->getParentUUID(); +			LLWearableList::instance().getAsset(item->getAssetUUID(), +												item->getName(), +												item->getType(), +												onRemoveFromAvatarArrived, +												new OnRemoveStruct(LLUUID(self->mUUID))); +		} +	} +} + +// static +void LLWearableBridge::onRemoveFromAvatarArrived(LLWearable* wearable, +												 void* userdata) +{ +	OnRemoveStruct *on_remove_struct = (OnRemoveStruct*) userdata; +	const LLUUID &item_id = gInventory.getLinkedItemID(on_remove_struct->mUUID); +	if(wearable) +	{ +		if( gAgentWearables.isWearingItem( item_id ) ) +		{ +			EWearableType type = wearable->getType(); + +			if( !(type==WT_SHAPE || type==WT_SKIN || type==WT_HAIR || type==WT_EYES ) ) //&& +				//!((!gAgent.isTeen()) && ( type==WT_UNDERPANTS || type==WT_UNDERSHIRT )) ) +			{ +				// MULTI_WEARABLE: FIXME HACK - always remove all +				bool do_remove_all = false; +				gAgentWearables.removeWearable( type, do_remove_all, 0 ); +			} +		} +	} + +	// Find and remove this item from the COF. +	LLInventoryModel::item_array_t items = gInventory.collectLinkedItems(item_id, LLAppearanceManager::instance().getCOF()); +	llassert(items.size() == 1); // Should always have one and only one item linked to this in the COF. +	for (LLInventoryModel::item_array_t::const_iterator iter = items.begin(); +		 iter != items.end(); +		 ++iter) +	{ +		const LLViewerInventoryItem *linked_item = (*iter); +		const LLUUID &item_id = linked_item->getUUID(); +		gInventory.purgeObject(item_id); +	} +	gInventory.notifyObservers(); + +	delete on_remove_struct; +} + +LLInvFVBridgeAction* LLInvFVBridgeAction::createAction(LLAssetType::EType asset_type, +													   const LLUUID& uuid,LLInventoryModel* model) +{ +	LLInvFVBridgeAction* action = NULL; +	switch(asset_type) +	{ +	case LLAssetType::AT_TEXTURE: +		action = new LLTextureBridgeAction(uuid,model); +		break; + +	case LLAssetType::AT_SOUND: +		action = new LLSoundBridgeAction(uuid,model); +		break; + +	case LLAssetType::AT_LANDMARK: +		action = new LLLandmarkBridgeAction(uuid,model); +		break; + +	case LLAssetType::AT_CALLINGCARD: +		action = new LLCallingCardBridgeAction(uuid,model); +		break; + +	case LLAssetType::AT_OBJECT: +		action = new LLObjectBridgeAction(uuid,model); +		break; + +	case LLAssetType::AT_NOTECARD: +		action = new LLNotecardBridgeAction(uuid,model); +		break; + +	case LLAssetType::AT_ANIMATION: +		action = new LLAnimationBridgeAction(uuid,model); +		break; + +	case LLAssetType::AT_GESTURE: +		action = new LLGestureBridgeAction(uuid,model); +		break; + +	case LLAssetType::AT_LSL_TEXT: +		action = new LLLSLTextBridgeAction(uuid,model); +		break; + +	case LLAssetType::AT_CLOTHING: +	case LLAssetType::AT_BODYPART: +		action = new LLWearableBridgeAction(uuid,model); + +		break; + +	default: +		break; +	} +	return action; +} + +//static +void LLInvFVBridgeAction::doAction(LLAssetType::EType asset_type, +								   const LLUUID& uuid,LLInventoryModel* model) +{ +	LLInvFVBridgeAction* action = createAction(asset_type,uuid,model); +	if(action) +	{ +		action->doIt(); +		delete action; +	} +} + +//static +void LLInvFVBridgeAction::doAction(const LLUUID& uuid, LLInventoryModel* model) +{ +	LLAssetType::EType asset_type = model->getItem(uuid)->getType(); +	LLInvFVBridgeAction* action = createAction(asset_type,uuid,model); +	if(action) +	{ +		action->doIt(); +		delete action; +	} +} + +LLViewerInventoryItem* LLInvFVBridgeAction::getItem() const +{ +	if(mModel) +		return (LLViewerInventoryItem*)mModel->getItem(mUUID); +	return NULL; +} + +//virtual +void	LLTextureBridgeAction::doIt() +{ +	if (getItem()) +	{ +		LLFloaterReg::showInstance("preview_texture", LLSD(mUUID), TAKE_FOCUS_YES); +	} + +	LLInvFVBridgeAction::doIt(); +} + +//virtual +void	LLSoundBridgeAction::doIt() +{ +	LLViewerInventoryItem* item = getItem(); +	if(item) +	{ +		LLFloaterReg::showInstance("preview_sound", LLSD(mUUID), TAKE_FOCUS_YES); +	} + +	LLInvFVBridgeAction::doIt(); +} + + +//virtual +void	LLLandmarkBridgeAction::doIt() +{ +	LLViewerInventoryItem* item = getItem(); +	if( item ) +	{ +		// Opening (double-clicking) a landmark immediately teleports, +		// but warns you the first time. +		LLSD payload; +		payload["asset_id"] = item->getAssetUUID(); +		LLNotificationsUtil::add("TeleportFromLandmark", LLSD(), payload); +	} + +	LLInvFVBridgeAction::doIt(); +} + + +//virtual +void	LLCallingCardBridgeAction::doIt() +{ +	LLViewerInventoryItem* item = getItem(); +	if(item && item->getCreatorUUID().notNull()) +	{ +		LLAvatarActions::showProfile(item->getCreatorUUID()); +	} + +	LLInvFVBridgeAction::doIt(); +} + +//virtual +void +LLNotecardBridgeAction::doIt() +{ +	LLViewerInventoryItem* item = getItem(); +	if (item) +	{ +		LLFloaterReg::showInstance("preview_notecard", LLSD(item->getUUID()), TAKE_FOCUS_YES); +	} + +	LLInvFVBridgeAction::doIt(); +} + +//virtual +void	LLGestureBridgeAction::doIt() +{ +	LLViewerInventoryItem* item = getItem(); +	if (item) +	{ +		LLPreviewGesture* preview = LLPreviewGesture::show(mUUID, LLUUID::null); +		preview->setFocus(TRUE); +	} + +	LLInvFVBridgeAction::doIt(); +} + +//virtual +void	LLAnimationBridgeAction::doIt() +{ +	LLViewerInventoryItem* item = getItem(); +	if (item) +	{ +		LLFloaterReg::showInstance("preview_anim", LLSD(mUUID), TAKE_FOCUS_YES); +	} + +	LLInvFVBridgeAction::doIt(); +} + + +//virtual +void	LLObjectBridgeAction::doIt() +{ +	LLFloaterReg::showInstance("properties", mUUID); + +	LLInvFVBridgeAction::doIt(); +} + + +//virtual +void	LLLSLTextBridgeAction::doIt() +{ +	LLViewerInventoryItem* item = getItem(); +	if (item) +	{ +		LLFloaterReg::showInstance("preview_script", LLSD(mUUID), TAKE_FOCUS_YES); +	} + +	LLInvFVBridgeAction::doIt(); +} + + +BOOL LLWearableBridgeAction::isInTrash() const +{ +	if(!mModel) return FALSE; +	const LLUUID trash_id = mModel->findCategoryUUIDForType(LLFolderType::FT_TRASH); +	return mModel->isObjectDescendentOf(mUUID, trash_id); +} + +BOOL LLWearableBridgeAction::isAgentInventory() const +{ +	if(!mModel) return FALSE; +	if(gInventory.getRootFolderID() == mUUID) return TRUE; +	return mModel->isObjectDescendentOf(mUUID, gInventory.getRootFolderID()); +} + +void LLWearableBridgeAction::wearOnAvatar() +{ +	// Don't wear anything until initial wearables are loaded, can +	// destroy clothing items. +	if (!gAgentWearables.areWearablesLoaded()) +	{ +		LLNotificationsUtil::add("CanNotChangeAppearanceUntilLoaded"); +		return; +	} + +	LLViewerInventoryItem* item = getItem(); +	if(item) +	{ +		if(!isAgentInventory()) +		{ +			LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(); +			copy_inventory_item( +				gAgent.getID(), +				item->getPermissions().getOwner(), +				item->getUUID(), +				LLUUID::null, +				std::string(), +				cb); +		} +		else +		{ +			wear_inventory_item_on_avatar(item); +		} +	} +} + +//virtual +void LLWearableBridgeAction::doIt() +{ +	if(isInTrash()) +	{ +		LLNotificationsUtil::add("CannotWearTrash"); +	} +	else if(isAgentInventory()) +	{ +		if(!gAgentWearables.isWearingItem(mUUID)) +		{ +			wearOnAvatar(); +		} +	} +	else +	{ +		// must be in the inventory library. copy it to our inventory +		// and put it on right away. +		LLViewerInventoryItem* item = getItem(); +		if(item && item->isComplete()) +		{ +			LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(); +			copy_inventory_item( +				gAgent.getID(), +				item->getPermissions().getOwner(), +				item->getUUID(), +				LLUUID::null, +				std::string(), +				cb); +		} +		else if(item) +		{ +			// *TODO: We should fetch the item details, and then do +			// the operation above. +			LLNotificationsUtil::add("CannotWearInfoNotComplete"); +		} +	} + +	LLInvFVBridgeAction::doIt(); +} + +// +=================================================+ +// |        LLLinkItemBridge                         | +// +=================================================+ +// For broken links + +std::string LLLinkItemBridge::sPrefix("Link: "); + + +LLUIImagePtr LLLinkItemBridge::getIcon() const +{ +	if (LLViewerInventoryItem *item = getItem()) +	{ +		return get_item_icon(item->getActualType(), LLInventoryType::IT_NONE, 0, FALSE); +	} +	return get_item_icon(LLAssetType::AT_LINK, LLInventoryType::IT_NONE, 0, FALSE); +} + +void LLLinkItemBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ +	// *TODO: Translate +	lldebugs << "LLLink::buildContextMenu()" << llendl; +	std::vector<std::string> items; +	std::vector<std::string> disabled_items; + +	if(isInTrash()) +	{ +		items.push_back(std::string("Purge Item")); +		if (!isItemRemovable()) +		{ +			disabled_items.push_back(std::string("Purge Item")); +		} + +		items.push_back(std::string("Restore Item")); +	} +	else +	{ +		items.push_back(std::string("Delete")); +		if (!isItemRemovable()) +		{ +			disabled_items.push_back(std::string("Delete")); +		} +	} +	hide_context_entries(menu, items, disabled_items); +} + + +// +=================================================+ +// |        LLLinkBridge                             | +// +=================================================+ +// For broken links. + +std::string LLLinkFolderBridge::sPrefix("Link: "); + + +LLUIImagePtr LLLinkFolderBridge::getIcon() const +{ +	LLFolderType::EType preferred_type = LLFolderType::FT_NONE; +	if (LLViewerInventoryItem *item = getItem()) +	{ +		if (const LLViewerInventoryCategory* cat = item->getLinkedCategory()) +		{ +			preferred_type = cat->getPreferredType(); +		} +	} +	return LLFolderBridge::getIcon(preferred_type); +} + +void LLLinkFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ +	// *TODO: Translate +	lldebugs << "LLLink::buildContextMenu()" << llendl; +	std::vector<std::string> items; +	std::vector<std::string> disabled_items; + +	if(isInTrash()) +	{ +		items.push_back(std::string("Purge Item")); +		if (!isItemRemovable()) +		{ +			disabled_items.push_back(std::string("Purge Item")); +		} + +		items.push_back(std::string("Restore Item")); +	} +	else +	{ +		items.push_back(std::string("Find Original")); +		items.push_back(std::string("Delete")); +		if (!isItemRemovable()) +		{ +			disabled_items.push_back(std::string("Delete")); +		} +	} +	hide_context_entries(menu, items, disabled_items); +} + +void LLLinkFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +{ +	if ("goto" == action) +	{ +		gotoItem(folder); +		return; +	} +	LLItemBridge::performAction(folder,model,action); +} + +void LLLinkFolderBridge::gotoItem(LLFolderView *folder) +{ +	const LLUUID &cat_uuid = getFolderID(); +	if (!cat_uuid.isNull()) +	{ +		if (LLFolderViewItem *base_folder = folder->getItemByID(cat_uuid)) +		{ +			if (LLInventoryModel* model = getInventoryModel()) +			{ +				model->fetchDescendentsOf(cat_uuid); +			} +			base_folder->setOpen(TRUE); +			folder->setSelectionFromRoot(base_folder,TRUE); +			folder->scrollToShowSelection(); +		} +	} +} + +const LLUUID &LLLinkFolderBridge::getFolderID() const +{ +	if (LLViewerInventoryItem *link_item = getItem()) +	{ +		if (const LLViewerInventoryCategory *cat = link_item->getLinkedCategory()) +		{ +			const LLUUID& cat_uuid = cat->getUUID(); +			return cat_uuid; +		} +	} +	return LLUUID::null; +} diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 9e37c5be38..9f96ebc366 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -40,6 +40,7 @@  #include "llinventorybridge.h"  #include "llinventoryfunctions.h"  #include "llinventoryobserver.h" +#include "llnotificationsutil.h"  #include "llwindow.h"  #include "llviewercontrol.h"  #include "llpreview.h"  @@ -3419,7 +3420,7 @@ void LLInventoryModel::processMoveInventoryItem(LLMessageSystem* msg, void**)  bool LLInventoryModel::callbackEmptyFolderType(const LLSD& notification, const LLSD& response, LLFolderType::EType preferred_type)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (option == 0) // YES  	{  		const LLUUID folder_id = findCategoryUUIDForType(preferred_type); @@ -3433,7 +3434,7 @@ void LLInventoryModel::emptyFolderType(const std::string notification, LLFolderT  {  	if (!notification.empty())  	{ -		LLNotifications::instance().add(notification, LLSD(), LLSD(), +		LLNotificationsUtil::add(notification, LLSD(), LLSD(),  										boost::bind(&LLInventoryModel::callbackEmptyFolderType, this, _1, _2, preferred_type));  	}  	else diff --git a/indra/newview/llinventoryobserver.cpp b/indra/newview/llinventoryobserver.cpp index 06f4b36df3..944676ad7a 100644 --- a/indra/newview/llinventoryobserver.cpp +++ b/indra/newview/llinventoryobserver.cpp @@ -55,7 +55,7 @@  #include "lldbstrings.h"  #include "llviewerstats.h"  #include "llmutelist.h" -#include "llnotifications.h" +#include "llnotificationsutil.h"  #include "llcallbacklist.h"  #include "llpreview.h"  #include "llviewercontrol.h" diff --git a/indra/newview/lllandmarkactions.cpp b/indra/newview/lllandmarkactions.cpp index d50b68b624..08d56f8b9f 100644 --- a/indra/newview/lllandmarkactions.cpp +++ b/indra/newview/lllandmarkactions.cpp @@ -39,7 +39,7 @@  #include "lllandmark.h"  #include "llparcel.h" -#include "llnotifications.h" +#include "llnotificationsutil.h"  #include "llagent.h"  #include "llagentui.h" @@ -267,7 +267,7 @@ void LLLandmarkActions::createLandmarkHere(  	}  	if (!canCreateLandmarkHere())  	{ -		LLNotifications::instance().add("CannotCreateLandmarkNotOwner"); +		LLNotificationsUtil::add("CannotCreateLandmarkNotOwner");  		return;  	} @@ -420,5 +420,5 @@ void copy_slurl_to_clipboard_callback(const std::string& slurl)  	gViewerWindow->mWindow->copyTextToClipboard(utf8str_to_wstring(slurl));  	LLSD args;  	args["SLURL"] = slurl; -	LLNotifications::instance().add("CopySLURL", args); +	LLNotificationsUtil::add("CopySLURL", args);  } diff --git a/indra/newview/lllandmarklist.cpp b/indra/newview/lllandmarklist.cpp index 83e694951b..d613cf6ba4 100644 --- a/indra/newview/lllandmarklist.cpp +++ b/indra/newview/lllandmarklist.cpp @@ -146,12 +146,12 @@ void LLLandmarkList::processGetAssetReply(  		if( LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE == status )  		{  			LL_WARNS("Landmarks") << "Missing Landmark" << LL_ENDL; -			//LLNotifications::instance().add("LandmarkMissing"); +			//LLNotificationsUtil::add("LandmarkMissing");  		}  		else  		{  			LL_WARNS("Landmarks") << "Unable to load Landmark" << LL_ENDL; -			//LLNotifications::instance().add("UnableToLoadLandmark"); +			//LLNotificationsUtil::add("UnableToLoadLandmark");  		}  		gLandmarkList.mBadList.insert(uuid); diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp index 6b28edf0b6..45c60df84f 100644 --- a/indra/newview/lllocationinputctrl.cpp +++ b/indra/newview/lllocationinputctrl.cpp @@ -158,8 +158,10 @@ LLLocationInputCtrl::Params::Params()  	add_landmark_image_disabled("add_landmark_image_disabled"),  	add_landmark_image_hover("add_landmark_image_hover"),  	add_landmark_image_selected("add_landmark_image_selected"), +	add_landmark_hpad("add_landmark_hpad", 0),  	icon_hpad("icon_hpad", 0),  	add_landmark_button("add_landmark_button"), +	for_sale_button("for_sale_button"),  	info_button("info_button"),  	voice_icon("voice_icon"),  	fly_icon("fly_icon"), @@ -174,9 +176,11 @@ LLLocationInputCtrl::Params::Params()  LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)  :	LLComboBox(p),  	mIconHPad(p.icon_hpad), -	mInfoBtn(NULL), +	mAddLandmarkHPad(p.add_landmark_hpad),  	mLocationContextMenu(NULL),  	mAddLandmarkBtn(NULL), +	mForSaleBtn(NULL), +	mInfoBtn(NULL),  	mLandmarkImageOn(NULL),  	mLandmarkImageOff(NULL)  { @@ -237,6 +241,13 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)  	mAddLandmarkBtn = LLUICtrlFactory::create<LLButton>(al_params);  	enableAddLandmarkButton(true);  	addChild(mAddLandmarkBtn); +	 +	LLButton::Params for_sale_button = p.for_sale_button; +	for_sale_button.click_callback.function( +		boost::bind(&LLLocationInputCtrl::onForSaleButtonClicked, this)); +	mForSaleBtn = LLUICtrlFactory::create<LLButton>( for_sale_button ); +	// *TODO: Make clickable? +	addChild(mForSaleBtn);  	// Parcel property icons  	LLIconCtrl::Params voice_icon = p.voice_icon; @@ -465,6 +476,11 @@ void LLLocationInputCtrl::onInfoButtonClicked()  	LLSideTray::getInstance()->showPanel("panel_places", LLSD().insert("type", "agent"));  } +void LLLocationInputCtrl::onForSaleButtonClicked() +{ +	handle_buy_land(); +} +  void LLLocationInputCtrl::onAddLandmarkButtonClicked()  {  	LLViewerInventoryItem* landmark = LLLandmarkActions::findLandmarkForAgentPos(); @@ -605,6 +621,20 @@ void LLLocationInputCtrl::refreshLocation()  	setText(location_name);  } +// returns new right edge +static S32 layout_widget(LLUICtrl* widget, S32 right) +{ +	if (widget->getVisible()) +	{ +		LLRect rect = widget->getRect(); +		rect.mLeft = right - rect.getWidth(); +		rect.mRight = right; +		widget->setRect( rect ); +		right -= rect.getWidth(); +	} +	return right; +} +  void LLLocationInputCtrl::refreshParcelIcons()  {  	// Our "cursor" moving right to left @@ -614,8 +644,7 @@ void LLLocationInputCtrl::refreshParcelIcons()  	if (show_properties)  	{  		LLViewerParcelMgr* vpm = LLViewerParcelMgr::getInstance(); -		// *TODO buy -		//bool allow_buy      = vpm->canAgentBuyParcel( vpm->getAgentParcel(), false); +		bool allow_buy      = vpm->canAgentBuyParcel( vpm->getAgentParcel(), false);  		bool allow_voice	= vpm->allowAgentVoice();  		bool allow_fly		= vpm->allowAgentFly();  		bool allow_push		= vpm->allowAgentPush(); @@ -624,6 +653,7 @@ void LLLocationInputCtrl::refreshParcelIcons()  		bool allow_damage	= vpm->allowAgentDamage();  		// Most icons are "block this ability" +		mForSaleBtn->setVisible(allow_buy);  		mParcelIcon[VOICE_ICON]->setVisible(   !allow_voice );  		mParcelIcon[FLY_ICON]->setVisible(     !allow_fly );  		mParcelIcon[PUSH_ICON]->setVisible(    !allow_push ); @@ -632,28 +662,22 @@ void LLLocationInputCtrl::refreshParcelIcons()  		mParcelIcon[DAMAGE_ICON]->setVisible(  allow_damage );  		mDamageText->setVisible(allow_damage); -		// Slide the parcel icons rect from right to left, adjusting rectangles of -		// visible icons.  Assumes all icon rects are the same. +		x = layout_widget(mForSaleBtn, x); +		// Padding goes to left of both landmark star and for sale btn +		x -= mAddLandmarkHPad; +		 +		// Slide the parcel icons rect from right to left, adjusting rectangles  		for (S32 i = 0; i < ICON_COUNT; ++i)  		{ -			LLIconCtrl* icon = mParcelIcon[i]; -			if (icon->getVisible()) -			{ -				LLRect r = icon->getRect(); -				r.mLeft = x - r.getWidth(); -				r.mRight = x; -				icon->setRect( r ); -				x -= r.getWidth() + mIconHPad; -			} +			x = layout_widget(mParcelIcon[i], x); +			x -= mIconHPad;  		} -		LLRect text_rect = mDamageText->getRect(); -		text_rect.mLeft = x - text_rect.getWidth(); -		text_rect.mRight = x; -		mDamageText->setRect(text_rect); -		x -= text_rect.getWidth() + mIconHPad; +		x = layout_widget(mDamageText, x); +		x -= mIconHPad;  	}  	else  	{ +		mForSaleBtn->setVisible(false);  		for (S32 i = 0; i < ICON_COUNT; ++i)  		{  			mParcelIcon[i]->setVisible(false); @@ -664,8 +688,6 @@ void LLLocationInputCtrl::refreshParcelIcons()  	S32 left_pad, right_pad;  	mTextEntry->getTextPadding(&left_pad, &right_pad);  	right_pad = mTextEntry->getRect().mRight - x; -	llinfos << "JAMESDEBUG text entry rect " << mTextEntry->getRect() -	<< " x " << x << " left_pad " << left_pad << " right_pad " << right_pad << llendl;  	mTextEntry->setTextPadding(left_pad, right_pad);  } diff --git a/indra/newview/lllocationinputctrl.h b/indra/newview/lllocationinputctrl.h index 3bd23e80a9..0211062b05 100644 --- a/indra/newview/lllocationinputctrl.h +++ b/indra/newview/lllocationinputctrl.h @@ -65,8 +65,10 @@ public:  											add_landmark_image_disabled,  											add_landmark_image_hover,  											add_landmark_image_selected; -		Optional<S32>						icon_hpad; +		Optional<S32>						icon_hpad, +											add_landmark_hpad;  		Optional<LLButton::Params>			add_landmark_button, +											for_sale_button,  											info_button;  		Optional<LLIconCtrl::Params>		voice_icon,  											fly_icon, @@ -130,6 +132,7 @@ private:  	void					onLocationPrearrange(const LLSD& data);  	void 					onTextEditorRightClicked(S32 x, S32 y, MASK mask);  	void					onLandmarkLoaded(LLLandmark* lm); +	void					onForSaleButtonClicked();  	void					onAddLandmarkButtonClicked();  	void					onAgentParcelChange();  	// callbacks @@ -138,8 +141,10 @@ private:  	LLMenuGL*				mLocationContextMenu;  	LLButton*				mAddLandmarkBtn; +	LLButton*				mForSaleBtn;  	LLButton*				mInfoBtn; -	S32						mIconHPad; +	S32						mIconHPad;			// pad between all icons +	S32						mAddLandmarkHPad;	// pad to left of landmark star  	enum EParcelIcon  	{ diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp index 2376a3581d..f32866b1fe 100644 --- a/indra/newview/llmediactrl.cpp +++ b/indra/newview/llmediactrl.cpp @@ -45,7 +45,7 @@  #include "llviewermedia.h"  #include "llviewertexture.h"  #include "llviewerwindow.h" -#include "llnotifications.h" +#include "llnotificationsutil.h"  #include "llweb.h"  #include "llrender.h"  #include "llpluginclassmedia.h" @@ -839,7 +839,7 @@ void LLMediaCtrl::convertInputCoords(S32& x, S32& y)  // static   bool LLMediaCtrl::onClickLinkExternalTarget(const LLSD& notification, const LLSD& response )  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if ( 0 == option )  	{  		// open in external browser because we don't support  @@ -969,7 +969,7 @@ void LLMediaCtrl::onClickLinkHref( LLPluginClassMedia* self )  			mExternalUrl = url;  			LLSD payload;  			payload["external_url"] = mExternalUrl; -			LLNotifications::instance().add( "WebLaunchExternalTarget", LLSD(), payload, onClickLinkExternalTarget); +			LLNotificationsUtil::add( "WebLaunchExternalTarget", LLSD(), payload, onClickLinkExternalTarget);  			return;  		}  	} diff --git a/indra/newview/llmutelist.cpp b/indra/newview/llmutelist.cpp index 36cf2c1aa8..b520bc1c2d 100644 --- a/indra/newview/llmutelist.cpp +++ b/indra/newview/llmutelist.cpp @@ -298,7 +298,7 @@ BOOL LLMuteList::add(const LLMute& mute, U32 flags)  	if ((mute.mType == LLMute::AGENT)  		&& isLinden(mute.mName) && (flags & LLMute::flagTextChat || flags == 0))  	{ -		LLNotifications::instance().add("MuteLinden"); +		LLNotifications::instance().add("MuteLinden", LLSD(), LLSD());  		return FALSE;  	} @@ -517,7 +517,7 @@ void notify_automute_callback(const LLUUID& agent_id, const std::string& first_n  	args["FIRST"] = first_name;  	args["LAST"] = last_name; -	LLNotificationPtr notif_ptr = LLNotifications::instance().add(notif_name, args); +	LLNotificationPtr notif_ptr = LLNotifications::instance().add(notif_name, args, LLSD());  	if (notif_ptr)  	{  		std::string message = notif_ptr->getMessage(); diff --git a/indra/newview/llnotificationalerthandler.cpp b/indra/newview/llnotificationalerthandler.cpp index 5c11bc7310..c3df4cbaf4 100644 --- a/indra/newview/llnotificationalerthandler.cpp +++ b/indra/newview/llnotificationalerthandler.cpp @@ -34,6 +34,8 @@  #include "llviewerprecompiledheaders.h" // must be first include  #include "llnotificationhandler.h" + +#include "llnotifications.h"  #include "lltoastnotifypanel.h"  #include "llviewercontrol.h"  #include "llviewerwindow.h" diff --git a/indra/newview/llnotificationgrouphandler.cpp b/indra/newview/llnotificationgrouphandler.cpp index b7466ec6d4..2e7f95660a 100644 --- a/indra/newview/llnotificationgrouphandler.cpp +++ b/indra/newview/llnotificationgrouphandler.cpp @@ -38,6 +38,7 @@  #include "llviewercontrol.h"  #include "llviewerwindow.h"  #include "llnotificationmanager.h" +#include "llnotifications.h"  using namespace LLNotificationsUI; diff --git a/indra/newview/llnotificationhandler.h b/indra/newview/llnotificationhandler.h index 42cc7cacc2..29664e1919 100644 --- a/indra/newview/llnotificationhandler.h +++ b/indra/newview/llnotificationhandler.h @@ -36,7 +36,7 @@  #include "llwindow.h" -#include "llnotifications.h" +//#include "llnotificationsutil.h"  #include "llchannelmanager.h"  #include "llchat.h" diff --git a/indra/newview/llnotificationmanager.cpp b/indra/newview/llnotificationmanager.cpp index 1083cf3634..66bc217d15 100644 --- a/indra/newview/llnotificationmanager.cpp +++ b/indra/newview/llnotificationmanager.cpp @@ -36,9 +36,11 @@  #include "llnotificationmanager.h" +  #include "llnearbychathandler.h" +#include "llnotifications.h" -#include "boost/bind.hpp" +#include <boost/bind.hpp>  using namespace LLNotificationsUI; diff --git a/indra/newview/llnotificationofferhandler.cpp b/indra/newview/llnotificationofferhandler.cpp index 0a595765a9..45b5e88472 100644 --- a/indra/newview/llnotificationofferhandler.cpp +++ b/indra/newview/llnotificationofferhandler.cpp @@ -40,6 +40,7 @@  #include "llimview.h"  #include "llimfloater.h"  #include "llnotificationmanager.h" +#include "llnotifications.h"  using namespace LLNotificationsUI; diff --git a/indra/newview/llnotificationscripthandler.cpp b/indra/newview/llnotificationscripthandler.cpp index f01f2e4441..471c254bbc 100644 --- a/indra/newview/llnotificationscripthandler.cpp +++ b/indra/newview/llnotificationscripthandler.cpp @@ -38,6 +38,7 @@  #include "llviewercontrol.h"  #include "llviewerwindow.h"  #include "llnotificationmanager.h" +#include "llnotifications.h"  #include "llscriptfloater.h"  using namespace LLNotificationsUI; diff --git a/indra/newview/llnotificationtiphandler.cpp b/indra/newview/llnotificationtiphandler.cpp index b962fa2184..95f5ec801c 100644 --- a/indra/newview/llnotificationtiphandler.cpp +++ b/indra/newview/llnotificationtiphandler.cpp @@ -36,6 +36,7 @@  #include "llfloaterreg.h"  #include "llnearbychat.h"  #include "llnotificationhandler.h" +#include "llnotifications.h"  #include "lltoastnotifypanel.h"  #include "llviewercontrol.h"  #include "llviewerwindow.h" diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp index f29a7b25a7..6f753b6176 100644 --- a/indra/newview/llpanelavatar.cpp +++ b/indra/newview/llpanelavatar.cpp @@ -40,6 +40,7 @@  #include "llcombobox.h"  #include "lldateutil.h"			// ageFromDate()  #include "llimview.h" +#include "llnotificationsutil.h"  #include "lltexteditor.h"  #include "lltexturectrl.h"  #include "lltoggleablemenu.h" @@ -684,7 +685,7 @@ void LLPanelMyProfile::onStatusChanged()  	{  		gAgent.clearAFK();  		gAgent.setBusy(); -		LLNotifications::instance().add("BusyModeSet"); +		LLNotificationsUtil::add("BusyModeSet");  	}  } diff --git a/indra/newview/llpanelblockedlist.cpp b/indra/newview/llpanelblockedlist.cpp index 60d0f07285..73cffaa7ed 100644 --- a/indra/newview/llpanelblockedlist.cpp +++ b/indra/newview/llpanelblockedlist.cpp @@ -32,12 +32,14 @@  #include "llviewerprecompiledheaders.h" +#include "llpanelblockedlist.h" + +// library include  #include "llfloater.h"  #include "llfloaterreg.h" +#include "llnotificationsutil.h"  #include "llscrolllistctrl.h" -#include "llpanelblockedlist.h" -  // project include  #include "llfloateravatarpicker.h"  #include "llsidetray.h" @@ -199,7 +201,7 @@ void LLPanelBlockedList::callbackBlockByName(const std::string& text)  	BOOL success = LLMuteList::getInstance()->add(mute);  	if (!success)  	{ -		LLNotifications::instance().add("MuteByNameFailed"); +		LLNotificationsUtil::add("MuteByNameFailed");  	}  } diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp index 67a2704501..70d92442ad 100644 --- a/indra/newview/llpanelclassified.cpp +++ b/indra/newview/llpanelclassified.cpp @@ -41,6 +41,8 @@  #include "lldir.h"  #include "lldispatcher.h"  #include "llfloaterreg.h" +#include "llnotifications.h" +#include "llnotificationsutil.h"  #include "llparcel.h"  #include "lltabcontainer.h"  #include "message.h" @@ -310,12 +312,12 @@ BOOL LLPanelClassified::titleIsValid()  	const std::string& name = mNameEditor->getText();  	if (name.empty())  	{ -		LLNotifications::instance().add("BlankClassifiedName"); +		LLNotificationsUtil::add("BlankClassifiedName");  		return FALSE;  	}  	if (!isalnum(name[0]))  	{ -		LLNotifications::instance().add("ClassifiedMustBeAlphanumeric"); +		LLNotificationsUtil::add("ClassifiedMustBeAlphanumeric");  		return FALSE;  	} @@ -334,7 +336,7 @@ void LLPanelClassified::apply()  bool LLPanelClassified::saveCallback(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	switch(option)  	{ @@ -370,7 +372,7 @@ BOOL LLPanelClassified::canClose()  	LLSD args;  	args["NAME"] = mNameEditor->getText(); -	LLNotifications::instance().add("ClassifiedSave", args, LLSD(), boost::bind(&LLPanelClassified::saveCallback, this, _1, _2)); +	LLNotificationsUtil::add("ClassifiedSave", args, LLSD(), boost::bind(&LLPanelClassified::saveCallback, this, _1, _2));  	return FALSE;  } @@ -795,7 +797,7 @@ void LLPanelClassified::onClickUpdate(void* data)  	if(self->mMatureCombo->getCurrentIndex() == DECLINE_TO_STATE)  	{  		// Tell user about it -		LLNotifications::instance().add("SetClassifiedMature",  +		LLNotificationsUtil::add("SetClassifiedMature",   				LLSD(),   				LLSD(),   				boost::bind(&LLPanelClassified::confirmMature, self, _1, _2)); @@ -809,7 +811,7 @@ void LLPanelClassified::onClickUpdate(void* data)  // Callback from a dialog indicating response to mature notification  bool LLPanelClassified::confirmMature(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	// 0 == Yes  	// 1 == No @@ -864,7 +866,7 @@ void LLPanelClassified::callbackGotPriceForListing(S32 option, std::string text,  		std::string price_text = llformat("%d", MINIMUM_PRICE_FOR_LISTING);  		args["MIN_PRICE"] = price_text; -		LLNotifications::instance().add("MinClassifiedPrice", args); +		LLNotificationsUtil::add("MinClassifiedPrice", args);  		return;  	} @@ -874,7 +876,7 @@ void LLPanelClassified::callbackGotPriceForListing(S32 option, std::string text,  	LLSD args;  	args["AMOUNT"] = llformat("%d", price_for_listing); -	LLNotifications::instance().add("PublishClassified", args, LLSD(),  +	LLNotificationsUtil::add("PublishClassified", args, LLSD(),   									boost::bind(&LLPanelClassified::confirmPublish, self, _1, _2));  } @@ -901,7 +903,7 @@ void LLPanelClassified::resetDirty()  // invoked from callbackConfirmPublish  bool LLPanelClassified::confirmPublish(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	// Option 0 = publish  	if (option != 0) return false; diff --git a/indra/newview/llpanelgroup.cpp b/indra/newview/llpanelgroup.cpp index 61f2396168..2cb3967685 100644 --- a/indra/newview/llpanelgroup.cpp +++ b/indra/newview/llpanelgroup.cpp @@ -43,7 +43,7 @@  #include "llviewermessage.h"  #include "llviewerwindow.h"  #include "llappviewer.h" -#include "llnotifications.h" +#include "llnotificationsutil.h"  #include "llfloaterreg.h"  #include "llfloater.h"  #include "llgroupactions.h" @@ -245,7 +245,7 @@ void LLPanelGroup::onBtnCreate()  	{  		LLSD args;  		args["MESSAGE"] = apply_mesg; -		LLNotifications::instance().add("GenericAlert", args); +		LLNotificationsUtil::add("GenericAlert", args);  	}  } @@ -441,7 +441,7 @@ bool	LLPanelGroup::apply(LLPanelGroupTab* tab)  	{  		LLSD args;  		args["MESSAGE"] = apply_mesg; -		LLNotifications::instance().add("GenericAlert", args); +		LLNotificationsUtil::add("GenericAlert", args);  	}  	return false;  } diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp index a1d54367c9..31dfdde887 100644 --- a/indra/newview/llpanelgroupgeneral.cpp +++ b/indra/newview/llpanelgroupgeneral.cpp @@ -48,6 +48,7 @@  #include "lllineeditor.h"  #include "llnamebox.h"  #include "llnamelistctrl.h" +#include "llnotificationsutil.h"  #include "llscrolllistitem.h"  #include "llspinctrl.h"  #include "lltextbox.h" @@ -360,7 +361,7 @@ bool LLPanelGroupGeneral::apply(std::string& mesg)  		if(mComboMature &&  		   mComboMature->getCurrentIndex() == DECLINE_TO_STATE)  		{ -			LLNotifications::instance().add("SetGroupMature", LLSD(), LLSD(),  +			LLNotificationsUtil::add("SetGroupMature", LLSD(), LLSD(),   											boost::bind(&LLPanelGroupGeneral::confirmMatureApply, this, _1, _2));  			return false;  		} @@ -379,7 +380,7 @@ bool LLPanelGroupGeneral::apply(std::string& mesg)  				return false;  			} -			LLNotifications::instance().add("CreateGroupCost",  LLSD(), LLSD(), boost::bind(&LLPanelGroupGeneral::createGroupCallback, this, _1, _2)); +			LLNotificationsUtil::add("CreateGroupCost",  LLSD(), LLSD(), boost::bind(&LLPanelGroupGeneral::createGroupCallback, this, _1, _2));  			return false;  		} @@ -459,7 +460,7 @@ void LLPanelGroupGeneral::cancel()  // invoked from callbackConfirmMature  bool LLPanelGroupGeneral::confirmMatureApply(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	// 0 == Yes  	// 1 == No  	// 2 == Cancel @@ -482,7 +483,7 @@ bool LLPanelGroupGeneral::confirmMatureApply(const LLSD& notification, const LLS  	{  		LLSD args;  		args["MESSAGE"] = mesg; -		LLNotifications::instance().add("GenericAlert", args); +		LLNotificationsUtil::add("GenericAlert", args);  	}  	return ret; @@ -491,7 +492,7 @@ bool LLPanelGroupGeneral::confirmMatureApply(const LLSD& notification, const LLS  // static  bool LLPanelGroupGeneral::createGroupCallback(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	switch(option)  	{  	case 0: diff --git a/indra/newview/llpanelgroupinvite.cpp b/indra/newview/llpanelgroupinvite.cpp index c5eaa34204..375ee0fdc4 100644 --- a/indra/newview/llpanelgroupinvite.cpp +++ b/indra/newview/llpanelgroupinvite.cpp @@ -40,6 +40,7 @@  #include "llgroupactions.h"  #include "llgroupmgr.h"  #include "llnamelistctrl.h" +#include "llnotificationsutil.h"  #include "llscrolllistitem.h"  #include "llspinctrl.h"  #include "lltextbox.h" @@ -164,7 +165,7 @@ void LLPanelGroupInvite::impl::submitInvitations()  		{  			LLSD args;  			args["MESSAGE"] = mOwnerWarning; -			LLNotifications::instance().add("GenericAlertYesCancel", args, LLSD(), boost::bind(&LLPanelGroupInvite::impl::inviteOwnerCallback, this, _1, _2)); +			LLNotificationsUtil::add("GenericAlertYesCancel", args, LLSD(), boost::bind(&LLPanelGroupInvite::impl::inviteOwnerCallback, this, _1, _2));  			return; // we'll be called again if user confirms  		}  	} @@ -190,7 +191,7 @@ void LLPanelGroupInvite::impl::submitInvitations()  	{  		LLSD msg;  		msg["MESSAGE"] = mAlreadyInGroup; -		LLNotifications::instance().add("GenericAlert", msg); +		LLNotificationsUtil::add("GenericAlert", msg);  	}  	//then close @@ -199,7 +200,7 @@ void LLPanelGroupInvite::impl::submitInvitations()  bool LLPanelGroupInvite::impl::inviteOwnerCallback(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	switch(option)  	{ diff --git a/indra/newview/llpanelgroupnotices.cpp b/indra/newview/llpanelgroupnotices.cpp index 22138a81ec..e04c830036 100644 --- a/indra/newview/llpanelgroupnotices.cpp +++ b/indra/newview/llpanelgroupnotices.cpp @@ -58,7 +58,7 @@  #include "roles_constants.h"  #include "llviewerwindow.h"  #include "llviewermessage.h" -#include "llnotifications.h" +#include "llnotificationsutil.h"  static LLRegisterPanelClassWrapper<LLPanelGroupNotices> t_panel_group_notices("panel_group_notices"); @@ -372,7 +372,7 @@ void LLPanelGroupNotices::onClickSendMessage(void* data)  	if (self->mCreateSubject->getText().empty())  	{  		// Must supply a subject -		LLNotifications::instance().add("MustSpecifyGroupNoticeSubject"); +		LLNotificationsUtil::add("MustSpecifyGroupNoticeSubject");  		return;  	}  	send_group_notice( diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp index 7b5b232ad2..da7922d657 100644 --- a/indra/newview/llpanelgrouproles.cpp +++ b/indra/newview/llpanelgrouproles.cpp @@ -42,6 +42,7 @@  #include "lliconctrl.h"  #include "lllineeditor.h"  #include "llnamelistctrl.h" +#include "llnotificationsutil.h"  #include "llnotify.h"  #include "llpanelgrouproles.h"  #include "llscrolllistctrl.h" @@ -231,7 +232,7 @@ BOOL LLPanelGroupRoles::attemptTransition()  		LLSD args;  		args["NEEDS_APPLY_MESSAGE"] = mesg;  		args["WANT_APPLY_MESSAGE"] = mWantApplyMesg; -		LLNotifications::instance().add("PanelGroupApply", args, LLSD(), +		LLNotificationsUtil::add("PanelGroupApply", args, LLSD(),  			boost::bind(&LLPanelGroupRoles::handleNotifyCallback, this, _1, _2));  		mHasModal = TRUE;  		// We need to reselect the current tab, since it isn't finished. @@ -275,7 +276,7 @@ void LLPanelGroupRoles::transitionToTab()  bool LLPanelGroupRoles::handleNotifyCallback(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	mHasModal = FALSE;  	switch (option)  	{ @@ -291,7 +292,7 @@ bool LLPanelGroupRoles::handleNotifyCallback(const LLSD& notification, const LLS  				mHasModal = TRUE;  				LLSD args;  				args["MESSAGE"] = apply_mesg; -				LLNotifications::instance().add("GenericAlert", args, LLSD(), boost::bind(&LLPanelGroupRoles::onModalClose, this, _1, _2)); +				LLNotificationsUtil::add("GenericAlert", args, LLSD(), boost::bind(&LLPanelGroupRoles::onModalClose, this, _1, _2));  			}  			// Skip switching tabs.  			break; @@ -1279,7 +1280,7 @@ bool LLPanelGroupMembersSubTab::apply(std::string& mesg)  			{  				mHasModal = TRUE;  				args["ROLE_NAME"] = rd.mRoleName; -				LLNotifications::instance().add("AddGroupOwnerWarning", +				LLNotificationsUtil::add("AddGroupOwnerWarning",  										args,  										LLSD(),  										boost::bind(&LLPanelGroupMembersSubTab::addOwnerCB, this, _1, _2)); @@ -1304,7 +1305,7 @@ bool LLPanelGroupMembersSubTab::apply(std::string& mesg)  bool LLPanelGroupMembersSubTab::addOwnerCB(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	mHasModal = FALSE;  	if (0 == option) @@ -2126,7 +2127,7 @@ void LLPanelGroupRolesSubTab::handleActionCheck(LLUICtrl* ctrl, bool force)  				{  					warning = "AssignDangerousAbilityWarning";  				} -				LLNotifications::instance().add(warning, args, LLSD(), boost::bind(&LLPanelGroupRolesSubTab::addActionCB, this, _1, _2, check)); +				LLNotificationsUtil::add(warning, args, LLSD(), boost::bind(&LLPanelGroupRolesSubTab::addActionCB, this, _1, _2, check));  			}  			else  			{ @@ -2154,7 +2155,7 @@ bool LLPanelGroupRolesSubTab::addActionCB(const LLSD& notification, const LLSD&  	mHasModal = FALSE; -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (0 == option)  	{  		// User clicked "Yes" @@ -2300,7 +2301,7 @@ void LLPanelGroupRolesSubTab::handleDeleteRole()  	{  		LLSD args;  		args["MESSAGE"] = mRemoveEveryoneTxt; -		LLNotifications::instance().add("GenericAlert", args); +		LLNotificationsUtil::add("GenericAlert", args);  		return;  	} diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index ec0f8e303c..d2a17dbd97 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -51,6 +51,7 @@  #include "llfloaterpreference.h"  #include "llfocusmgr.h"  #include "lllineeditor.h" +#include "llnotificationsutil.h"  #include "llstartup.h"  #include "lltextbox.h"  #include "llui.h" @@ -225,6 +226,7 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,  	LLComboBox* combo = getChild<LLComboBox>("start_location_combo"); +	LLURLSimString::setString(gSavedSettings.getString("LoginLocation"));  	std::string sim_string = LLURLSimString::sInstance.mSimString;  	if (!sim_string.empty())  	{ @@ -892,14 +894,29 @@ void LLPanelLogin::onClickConnect(void *)  		LLComboBox* combo = sInstance->getChild<LLComboBox>("start_location_combo");  		std::string combo_text = combo->getSimple(); -		if (first.empty() || last.empty()) +		bool has_first_and_last = !(first.empty() || last.empty()); +		bool has_location = false; + +		if(combo_text=="<Type region name>" || combo_text =="") +		{ +			// *NOTE: Mani - Location field is not always committed by this point! +			// This may be duplicate work, but better than not doing the work! +			LLURLSimString::sInstance.setString(""); +		} +		else  +		{ +			// *NOTE: Mani - Location field is not always committed by this point! +			LLURLSimString::sInstance.setString(combo_text); +			has_location = true; +		} + +		if(!has_first_and_last)  		{ -			LLNotifications::instance().add("MustHaveAccountToLogIn"); +			LLNotificationsUtil::add("MustHaveAccountToLogIn");  		} -		else if( (combo_text=="<Type region name>" || combo_text =="") -				&& LLURLSimString::sInstance.mSimString =="") +		else if(!has_location)  		{ -			LLNotifications::instance().add("StartRegionEmpty"); +			LLNotificationsUtil::add("StartRegionEmpty");  		}  		else  		{ @@ -913,7 +930,7 @@ void LLPanelLogin::onClickConnect(void *)  // static  bool LLPanelLogin::newAccountAlertCallback(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (0 == option)  	{  		llinfos << "Going to account creation URL" << llendl; @@ -954,7 +971,7 @@ void LLPanelLogin::onPassKey(LLLineEditor* caller, void* user_data)  {  	if (gKeyboard->getKeyDown(KEY_CAPSLOCK) && sCapslockDidNotification == FALSE)  	{ -		LLNotifications::instance().add("CapsKeyOn"); +		LLNotificationsUtil::add("CapsKeyOn");  		sCapslockDidNotification = TRUE;  	}  } diff --git a/indra/newview/llpanelmediasettingsgeneral.cpp b/indra/newview/llpanelmediasettingsgeneral.cpp index 9b1f71a9a9..5bb266a01d 100644 --- a/indra/newview/llpanelmediasettingsgeneral.cpp +++ b/indra/newview/llpanelmediasettingsgeneral.cpp @@ -32,12 +32,17 @@  #include "llviewerprecompiledheaders.h" -#include "llagent.h"  #include "llpanelmediasettingsgeneral.h" + +// library includes  #include "llcombobox.h"  #include "llcheckboxctrl.h" +#include "llnotificationsutil.h"  #include "llspinctrl.h"  #include "lluictrlfactory.h" + +// project includes +#include "llagent.h"  #include "llviewerwindow.h"  #include "llviewermedia.h"  #include "llsdutil.h" @@ -360,7 +365,7 @@ void LLPanelMediaSettingsGeneral::onCommitHomeURL( LLUICtrl* ctrl, void *userdat  	std::string home_url = self->mHomeURL->getValue().asString();  	if ( ! self->mParent->passesWhiteList( home_url ) )  	{ -		LLNotifications::instance().add("WhiteListInvalidatesHomeUrl");		 +		LLNotificationsUtil::add("WhiteListInvalidatesHomeUrl");		  		return;  	}; diff --git a/indra/newview/llpanelmediasettingssecurity.cpp b/indra/newview/llpanelmediasettingssecurity.cpp index 1a772e4eff..94e137b0f4 100644 --- a/indra/newview/llpanelmediasettingssecurity.cpp +++ b/indra/newview/llpanelmediasettingssecurity.cpp @@ -31,10 +31,13 @@   */  #include "llviewerprecompiledheaders.h" -#include "llfloaterreg.h" +  #include "llpanelmediasettingssecurity.h" + +#include "llfloaterreg.h"  #include "llpanelcontents.h"  #include "llcheckboxctrl.h" +#include "llnotificationsutil.h"  #include "llscrolllistctrl.h"  #include "llscrolllistitem.h"  #include "lluictrlfactory.h" @@ -316,7 +319,7 @@ void LLPanelMediaSettingsSecurity::addWhiteListItem(const std::string& url)  	else  	// display a message indicating you can't do that  	{ -		LLNotifications::instance().add("WhiteListInvalidatesHomeUrl"); +		LLNotificationsUtil::add("WhiteListInvalidatesHomeUrl");  	};  } diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp index 4237681c80..342d2bc739 100644 --- a/indra/newview/llpanelobjectinventory.cpp +++ b/indra/newview/llpanelobjectinventory.cpp @@ -42,6 +42,7 @@  #include "llpanelobjectinventory.h"  #include "llmenugl.h" +#include "llnotificationsutil.h"  #include "roles_constants.h"  #include "llagent.h" @@ -207,7 +208,7 @@ void LLTaskInvFVBridge::buyItem()  	LLViewerObject* obj;  	if( ( obj = gObjectList.findObject( mPanel->getTaskUUID() ) ) && obj->isAttachment() )  	{ -		LLNotifications::instance().add("Cannot_Purchase_an_Attachment"); +		LLNotificationsUtil::add("Cannot_Purchase_an_Attachment");  		llinfos << "Attempt to purchase an attachment" << llendl;  		delete inv;  	} @@ -219,9 +220,9 @@ void LLTaskInvFVBridge::buyItem()          if (sale_info.getSaleType() != LLSaleInfo::FS_CONTENTS)          {          	U32 next_owner_mask = perm.getMaskNextOwner(); -        	args["MODIFYPERM"] = LLNotifications::instance().getGlobalString((next_owner_mask & PERM_MODIFY) ? "PermYes" : "PermNo"); -        	args["COPYPERM"] = LLNotifications::instance().getGlobalString((next_owner_mask & PERM_COPY) ? "PermYes" : "PermNo"); -        	args["RESELLPERM"] = LLNotifications::instance().getGlobalString((next_owner_mask & PERM_TRANSFER) ? "PermYes" : "PermNo"); +        	args["MODIFYPERM"] = LLTrans::getString((next_owner_mask & PERM_MODIFY) ? "PermYes" : "PermNo"); +        	args["COPYPERM"] = LLTrans::getString((next_owner_mask & PERM_COPY) ? "PermYes" : "PermNo"); +        	args["RESELLPERM"] = LLTrans::getString((next_owner_mask & PERM_TRANSFER) ? "PermYes" : "PermNo");          }  		std::string alertdesc; @@ -243,7 +244,7 @@ void LLTaskInvFVBridge::buyItem()  		payload["task_id"] = inv->mTaskID;  		payload["item_id"] = inv->mItemID;  		payload["type"] = inv->mType; -		LLNotifications::instance().add(alertdesc, args, payload, LLTaskInvFVBridge::commitBuyItem); +		LLNotificationsUtil::add(alertdesc, args, payload, LLTaskInvFVBridge::commitBuyItem);  	}  } @@ -263,7 +264,7 @@ S32 LLTaskInvFVBridge::getPrice()  // static  bool LLTaskInvFVBridge::commitBuyItem(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if(0 == option)  	{  		LLViewerObject* object = gObjectList.findObject(notification["payload"]["task_id"].asUUID()); @@ -423,7 +424,7 @@ BOOL LLTaskInvFVBridge::isItemRemovable()  bool remove_task_inventory_callback(const LLSD& notification, const LLSD& response, LLPanelObjectInventory* panel)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	LLViewerObject* object = gObjectList.findObject(notification["payload"]["task_id"].asUUID());  	if(option == 0 && object)  	{ @@ -468,7 +469,7 @@ BOOL LLTaskInvFVBridge::removeItem()  				LLSD payload;  				payload["task_id"] = mPanel->getTaskUUID();  				payload["inventory_ids"].append(mUUID); -				LLNotifications::instance().add("RemoveItemWarn", LLSD(), payload, boost::bind(&remove_task_inventory_callback, _1, _2, mPanel)); +				LLNotificationsUtil::add("RemoveItemWarn", LLSD(), payload, boost::bind(&remove_task_inventory_callback, _1, _2, mPanel));  				return FALSE;  			}  		} @@ -498,7 +499,7 @@ void LLTaskInvFVBridge::removeBatch(LLDynamicArray<LLFolderViewEventListener*>&  			LLTaskInvFVBridge* itemp = (LLTaskInvFVBridge*)batch[i];  			payload["inventory_ids"].append(itemp->getUUID());  		} -		LLNotifications::instance().add("RemoveItemWarn", LLSD(), payload, boost::bind(&remove_task_inventory_callback, _1, _2, mPanel)); +		LLNotificationsUtil::add("RemoveItemWarn", LLSD(), payload, boost::bind(&remove_task_inventory_callback, _1, _2, mPanel));  	}  	else @@ -1169,7 +1170,7 @@ void LLTaskLSLBridge::openItem()  	}  	else  	{	 -		LLNotifications::instance().add("CannotOpenScriptObjectNoMod"); +		LLNotificationsUtil::add("CannotOpenScriptObjectNoMod");  	}  } diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp index d8e0d91d88..6a29d76aad 100644 --- a/indra/newview/llpanelpermissions.cpp +++ b/indra/newview/llpanelpermissions.cpp @@ -36,13 +36,16 @@  #include "llpanelpermissions.h" +// library includes  #include "lluuid.h"  #include "llpermissions.h"  #include "llcategory.h"  #include "llclickaction.h"  #include "llfocusmgr.h" +#include "llnotificationsutil.h"  #include "llstring.h" +// project includes  #include "llviewerwindow.h"  #include "llresmgr.h"  #include "lltextbox.h" @@ -891,7 +894,7 @@ void LLPanelPermissions::cbGroupID(LLUUID group_id)  bool callback_deed_to_group(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (0 == option)  	{  		LLUUID group_id; @@ -907,7 +910,7 @@ bool callback_deed_to_group(const LLSD& notification, const LLSD& response)  void LLPanelPermissions::onClickDeedToGroup(void* data)  { -	LLNotifications::instance().add( "DeedObjectToGroup", LLSD(), LLSD(), callback_deed_to_group); +	LLNotificationsUtil::add( "DeedObjectToGroup", LLSD(), LLSD(), callback_deed_to_group);  }  ///---------------------------------------------------------------------------- @@ -1084,7 +1087,7 @@ void LLPanelPermissions::onCommitClickAction(LLUICtrl* ctrl, void*)  		LLSelectMgr::getInstance()->selectGetSaleInfo(sale_info);  		if (!sale_info.isForSale())  		{ -			LLNotifications::instance().add("CantSetBuyObject"); +			LLNotificationsUtil::add("CantSetBuyObject");  			// Set click action back to its old value  			U8 click_action = 0; @@ -1102,7 +1105,7 @@ void LLPanelPermissions::onCommitClickAction(LLUICtrl* ctrl, void*)  		if (!can_pay)  		{  			// Warn, but do it anyway. -			LLNotifications::instance().add("ClickActionNotPayable"); +			LLNotificationsUtil::add("ClickActionNotPayable");  		}  	}  	LLSelectMgr::getInstance()->selectionSetClickAction(click_action); diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp index 10b90b08d7..4abb60dded 100644 --- a/indra/newview/llpanelpicks.cpp +++ b/indra/newview/llpanelpicks.cpp @@ -32,12 +32,15 @@  #include "llviewerprecompiledheaders.h" +#include "llpanelpicks.h" +  #include "llagent.h"  #include "llagentpicksinfo.h"  #include "llavatarconstants.h"  #include "llflatlistview.h"  #include "llfloaterreg.h"  #include "llfloaterworldmap.h" +#include "llnotificationsutil.h"  #include "lltexturectrl.h"  #include "lltoggleablemenu.h"  #include "llviewergenericmessage.h"	// send_generic_message @@ -47,7 +50,6 @@  #include "llaccordionctrl.h"  #include "llaccordionctrltab.h" -#include "llpanelpicks.h"  #include "llavatarpropertiesprocessor.h"  #include "llpanelavatar.h"  #include "llpanelprofile.h" @@ -431,7 +433,7 @@ void LLPanelPicks::onClickDelete()  	{  		LLSD args;   		args["PICK"] = value[PICK_NAME];  -		LLNotifications::instance().add("DeleteAvatarPick", args, LLSD(), boost::bind(&LLPanelPicks::callbackDeletePick, this, _1, _2));  +		LLNotificationsUtil::add("DeleteAvatarPick", args, LLSD(), boost::bind(&LLPanelPicks::callbackDeletePick, this, _1, _2));   		return;  	} @@ -440,14 +442,14 @@ void LLPanelPicks::onClickDelete()  	{  		LLSD args;   		args["NAME"] = value[CLASSIFIED_NAME];  -		LLNotifications::instance().add("DeleteClassified", args, LLSD(), boost::bind(&LLPanelPicks::callbackDeleteClassified, this, _1, _2));  +		LLNotificationsUtil::add("DeleteClassified", args, LLSD(), boost::bind(&LLPanelPicks::callbackDeleteClassified, this, _1, _2));   		return;  	}  }  bool LLPanelPicks::callbackDeletePick(const LLSD& notification, const LLSD& response)   { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	LLSD pick_value = mPicksList->getSelectedValue();  	if (0 == option) @@ -461,7 +463,7 @@ bool LLPanelPicks::callbackDeletePick(const LLSD& notification, const LLSD& resp  bool LLPanelPicks::callbackDeleteClassified(const LLSD& notification, const LLSD& response)   { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	LLSD value = mClassifiedsList->getSelectedValue();  	if (0 == option) @@ -475,7 +477,7 @@ bool LLPanelPicks::callbackDeleteClassified(const LLSD& notification, const LLSD  bool LLPanelPicks::callbackTeleport( const LLSD& notification, const LLSD& response )  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (0 == option)  	{ @@ -540,7 +542,7 @@ void LLPanelPicks::onDoubleClickPickItem(LLUICtrl* item)  	LLSD args;   	args["PICK"] = pick_value[PICK_NAME];  -	LLNotifications::instance().add("TeleportToPick", args, LLSD(), boost::bind(&LLPanelPicks::callbackTeleport, this, _1, _2));  +	LLNotificationsUtil::add("TeleportToPick", args, LLSD(), boost::bind(&LLPanelPicks::callbackTeleport, this, _1, _2));   }  void LLPanelPicks::onDoubleClickClassifiedItem(LLUICtrl* item) @@ -550,7 +552,7 @@ void LLPanelPicks::onDoubleClickClassifiedItem(LLUICtrl* item)  	LLSD args;   	args["CLASSIFIED"] = value[CLASSIFIED_NAME];  -	LLNotifications::instance().add("TeleportToClassified", args, LLSD(), boost::bind(&LLPanelPicks::callbackTeleport, this, _1, _2));  +	LLNotificationsUtil::add("TeleportToClassified", args, LLSD(), boost::bind(&LLPanelPicks::callbackTeleport, this, _1, _2));   }  void LLPanelPicks::updateButtons() diff --git a/indra/newview/llpanelplace.cpp b/indra/newview/llpanelplace.cpp index 61e18195b8..71d763b562 100644 --- a/indra/newview/llpanelplace.cpp +++ b/indra/newview/llpanelplace.cpp @@ -46,6 +46,7 @@  #include "llbutton.h"  #include "llfloaterworldmap.h"  #include "lllineeditor.h" +#include "llnotificationsutil.h"  #include "lluiconstants.h"  #include "lltextbox.h"  #include "lltexteditor.h" @@ -401,13 +402,13 @@ void LLPanelPlace::onClickAuction(void* data)  	LLSD args;  	args["AUCTION_ID"] = self->mAuctionID; -	LLNotifications::instance().add("GoToAuctionPage", args); +	LLNotificationsUtil::add("GoToAuctionPage", args);  }  /*  // static  bool LLPanelPlace::callbackAuctionWebPage(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (0 == option)  	{  		std::string url; diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp index 257a21ca15..839b2ec45e 100644 --- a/indra/newview/llpanelplaces.cpp +++ b/indra/newview/llpanelplaces.cpp @@ -43,7 +43,7 @@  #include "llcombobox.h"  #include "llfiltereditor.h"  #include "llfloaterreg.h" -#include "llnotifications.h" +#include "llnotificationsutil.h"  #include "lltabcontainer.h"  #include "lltexteditor.h"  #include "lltrans.h" @@ -417,7 +417,7 @@ void LLPanelPlaces::onTeleportButtonClicked()  		{  			LLSD payload;  			payload["asset_id"] = mItem->getAssetUUID(); -			LLNotifications::instance().add("TeleportFromLandmark", LLSD(), payload); +			LLNotificationsUtil::add("TeleportFromLandmark", LLSD(), payload);  		}  		else if (mPlaceInfoType == AGENT_INFO_TYPE ||  				 mPlaceInfoType == REMOTE_PLACE_INFO_TYPE || @@ -906,5 +906,5 @@ static void onSLURLBuilt(std::string& slurl)  	LLSD args;  	args["SLURL"] = slurl; -	LLNotifications::instance().add("CopySLURL", args); +	LLNotificationsUtil::add("CopySLURL", args);  } diff --git a/indra/newview/llpanelplacestab.cpp b/indra/newview/llpanelplacestab.cpp index 42c871a41a..b7669fd63d 100644 --- a/indra/newview/llpanelplacestab.cpp +++ b/indra/newview/llpanelplacestab.cpp @@ -35,7 +35,7 @@  #include "llwindow.h" -#include "llnotifications.h" +#include "llnotificationsutil.h"  #include "llbutton.h"  #include "llslurl.h" @@ -82,5 +82,5 @@ void LLPanelPlacesTab::onRegionResponse(const LLVector3d& landmark_global_pos,  	LLSD args;  	args["SLURL"] = sl_url; -	LLNotifications::instance().add("CopySLURL", args); +	LLNotificationsUtil::add("CopySLURL", args);  } diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp index 67d0e13786..b82b994540 100644 --- a/indra/newview/llpanelteleporthistory.cpp +++ b/indra/newview/llpanelteleporthistory.cpp @@ -41,6 +41,7 @@  #include "llaccordionctrl.h"  #include "llaccordionctrltab.h"  #include "llflatlistview.h" +#include "llnotificationsutil.h"  #include "lltextbox.h"  #include "llviewermenu.h"  #include "llviewerinventory.h" @@ -722,13 +723,13 @@ void LLTeleportHistoryPanel::onCollapseAllFolders()  void LLTeleportHistoryPanel::onClearTeleportHistory()  { -	LLNotifications::instance().add("ConfirmClearTeleportHistory", LLSD(), LLSD(), boost::bind(&LLTeleportHistoryPanel::onClearTeleportHistoryDialog, this, _1, _2)); +	LLNotificationsUtil::add("ConfirmClearTeleportHistory", LLSD(), LLSD(), boost::bind(&LLTeleportHistoryPanel::onClearTeleportHistoryDialog, this, _1, _2));  }  bool LLTeleportHistoryPanel::onClearTeleportHistoryDialog(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (0 == option)  	{ diff --git a/indra/newview/llpreviewgesture.cpp b/indra/newview/llpreviewgesture.cpp index 3d2c529dda..30cb21c83c 100644 --- a/indra/newview/llpreviewgesture.cpp +++ b/indra/newview/llpreviewgesture.cpp @@ -43,6 +43,7 @@  #include "lldir.h"  #include "llfloaterreg.h"  #include "llmultigesture.h" +#include "llnotificationsutil.h"  #include "llvfile.h"  // newview @@ -254,7 +255,7 @@ BOOL LLPreviewGesture::canClose()  	else  	{  		// Bring up view-modal dialog: Save changes? Yes, No, Cancel -		LLNotifications::instance().add("SaveChanges", LLSD(), LLSD(), +		LLNotificationsUtil::add("SaveChanges", LLSD(), LLSD(),  			boost::bind(&LLPreviewGesture::handleSaveChangesDialog, this, _1, _2) );  		return FALSE;  	} @@ -283,7 +284,7 @@ void LLPreviewGesture::onVisibilityChange ( const LLSD& new_visibility )  bool LLPreviewGesture::handleSaveChangesDialog(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	switch(option)  	{  	case 0:  // "Yes" @@ -1054,14 +1055,14 @@ void LLPreviewGesture::saveIfNeeded()  	if (dp.getCurrentSize() > 1000)  	{ -		LLNotifications::instance().add("GestureSaveFailedTooManySteps"); +		LLNotificationsUtil::add("GestureSaveFailedTooManySteps");  		delete gesture;  		gesture = NULL;  	}  	else if (!ok)  	{ -		LLNotifications::instance().add("GestureSaveFailedTryAgain"); +		LLNotificationsUtil::add("GestureSaveFailedTryAgain");  		delete gesture;  		gesture = NULL;  	} @@ -1200,7 +1201,7 @@ void LLPreviewGesture::onSaveComplete(const LLUUID& asset_uuid, void* user_data,  			}  			else  			{ -				LLNotifications::instance().add("GestureSaveFailedObjectNotFound"); +				LLNotificationsUtil::add("GestureSaveFailedObjectNotFound");  			}  		} @@ -1216,7 +1217,7 @@ void LLPreviewGesture::onSaveComplete(const LLUUID& asset_uuid, void* user_data,  		llwarns << "Problem saving gesture: " << status << llendl;  		LLSD args;  		args["REASON"] = std::string(LLAssetStorage::getErrorString(status)); -		LLNotifications::instance().add("GestureSaveFailedReason", args); +		LLNotificationsUtil::add("GestureSaveFailedReason", args);  	}  	delete info;  	info = NULL; diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp index ce81077d80..5d675fcda6 100644 --- a/indra/newview/llpreviewnotecard.cpp +++ b/indra/newview/llpreviewnotecard.cpp @@ -43,6 +43,7 @@  #include "llfloaterreg.h"  #include "llinventorymodel.h"  #include "lllineeditor.h" +#include "llnotificationsutil.h"  #include "llnotify.h"  #include "llresmgr.h"  #include "roles_constants.h" @@ -153,7 +154,7 @@ BOOL LLPreviewNotecard::canClose()  	else  	{  		// Bring up view-modal dialog: Save changes? Yes, No, Cancel -		LLNotifications::instance().add("SaveChanges", LLSD(), LLSD(), boost::bind(&LLPreviewNotecard::handleSaveChangesDialog,this, _1, _2)); +		LLNotificationsUtil::add("SaveChanges", LLSD(), LLSD(), boost::bind(&LLPreviewNotecard::handleSaveChangesDialog,this, _1, _2));  		return FALSE;  	} @@ -330,15 +331,15 @@ void LLPreviewNotecard::onLoadComplete(LLVFS *vfs,  			if( LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE == status ||  				LL_ERR_FILE_EMPTY == status)  			{ -				LLNotifications::instance().add("NotecardMissing"); +				LLNotificationsUtil::add("NotecardMissing");  			}  			else if (LL_ERR_INSUFFICIENT_PERMISSIONS == status)  			{ -				LLNotifications::instance().add("NotecardNoPermissions"); +				LLNotificationsUtil::add("NotecardNoPermissions");  			}  			else  			{ -				LLNotifications::instance().add("UnableToLoadNotecard"); +				LLNotificationsUtil::add("UnableToLoadNotecard");  			}  			llwarns << "Problem loading notecard: " << status << llendl; @@ -493,7 +494,7 @@ void LLPreviewNotecard::onSaveComplete(const LLUUID& asset_uuid, void* user_data  			}  			else  			{ -				LLNotifications::instance().add("SaveNotecardFailObjectNotFound"); +				LLNotificationsUtil::add("SaveNotecardFailObjectNotFound");  			}  		}  		// Perform item copy to inventory @@ -519,7 +520,7 @@ void LLPreviewNotecard::onSaveComplete(const LLUUID& asset_uuid, void* user_data  		llwarns << "Problem saving notecard: " << status << llendl;  		LLSD args;  		args["REASON"] = std::string(LLAssetStorage::getErrorString(status)); -		LLNotifications::instance().add("SaveNotecardFailReason", args); +		LLNotificationsUtil::add("SaveNotecardFailReason", args);  	}  	std::string uuid_string; @@ -532,7 +533,7 @@ void LLPreviewNotecard::onSaveComplete(const LLUUID& asset_uuid, void* user_data  bool LLPreviewNotecard::handleSaveChangesDialog(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	switch(option)  	{  	case 0:  // "Yes" diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp index 4e4711f8fb..0362fdbf56 100644 --- a/indra/newview/llpreviewscript.cpp +++ b/indra/newview/llpreviewscript.cpp @@ -45,7 +45,7 @@  #include "llkeyboard.h"  #include "lllineeditor.h"  #include "llhelp.h" - +#include "llnotificationsutil.h"  #include "llresmgr.h"  #include "llscrollbar.h"  #include "llscrollcontainer.h" @@ -618,14 +618,14 @@ BOOL LLScriptEdCore::canClose()  	else  	{  		// Bring up view-modal dialog: Save changes? Yes, No, Cancel -		LLNotifications::instance().add("SaveChanges", LLSD(), LLSD(), boost::bind(&LLScriptEdCore::handleSaveChangesDialog, this, _1, _2)); +		LLNotificationsUtil::add("SaveChanges", LLSD(), LLSD(), boost::bind(&LLScriptEdCore::handleSaveChangesDialog, this, _1, _2));  		return FALSE;  	}  }  bool LLScriptEdCore::handleSaveChangesDialog(const LLSD& notification, const LLSD& response )  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	switch( option )  	{  	case 0:  // "Yes" @@ -798,7 +798,7 @@ void LLScriptEdCore::onBtnUndoChanges()  {  	if( !mEditor->tryToRevertToPristineState() )  	{ -		LLNotifications::instance().add("ScriptCannotUndo", LLSD(), LLSD(), boost::bind(&LLScriptEdCore::handleReloadFromServerDialog, this, _1, _2)); +		LLNotificationsUtil::add("ScriptCannotUndo", LLSD(), LLSD(), boost::bind(&LLScriptEdCore::handleReloadFromServerDialog, this, _1, _2));  	}  } @@ -827,7 +827,7 @@ void LLScriptEdCore::onErrorList(LLUICtrl*, void* user_data)  bool LLScriptEdCore::handleReloadFromServerDialog(const LLSD& notification, const LLSD& response )  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	switch( option )  	{  	case 0: // "Yes" @@ -1281,7 +1281,7 @@ void LLPreviewLSL::onSaveComplete(const LLUUID& asset_uuid, void* user_data, S32  		llwarns << "Problem saving script: " << status << llendl;  		LLSD args;  		args["REASON"] = std::string(LLAssetStorage::getErrorString(status)); -		LLNotifications::instance().add("SaveScriptFailReason", args); +		LLNotificationsUtil::add("SaveScriptFailReason", args);  	}  	delete info;  } @@ -1319,7 +1319,7 @@ void LLPreviewLSL::onSaveBytecodeComplete(const LLUUID& asset_uuid, void* user_d  		llwarns << "Problem saving LSL Bytecode (Preview)" << llendl;  		LLSD args;  		args["REASON"] = std::string(LLAssetStorage::getErrorString(status)); -		LLNotifications::instance().add("SaveBytecodeFailReason", args); +		LLNotificationsUtil::add("SaveBytecodeFailReason", args);  	}  	delete instance_uuid;  } @@ -1364,15 +1364,15 @@ void LLPreviewLSL::onLoadComplete( LLVFS *vfs, const LLUUID& asset_uuid, LLAsset  			if( LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE == status ||  				LL_ERR_FILE_EMPTY == status)  			{ -				LLNotifications::instance().add("ScriptMissing"); +				LLNotificationsUtil::add("ScriptMissing");  			}  			else if (LL_ERR_INSUFFICIENT_PERMISSIONS == status)  			{ -				LLNotifications::instance().add("ScriptNoPermissions"); +				LLNotificationsUtil::add("ScriptNoPermissions");  			}  			else  			{ -				LLNotifications::instance().add("UnableToLoadScript"); +				LLNotificationsUtil::add("UnableToLoadScript");  			}  			preview->mAssetStatus = PREVIEW_ASSET_ERROR; @@ -1605,15 +1605,15 @@ void LLLiveLSLEditor::onLoadComplete(LLVFS *vfs, const LLUUID& asset_id,  			if( LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE == status ||  				LL_ERR_FILE_EMPTY == status)  			{ -				LLNotifications::instance().add("ScriptMissing"); +				LLNotificationsUtil::add("ScriptMissing");  			}  			else if (LL_ERR_INSUFFICIENT_PERMISSIONS == status)  			{ -				LLNotifications::instance().add("ScriptNoPermissions"); +				LLNotificationsUtil::add("ScriptNoPermissions");  			}  			else  			{ -				LLNotifications::instance().add("UnableToLoadScript"); +				LLNotificationsUtil::add("UnableToLoadScript");  			}  			instance->mAssetStatus = PREVIEW_ASSET_ERROR;  		} @@ -1698,7 +1698,7 @@ void LLLiveLSLEditor::onRunningCheckboxClicked( LLUICtrl*, void* userdata )  	else  	{  		runningCheckbox->set(!running); -		LLNotifications::instance().add("CouldNotStartStopScript"); +		LLNotificationsUtil::add("CouldNotStartStopScript");  	}  } @@ -1721,7 +1721,7 @@ void LLLiveLSLEditor::onReset(void *userdata)  	}  	else  	{ -		LLNotifications::instance().add("CouldNotStartStopScript");  +		LLNotificationsUtil::add("CouldNotStartStopScript");   	}  } @@ -1814,7 +1814,7 @@ void LLLiveLSLEditor::saveIfNeeded()  	LLViewerObject* object = gObjectList.findObject(mObjectUUID);  	if(!object)  	{ -		LLNotifications::instance().add("SaveScriptFailObjectNotFound"); +		LLNotificationsUtil::add("SaveScriptFailObjectNotFound");  		return;  	} @@ -1822,7 +1822,7 @@ void LLLiveLSLEditor::saveIfNeeded()  	{  		// $NOTE: While the error message may not be exactly correct,  		// it's pretty close. -		LLNotifications::instance().add("SaveScriptFailObjectNotFound"); +		LLNotificationsUtil::add("SaveScriptFailObjectNotFound");  		return;  	} @@ -2023,7 +2023,7 @@ void LLLiveLSLEditor::onSaveTextComplete(const LLUUID& asset_uuid, void* user_da  		llwarns << "Unable to save text for a script." << llendl;  		LLSD args;  		args["REASON"] = std::string(LLAssetStorage::getErrorString(status)); -		LLNotifications::instance().add("CompileQueueSaveText", args); +		LLNotificationsUtil::add("CompileQueueSaveText", args);  	}  	else  	{ @@ -2082,7 +2082,7 @@ void LLLiveLSLEditor::onSaveBytecodeComplete(const LLUUID& asset_uuid, void* use  		LLSD args;  		args["REASON"] = std::string(LLAssetStorage::getErrorString(status)); -		LLNotifications::instance().add("CompileQueueSaveBytecode", args); +		LLNotificationsUtil::add("CompileQueueSaveBytecode", args);  	}  	std::string filepath = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,asset_uuid.asString()); diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp index 41cf402d6f..698f6152b4 100644 --- a/indra/newview/llpreviewtexture.cpp +++ b/indra/newview/llpreviewtexture.cpp @@ -43,6 +43,7 @@  #include "llfloaterreg.h"  #include "llimagetga.h"  #include "llinventory.h" +#include "llnotificationsutil.h"  #include "llresmgr.h"  #include "lltrans.h"  #include "lltextbox.h" @@ -352,13 +353,13 @@ void LLPreviewTexture::onFileLoadedForSave(BOOL success,  		{  			LLSD args;  			args["FILE"] = self->mSaveFileName; -			LLNotifications::instance().add("CannotEncodeFile", args); +			LLNotificationsUtil::add("CannotEncodeFile", args);  		}  		else if( !image_tga->save( self->mSaveFileName ) )  		{  			LLSD args;  			args["FILE"] = self->mSaveFileName; -			LLNotifications::instance().add("CannotWriteFile", args); +			LLNotificationsUtil::add("CannotWriteFile", args);  		}  		else  		{ @@ -371,7 +372,7 @@ void LLPreviewTexture::onFileLoadedForSave(BOOL success,  	if( self && !success )  	{ -		LLNotifications::instance().add("CannotDownloadFile"); +		LLNotificationsUtil::add("CannotDownloadFile");  	}  } diff --git a/indra/newview/llscriptfloater.cpp b/indra/newview/llscriptfloater.cpp index bdea6ff459..c58caf9c60 100644 --- a/indra/newview/llscriptfloater.cpp +++ b/indra/newview/llscriptfloater.cpp @@ -37,6 +37,7 @@  #include "llchannelmanager.h"  #include "llchiclet.h"  #include "llfloaterreg.h" +#include "llnotifications.h"  #include "llscreenchannel.h"  #include "lltoastnotifypanel.h"  #include "llviewerwindow.h" diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 4cb561381d..2554f1ccd5 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -41,6 +41,7 @@  #include "lleconomy.h"  #include "llgl.h"  #include "llrender.h" +#include "llnotifications.h"  #include "llpermissions.h"  #include "llpermissionsflags.h"  #include "lltrans.h" diff --git a/indra/newview/llsidepaneltaskinfo.cpp b/indra/newview/llsidepaneltaskinfo.cpp index 4396cce545..09e067b5f9 100644 --- a/indra/newview/llsidepaneltaskinfo.cpp +++ b/indra/newview/llsidepaneltaskinfo.cpp @@ -41,6 +41,7 @@  #include "llcategory.h"  #include "llclickaction.h"  #include "llfocusmgr.h" +#include "llnotificationsutil.h"  #include "llstring.h"  #include "llviewerwindow.h" @@ -865,7 +866,7 @@ void LLSidepanelTaskInfo::cbGroupID(LLUUID group_id)  static bool callback_deed_to_group(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (0 == option)  	{  		LLUUID group_id; @@ -881,7 +882,7 @@ static bool callback_deed_to_group(const LLSD& notification, const LLSD& respons  void LLSidepanelTaskInfo::onClickDeedToGroup()  { -	LLNotifications::instance().add( "DeedObjectToGroup", LLSD(), LLSD(), callback_deed_to_group); +	LLNotificationsUtil::add( "DeedObjectToGroup", LLSD(), LLSD(), callback_deed_to_group);  }  ///---------------------------------------------------------------------------- @@ -1014,7 +1015,7 @@ void LLSidepanelTaskInfo::onCommitClickAction(U8 click_action)  		LLSelectMgr::getInstance()->selectGetSaleInfo(sale_info);  		if (!sale_info.isForSale())  		{ -			LLNotifications::instance().add("CantSetBuyObject"); +			LLNotificationsUtil::add("CantSetBuyObject");  			// Set click action back to its old value  			U8 click_action = 0; @@ -1032,7 +1033,7 @@ void LLSidepanelTaskInfo::onCommitClickAction(U8 click_action)  		if (!can_pay)  		{  			// Warn, but do it anyway. -			LLNotifications::instance().add("ClickActionNotPayable"); +			LLNotificationsUtil::add("ClickActionNotPayable");  		}  	}  	LLSelectMgr::getInstance()->selectionSetClickAction(click_action); diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 736be67710..e7fe85bdf0 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -66,6 +66,8 @@  #include "llmemorystream.h"  #include "llmessageconfig.h"  #include "llmoveview.h" +#include "llnotifications.h" +#include "llnotificationsutil.h"  #include "llteleporthistory.h"  #include "llregionhandle.h"  #include "llsd.h" @@ -444,16 +446,16 @@ bool idle_startup()  		if (LLFeatureManager::getInstance()->isSafe())  		{ -			LLNotifications::instance().add("DisplaySetToSafe"); +			LLNotificationsUtil::add("DisplaySetToSafe");  		}  		else if ((gSavedSettings.getS32("LastFeatureVersion") < LLFeatureManager::getInstance()->getVersion()) &&  				 (gSavedSettings.getS32("LastFeatureVersion") != 0))  		{ -			LLNotifications::instance().add("DisplaySetToRecommended"); +			LLNotificationsUtil::add("DisplaySetToRecommended");  		}  		else if (!gViewerWindow->getInitAlert().empty())  		{ -			LLNotifications::instance().add(gViewerWindow->getInitAlert()); +			LLNotificationsUtil::add(gViewerWindow->getInitAlert());  		}  		gSavedSettings.setS32("LastFeatureVersion", LLFeatureManager::getInstance()->getVersion()); @@ -1156,7 +1158,7 @@ bool idle_startup()  					LLSD args;  					args["ERROR_MESSAGE"] = emsg.str();  					LL_INFOS("LLStartup") << "Notification: " << args << LL_ENDL; -					LLNotifications::instance().add("ErrorMessage", args, LLSD(), login_alert_done); +					LLNotificationsUtil::add("ErrorMessage", args, LLSD(), login_alert_done);  				}  				//setup map of datetime strings to codes and slt & local time offset from utc @@ -1179,7 +1181,7 @@ bool idle_startup()  				LLSD args;  				args["ERROR_MESSAGE"] = emsg.str();  				LL_INFOS("LLStartup") << "Notification: " << args << LL_ENDL; -				LLNotifications::instance().add("ErrorMessage", args, LLSD(), login_alert_done); +				LLNotificationsUtil::add("ErrorMessage", args, LLSD(), login_alert_done);  				transition_back_to_login_panel(emsg.str());  				show_connect_box = true;  			} @@ -1899,7 +1901,7 @@ bool idle_startup()  				{  					msg = "AvatarMovedLast";  				} -				LLNotifications::instance().add(msg); +				LLNotificationsUtil::add(msg);  			}  		} @@ -1984,7 +1986,7 @@ bool idle_startup()  			// initial outfit, but if the load hasn't started  			// already then something is wrong so fall back  			// to generic outfits. JC -			LLNotifications::instance().add("WelcomeChooseSex", LLSD(), LLSD(), +			LLNotificationsUtil::add("WelcomeChooseSex", LLSD(), LLSD(),  				callback_choose_gender);  			LLStartUp::setStartupState( STATE_CLEANUP );  			return TRUE; @@ -1992,7 +1994,7 @@ bool idle_startup()  		if (wearables_time > MAX_WEARABLES_TIME)  		{ -			LLNotifications::instance().add("ClothingLoading"); +			LLNotificationsUtil::add("ClothingLoading");  			LLViewerStats::getInstance()->incStat(LLViewerStats::ST_WEARABLES_TOO_LONG);  			LLStartUp::setStartupState( STATE_CLEANUP );  			return TRUE; @@ -2318,12 +2320,12 @@ bool is_hex_string(U8* str, S32 len)  void show_first_run_dialog()  { -	LLNotifications::instance().add("FirstRun", LLSD(), LLSD(), first_run_dialog_callback); +	LLNotificationsUtil::add("FirstRun", LLSD(), LLSD(), first_run_dialog_callback);  }  bool first_run_dialog_callback(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (0 == option)  	{  		LL_DEBUGS("AppInit") << "First run dialog cancelling" << LL_ENDL; @@ -2346,7 +2348,7 @@ void set_startup_status(const F32 frac, const std::string& string, const std::st  bool login_alert_status(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);      // Buttons      switch( option )      { @@ -2380,7 +2382,7 @@ void use_circuit_callback(void**, S32 result)  		{  			// Make sure user knows something bad happened. JC  			LL_WARNS("AppInit") << "Backing up to login screen!" << LL_ENDL; -			LLNotifications::instance().add("LoginPacketNeverReceived", LLSD(), LLSD(), login_alert_status); +			LLNotificationsUtil::add("LoginPacketNeverReceived", LLSD(), LLSD(), login_alert_status);  			reset_login();  		}  		else @@ -2585,7 +2587,7 @@ const S32 OPT_FEMALE = 1;  bool callback_choose_gender(const LLSD& notification, const LLSD& response)  {	 -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	switch(option)  	{  	case OPT_MALE: diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp index f668a72c4e..6074bb2be9 100644 --- a/indra/newview/llstatusbar.cpp +++ b/indra/newview/llstatusbar.cpp @@ -73,12 +73,14 @@  #include "llfocusmgr.h"  #include "llappviewer.h"  #include "lltrans.h" +  // library includes  #include "imageids.h"  #include "llfloaterreg.h"  #include "llfontgl.h"  #include "llrect.h"  #include "llerror.h" +#include "llnotificationsutil.h"  #include "llparcel.h"  #include "llstring.h"  #include "message.h" @@ -499,7 +501,7 @@ static void onClickBuyCurrency(void* data)  static void onClickHealth(void* )  { -	LLNotifications::instance().add("NotSafe"); +	LLNotificationsUtil::add("NotSafe");  }  static void onClickScriptDebug(void*) diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp index f9cbdc20d6..bf485b7e65 100644 --- a/indra/newview/lltoast.cpp +++ b/indra/newview/lltoast.cpp @@ -36,6 +36,7 @@  #include "llbutton.h"  #include "llfocusmgr.h" +#include "llnotifications.h"  #include "llviewercontrol.h"  using namespace LLNotificationsUI; diff --git a/indra/newview/lltoast.h b/indra/newview/lltoast.h index b670f47045..769b2ba122 100644 --- a/indra/newview/lltoast.h +++ b/indra/newview/lltoast.h @@ -37,7 +37,7 @@  #include "llpanel.h"  #include "llmodaldialog.h"  #include "lltimer.h" -#include "llnotifications.h" +#include "llnotificationptr.h"  #include "llviewercontrol.h" diff --git a/indra/newview/lltoastalertpanel.h b/indra/newview/lltoastalertpanel.h index 840143a2a9..38a635e8a4 100644 --- a/indra/newview/lltoastalertpanel.h +++ b/indra/newview/lltoastalertpanel.h @@ -40,7 +40,7 @@  #include "lltoastpanel.h"  #include "llfloater.h"  #include "llui.h" -#include "llnotifications.h" +#include "llnotificationptr.h"  #include "llalertdialog.h"  class LLButton; diff --git a/indra/newview/lltoastgroupnotifypanel.cpp b/indra/newview/lltoastgroupnotifypanel.cpp index d1bdcb1354..eacc077a65 100644 --- a/indra/newview/lltoastgroupnotifypanel.cpp +++ b/indra/newview/lltoastgroupnotifypanel.cpp @@ -39,6 +39,7 @@  #include "llbutton.h"  #include "lliconctrl.h"  #include "llinventoryfunctions.h" +#include "llnotifications.h"  #include "llnotify.h"  #include "llviewertexteditor.h" @@ -205,7 +206,7 @@ void LLToastGroupNotifyPanel::onClickAttachment()  		//if attachment isn't openable - notify about saving  		if (!isAttachmentOpenable(mInventoryOffer->mType)) { -			LLNotifications::instance().add("AttachmentSaved"); +			LLNotifications::instance().add("AttachmentSaved", LLSD(), LLSD());  		}  		mInventoryOffer = NULL; diff --git a/indra/newview/lltoastgroupnotifypanel.h b/indra/newview/lltoastgroupnotifypanel.h index e3d0ef45cb..4879000e8c 100644 --- a/indra/newview/lltoastgroupnotifypanel.h +++ b/indra/newview/lltoastgroupnotifypanel.h @@ -38,7 +38,7 @@  #include "lldarray.h"  #include "lltimer.h"  #include "llviewermessage.h" -#include "llnotifications.h" +#include "llnotificationptr.h"  class LLButton; diff --git a/indra/newview/lltoastimpanel.cpp b/indra/newview/lltoastimpanel.cpp index 9040bdb41a..f928b5f243 100644 --- a/indra/newview/lltoastimpanel.cpp +++ b/indra/newview/lltoastimpanel.cpp @@ -33,6 +33,8 @@  #include "llviewerprecompiledheaders.h"  #include "lltoastimpanel.h" +#include "llnotifications.h" +  const S32 LLToastIMPanel::DEFAULT_MESSAGE_MAX_LINE_COUNT	= 6;  //-------------------------------------------------------------------------- diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp index 699424ef36..6b9bff7b9e 100644 --- a/indra/newview/lltoastnotifypanel.cpp +++ b/indra/newview/lltoastnotifypanel.cpp @@ -33,7 +33,12 @@  #include "llviewerprecompiledheaders.h"  #include "lltoastnotifypanel.h" + +// project includes  #include "llviewercontrol.h" + +// library includes +#include "llnotifications.h"  #include "lluiconstants.h"  #include "llrect.h"  #include "lltrans.h" diff --git a/indra/newview/lltoastnotifypanel.h b/indra/newview/lltoastnotifypanel.h index eea70705ec..04525387b3 100644 --- a/indra/newview/lltoastnotifypanel.h +++ b/indra/newview/lltoastnotifypanel.h @@ -35,13 +35,14 @@  #include "llpanel.h"  #include "llfontgl.h" -#include "llnotifications.h" +#include "llnotificationptr.h"  #include "llbutton.h"  #include "lltoastpanel.h"  #include "lliconctrl.h"  #include "lltexteditor.h"  #include "lltextbox.h" +class LLNotificationForm;  /**   * Toast panel for notification. @@ -68,7 +69,7 @@ protected:  private: -	void adjustPanelForScriptNotice(const LLNotificationFormPtr form); +	void adjustPanelForScriptNotice(const boost::shared_ptr<LLNotificationForm> form);  	void adjustPanelForTipNotice();  	// panel elements diff --git a/indra/newview/lltoastpanel.cpp b/indra/newview/lltoastpanel.cpp index ef75e06047..afb9e261b0 100644 --- a/indra/newview/lltoastpanel.cpp +++ b/indra/newview/lltoastpanel.cpp @@ -34,6 +34,8 @@  #include "lltoastpanel.h" +#include "llnotifications.h" +  //static  const S32 LLToastPanel::MIN_PANEL_HEIGHT = 40; // VPAD(4)*2 + ICON_HEIGHT(32) @@ -46,12 +48,19 @@ LLToastPanel::~LLToastPanel()  {  } +//virtual  std::string LLToastPanel::getTitle()  {  	// *TODO: create Title and localize it. If it will be required.  	return mNotification->getMessage();  } +//virtual +const LLUUID& LLToastPanel::getID() +{ +	return mNotification->id(); +} +  //snap to the message height if it is visible  void LLToastPanel::snapToMessageHeight(LLTextBase* message, S32 maxLineCount)  { diff --git a/indra/newview/lltoastpanel.h b/indra/newview/lltoastpanel.h index a88127b008..f1dd7d7a86 100644 --- a/indra/newview/lltoastpanel.h +++ b/indra/newview/lltoastpanel.h @@ -35,7 +35,7 @@  #include "llpanel.h"  #include "lltextbox.h" -#include "llnotifications.h" +#include "llnotificationptr.h"  #include <string> @@ -57,7 +57,7 @@ public:  	virtual ~LLToastPanel() = 0;  	virtual std::string getTitle(); -	virtual const LLUUID& getID() { return mNotification->id();} +	virtual const LLUUID& getID();  	static const S32 MIN_PANEL_HEIGHT;  protected: diff --git a/indra/newview/lltoolbrush.cpp b/indra/newview/lltoolbrush.cpp index 0088a6a2a4..3593064bef 100644 --- a/indra/newview/lltoolbrush.cpp +++ b/indra/newview/lltoolbrush.cpp @@ -35,9 +35,10 @@  #include "lltoolbrush.h"  #include "lltoolselectland.h" +// library headers  #include "llgl.h" +#include "llnotificationsutil.h"  #include "llrender.h" -  #include "message.h"  #include "llagent.h" @@ -672,7 +673,7 @@ void LLToolBrushLand::alertNoTerraform(LLViewerRegion* regionp)  	LLSD args;  	args["REGION"] = regionp->getName(); -	LLNotifications::instance().add("RegionNoTerraforming", args); +	LLNotificationsUtil::add("RegionNoTerraforming", args);  } diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index fbd86d0edf..266fa4dd74 100644 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -35,10 +35,13 @@  #include "message.h"  #include "lltooldraganddrop.h" +// library headers  #include "llfloaterreg.h"  #include "llinstantmessage.h"  #include "lldir.h" +#include "llnotificationsutil.h" +// project headers  #include "llagent.h"  #include "llagentwearables.h"  #include "llviewercontrol.h" @@ -1071,7 +1074,7 @@ BOOL LLToolDragAndDrop::handleDropTextureProtections(LLViewerObject* hit_obj,  		hit_obj->fetchInventoryFromServer();  		LLSD args;  		args["ERROR_MESSAGE"] = "Unable to add texture.\nPlease wait a few seconds and try again."; -		LLNotifications::instance().add("ErrorMessage", args); +		LLNotificationsUtil::add("ErrorMessage", args);  		return FALSE;  	}  	if (hit_obj->getInventoryItemByAsset(item->getAssetUUID())) @@ -1524,14 +1527,14 @@ void LLToolDragAndDrop::giveInventory(const LLUUID& to_agent,  		LLSD payload;  		payload["agent_id"] = to_agent;  		payload["item_id"] = item->getUUID(); -		LLNotifications::instance().add("CannotCopyWarning", LLSD(), payload,  +		LLNotificationsUtil::add("CannotCopyWarning", LLSD(), payload,   		        &LLToolDragAndDrop::handleCopyProtectedItem);  	}  }  // static  bool LLToolDragAndDrop::handleCopyProtectedItem(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	LLInventoryItem* item = NULL;  	switch(option)  	{ @@ -1548,12 +1551,12 @@ bool LLToolDragAndDrop::handleCopyProtectedItem(const LLSD& notification, const  		}  		else  		{ -			LLNotifications::instance().add("CannotGiveItem");		 +			LLNotificationsUtil::add("CannotGiveItem");		  		}  		break;  	default: // no, cancel, whatever, who cares, not yes. -		LLNotifications::instance().add("TransactionCancelled"); +		LLNotificationsUtil::add("TransactionCancelled");  		break;  	}  	return false; @@ -1649,18 +1652,18 @@ void LLToolDragAndDrop::giveInventoryCategory(const LLUUID& to_agent,  	}  	if(!complete)  	{ -		LLNotifications::instance().add("IncompleteInventory"); +		LLNotificationsUtil::add("IncompleteInventory");  		return;  	}   	count = items.count() + cats.count();   	if(count > MAX_ITEMS)    	{ -		LLNotifications::instance().add("TooManyItems"); +		LLNotificationsUtil::add("TooManyItems");    		return;    	}   	else if(count == 0)    	{ -		LLNotifications::instance().add("NoItems"); +		LLNotificationsUtil::add("NoItems");    		return;    	}  	else @@ -1678,7 +1681,7 @@ void LLToolDragAndDrop::giveInventoryCategory(const LLUUID& to_agent,  			LLSD payload;  			payload["agent_id"] = to_agent;  			payload["folder_id"] = cat->getUUID(); -			LLNotifications::instance().add("CannotCopyCountItems", args, payload, &LLToolDragAndDrop::handleCopyProtectedCategory); +			LLNotificationsUtil::add("CannotCopyCountItems", args, payload, &LLToolDragAndDrop::handleCopyProtectedCategory);  		}  	}  } @@ -1687,7 +1690,7 @@ void LLToolDragAndDrop::giveInventoryCategory(const LLUUID& to_agent,  // static  bool LLToolDragAndDrop::handleCopyProtectedCategory(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	LLInventoryCategory* cat = NULL;  	switch(option)  	{ @@ -1714,12 +1717,12 @@ bool LLToolDragAndDrop::handleCopyProtectedCategory(const LLSD& notification, co  		}  		else  		{ -			LLNotifications::instance().add("CannotGiveCategory"); +			LLNotificationsUtil::add("CannotGiveCategory");  		}  		break;  	default: // no, cancel, whatever, who cares, not yes. -		LLNotifications::instance().add("TransactionCancelled"); +		LLNotificationsUtil::add("TransactionCancelled");  		break;  	}  	return false; @@ -1754,12 +1757,12 @@ void LLToolDragAndDrop::commitGiveInventoryCategory(const LLUUID& to_agent,   	S32 count = items.count() + cats.count();   	if(count > MAX_ITEMS)    	{ -		LLNotifications::instance().add("TooManyItems"); +		LLNotificationsUtil::add("TooManyItems");    		return;    	}   	else if(count == 0)    	{ -		LLNotifications::instance().add("NoItems"); +		LLNotificationsUtil::add("NoItems");    		return;    	}  	else @@ -2397,7 +2400,7 @@ EAcceptance LLToolDragAndDrop::dad3dWearItem(  			// destroy clothing items.  			if (!gAgentWearables.areWearablesLoaded())   			{ -				LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded"); +				LLNotificationsUtil::add("CanNotChangeAppearanceUntilLoaded");  				return ACCEPT_NO;  			} @@ -2492,7 +2495,7 @@ EAcceptance LLToolDragAndDrop::dad3dWearCategory(  		// destroy clothing items.  		if (!gAgentWearables.areWearablesLoaded())   		{ -			LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded"); +			LLNotificationsUtil::add("CanNotChangeAppearanceUntilLoaded");  			return ACCEPT_NO;  		}  	} diff --git a/indra/newview/llurldispatcher.cpp b/indra/newview/llurldispatcher.cpp index 9e064d8135..46618d4026 100644 --- a/indra/newview/llurldispatcher.cpp +++ b/indra/newview/llurldispatcher.cpp @@ -49,6 +49,7 @@  #include "llworldmapmessage.h"  // library includes +#include "llnotificationsutil.h"  #include "llsd.h"  class LLURLDispatcherImpl @@ -162,7 +163,7 @@ bool LLURLDispatcherImpl::dispatchApp(const std::string& url,  	// (but still return true because it is a valid app SLURL)  	if (! handled)  	{ -		LLNotifications::instance().add("UnsupportedCommandSLURL"); +		LLNotificationsUtil::add("UnsupportedCommandSLURL");  	}  	return true;  } diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index c6ec25c1cb..d0ae5d1e38 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -33,6 +33,7 @@  #include "llviewerprecompiledheaders.h"  #include "llviewerinventory.h" +#include "llnotificationsutil.h"  #include "message.h"  #include "indra_constants.h" @@ -451,7 +452,7 @@ void LLViewerInventoryCategory::updateServer(BOOL is_new) const  	if (LLFolderType::lookupIsProtectedType(mPreferredType))  	{ -		LLNotifications::instance().add("CannotModifyProtectedCategories"); +		LLNotificationsUtil::add("CannotModifyProtectedCategories");  		return;  	} @@ -475,7 +476,7 @@ void LLViewerInventoryCategory::removeFromServer( void )  	// communicate that change with the server.  	if(LLFolderType::lookupIsProtectedType(mPreferredType))  	{ -		LLNotifications::instance().add("CannotRemoveProtectedCategories"); +		LLNotificationsUtil::add("CannotRemoveProtectedCategories");  		return;  	} diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 9dfdf3d5b1..f2ddb0b1f1 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -47,7 +47,7 @@  #include "llpluginclassmedia.h"  #include "llevent.h"		// LLSimpleListener -#include "llnotifications.h" +#include "llnotificationsutil.h"  #include "lluuid.h"  #include "llkeyboard.h"  #include "llmutelist.h" @@ -987,7 +987,7 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_  	LL_WARNS("Plugin") << "plugin intialization failed for mime type: " << media_type << LL_ENDL;  	LLSD args;  	args["MIME_TYPE"] = media_type; -	LLNotifications::instance().add("NoPlugin", args); +	LLNotificationsUtil::add("NoPlugin", args);  	return NULL;  }							 @@ -1953,7 +1953,7 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla  			// TODO: may want a different message for this case?  			LLSD args;  			args["PLUGIN"] = LLMIMETypes::implType(mMimeType); -			LLNotifications::instance().add("MediaPluginFailed", args); +			LLNotificationsUtil::add("MediaPluginFailed", args);  		}  		break; @@ -1968,7 +1968,7 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla  			LLSD args;  			args["PLUGIN"] = LLMIMETypes::implType(mMimeType);  			// SJB: This is getting called every frame if the plugin fails to load, continuously respawining the alert! -			//LLNotifications::instance().add("MediaPluginFailed", args); +			//LLNotificationsUtil::add("MediaPluginFailed", args);  		}  		break; diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 8bcf2c6281..4307002980 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -51,6 +51,8 @@  #include "llfontgl.h"  #include "llinstantmessage.h"  #include "llinventorypanel.h" +#include "llnotifications.h" +#include "llnotificationsutil.h"  #include "llpermissionsflags.h"  #include "llrect.h"  #include "llsecondlifeurls.h" @@ -2938,7 +2940,7 @@ class LLAvatarReportAbuse : public view_listener_t  bool callback_freeze(const LLSD& notification, const LLSD& response)  {  	LLUUID avatar_id = notification["payload"]["avatar_id"].asUUID(); -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (0 == option || 1 == option)  	{ @@ -2992,14 +2994,14 @@ void handle_avatar_freeze(const LLSD& avatar_id)  			{  				LLSD args;  				args["AVATAR_NAME"] = fullname; -				LLNotifications::instance().add("FreezeAvatarFullname", +				LLNotificationsUtil::add("FreezeAvatarFullname",  							args,  							payload,  							callback_freeze);  			}  			else  			{ -				LLNotifications::instance().add("FreezeAvatar", +				LLNotificationsUtil::add("FreezeAvatar",  							LLSD(),  							payload,  							callback_freeze); @@ -3039,7 +3041,7 @@ class LLAvatarDebug : public view_listener_t  bool callback_eject(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (2 == option)  	{  		// Cancel button. @@ -3121,14 +3123,14 @@ void handle_avatar_eject(const LLSD& avatar_id)  				{      				LLSD args;      				args["AVATAR_NAME"] = fullname; -    				LLNotifications::instance().add("EjectAvatarFullname", +    				LLNotificationsUtil::add("EjectAvatarFullname",      							args,      							payload,      							callback_eject);  				}  				else  				{ -    				LLNotifications::instance().add("EjectAvatarFullname", +    				LLNotificationsUtil::add("EjectAvatarFullname",      							LLSD(),      							payload,      							callback_eject); @@ -3141,14 +3143,14 @@ void handle_avatar_eject(const LLSD& avatar_id)  				{      				LLSD args;      				args["AVATAR_NAME"] = fullname; -    				LLNotifications::instance().add("EjectAvatarFullnameNoBan", +    				LLNotificationsUtil::add("EjectAvatarFullnameNoBan",      							args,      							payload,      							callback_eject);  				}  				else  				{ -    				LLNotifications::instance().add("EjectAvatarNoBan", +    				LLNotificationsUtil::add("EjectAvatarNoBan",      							LLSD(),      							payload,      							callback_eject); @@ -3231,11 +3233,11 @@ class LLAvatarGiveCard : public view_listener_t  				transaction_id.generate();  				msg->addUUIDFast(_PREHASH_TransactionID, transaction_id);  				msg->sendReliable(dest_host); -				LLNotifications::instance().add("OfferedCard", args); +				LLNotificationsUtil::add("OfferedCard", args);  			}  			else  			{ -				LLNotifications::instance().add("CantOfferCallingCard", old_args); +				LLNotificationsUtil::add("CantOfferCallingCard", old_args);  			}  		}  		return true; @@ -3254,7 +3256,7 @@ void login_done(S32 which, void *user)  bool callback_leave_group(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (option == 0)  	{  		LLMessageSystem *msg = gMessageSystem; @@ -3321,7 +3323,7 @@ void handle_buy_object(LLSaleInfo sale_info)  {  	if(!LLSelectMgr::getInstance()->selectGetAllRootsValid())  	{ -		LLNotifications::instance().add("UnableToBuyWhileDownloading"); +		LLNotificationsUtil::add("UnableToBuyWhileDownloading");  		return;  	} @@ -3330,7 +3332,7 @@ void handle_buy_object(LLSaleInfo sale_info)  	BOOL owners_identical = LLSelectMgr::getInstance()->selectGetOwner(owner_id, owner_name);  	if (!owners_identical)  	{ -		LLNotifications::instance().add("CannotBuyObjectsFromDifferentOwners"); +		LLNotificationsUtil::add("CannotBuyObjectsFromDifferentOwners");  		return;  	} @@ -3340,7 +3342,7 @@ void handle_buy_object(LLSaleInfo sale_info)  	valid &= LLSelectMgr::getInstance()->selectGetAggregatePermissions(ag_perm);  	if(!valid || !sale_info.isForSale() || !perm.allowTransferTo(gAgent.getID()))  	{ -		LLNotifications::instance().add("ObjectNotForSale"); +		LLNotificationsUtil::add("ObjectNotForSale");  		return;  	} @@ -3504,12 +3506,12 @@ void set_god_level(U8 god_level)  	if(god_level > GOD_NOT)  	{  		args["LEVEL"] = llformat("%d",(S32)god_level); -		LLNotifications::instance().add("EnteringGodMode", args); +		LLNotificationsUtil::add("EnteringGodMode", args);  	}  	else  	{  		args["LEVEL"] = llformat("%d",(S32)old_god_level); -		LLNotifications::instance().add("LeavingGodMode", args); +		LLNotificationsUtil::add("LeavingGodMode", args);  	}  	// changing god-level can affect which menus we see @@ -3630,7 +3632,7 @@ void request_friendship(const LLUUID& dest_id)  		}  		else  		{ -			LLNotifications::instance().add("CantOfferFriendship"); +			LLNotificationsUtil::add("CantOfferFriendship");  		}  	}  } @@ -3961,7 +3963,7 @@ void handle_claim_public_land(void*)  {  	if (LLViewerParcelMgr::getInstance()->getSelectionRegion() != gAgent.getRegion())  	{ -		LLNotifications::instance().add("ClaimPublicLand"); +		LLNotificationsUtil::add("ClaimPublicLand");  		return;  	} @@ -4157,7 +4159,7 @@ void derez_objects(EDeRezDestination dest, const LLUUID& dest_id)  	}  	else if(!error.empty())  	{ -		LLNotifications::instance().add(error); +		LLNotificationsUtil::add(error);  	}  } @@ -4178,13 +4180,13 @@ class LLObjectReturn : public view_listener_t  		mObjectSelection = LLSelectMgr::getInstance()->getEditSelection(); -		LLNotifications::instance().add("ReturnToOwner", LLSD(), LLSD(), boost::bind(&LLObjectReturn::onReturnToOwner, this, _1, _2)); +		LLNotificationsUtil::add("ReturnToOwner", LLSD(), LLSD(), boost::bind(&LLObjectReturn::onReturnToOwner, this, _1, _2));  		return true;  	}  	bool onReturnToOwner(const LLSD& notification, const LLSD& response)  	{ -		S32 option = LLNotification::getSelectedOption(notification, response); +		S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  		if (0 == option)  		{  			// Ignore category ID for this derez destination. @@ -4361,7 +4363,7 @@ void handle_take()  bool confirm_take(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if(enable_take() && (option == 0))  	{  		derez_objects(DRD_TAKE_INTO_AGENT_INVENTORY, notification["payload"]["folder_id"].asUUID()); @@ -4536,7 +4538,7 @@ S32 selection_price()  /*  bool callback_show_buy_currency(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (0 == option)  	{  		llinfos << "Loading page " << LLNotifications::instance().getGlobalString("BUY_CURRENCY_URL") << llendl; @@ -4562,7 +4564,7 @@ void show_buy_currency(const char* extra)  	{  		args["EXTRA"] = extra;  	} -	LLNotifications::instance().add("PromptGoToCurrencyPage", args);//, LLSD(), callback_show_buy_currency); +	LLNotificationsUtil::add("PromptGoToCurrencyPage", args);//, LLSD(), callback_show_buy_currency);  }  void handle_buy() @@ -4832,7 +4834,7 @@ class LLToolsLink : public view_listener_t  	{  		if(!LLSelectMgr::getInstance()->selectGetAllRootsValid())  		{ -			LLNotifications::instance().add("UnableToLinkWhileDownloading"); +			LLNotificationsUtil::add("UnableToLinkWhileDownloading");  			return true;  		} @@ -4843,18 +4845,18 @@ class LLToolsLink : public view_listener_t  			args["COUNT"] = llformat("%d", object_count);  			int max = MAX_CHILDREN_PER_TASK+1;  			args["MAX"] = llformat("%d", max); -			LLNotifications::instance().add("UnableToLinkObjects", args); +			LLNotificationsUtil::add("UnableToLinkObjects", args);  			return true;  		}  		if(LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() < 2)  		{ -			LLNotifications::instance().add("CannotLinkIncompleteSet"); +			LLNotificationsUtil::add("CannotLinkIncompleteSet");  			return true;  		}  		if(!LLSelectMgr::getInstance()->selectGetRootsModify())  		{ -			LLNotifications::instance().add("CannotLinkModify"); +			LLNotificationsUtil::add("CannotLinkModify");  			return true;  		}  		LLUUID owner_id; @@ -4864,7 +4866,7 @@ class LLToolsLink : public view_listener_t  			// we don't actually care if you're the owner, but novices are  			// the most likely to be stumped by this one, so offer the  			// easiest and most likely solution. -			LLNotifications::instance().add("CannotLinkDifferentOwners"); +			LLNotificationsUtil::add("CannotLinkDifferentOwners");  			return true;  		}  		LLSelectMgr::getInstance()->sendLink(); @@ -5348,7 +5350,7 @@ class LLWorldSetBusy : public view_listener_t  		else  		{  			gAgent.setBusy(); -			LLNotifications::instance().add("BusyModeSet"); +			LLNotificationsUtil::add("BusyModeSet");  		}  		return true;  	} @@ -5464,7 +5466,7 @@ class LLAvatarAddContact : public view_listener_t  bool complete_give_money(const LLSD& notification, const LLSD& response, LLObjectSelectionHandle selection)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (option == 0)  	{  		gAgent.clearBusy(); @@ -5626,12 +5628,7 @@ class LLShowFloater : public view_listener_t  		}  		else if (floater_name == "buy land")  		{ -			if (LLViewerParcelMgr::getInstance()->selectionEmpty()) -			{ -				LLViewerParcelMgr::getInstance()->selectParcelAt(gAgent.getPositionGlobal()); -			} -			 -			LLViewerParcelMgr::getInstance()->startBuyLand(); +			handle_buy_land();  		}  		else if (floater_name == "script errors")  		{ @@ -5690,7 +5687,7 @@ class LLShowSidetrayPanel : public view_listener_t  bool callback_show_url(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (0 == option)  	{  		LLWeb::loadURL(notification["payload"]["url"].asString()); @@ -5713,7 +5710,7 @@ class LLPromptShowURL : public view_listener_t  			{       			LLSD payload;      			payload["url"] = url; -    			LLNotifications::instance().add(alert, LLSD(), payload, callback_show_url); +    			LLNotificationsUtil::add(alert, LLSD(), payload, callback_show_url);  			}  			else  			{ @@ -5730,7 +5727,7 @@ class LLPromptShowURL : public view_listener_t  bool callback_show_file(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (0 == option)  	{  		LLWeb::loadURL(notification["payload"]["url"]); @@ -5751,7 +5748,7 @@ class LLPromptShowFile : public view_listener_t  			LLSD payload;  			payload["url"] = file; -			LLNotifications::instance().add(alert, LLSD(), payload, callback_show_file); +			LLNotificationsUtil::add(alert, LLSD(), payload, callback_show_file);  		}  		else  		{ @@ -5841,7 +5838,15 @@ BOOL enable_buy_land(void*)  				LLViewerParcelMgr::getInstance()->getParcelSelection()->getParcel(), false);  } - +void handle_buy_land() +{ +	LLViewerParcelMgr* vpm = LLViewerParcelMgr::getInstance(); +	if (vpm->selectionEmpty()) +	{ +		vpm->selectParcelAt(gAgent.getPositionGlobal()); +	} +	vpm->startBuyLand(); +}  class LLObjectAttachToAvatar : public view_listener_t  { @@ -6322,12 +6327,12 @@ void queue_actions(LLFloaterScriptQueue* q, const std::string& msg)  		if ( !func.scripted )  		{  			std::string noscriptmsg = std::string("Cannot") + msg + "SelectObjectsNoScripts"; -			LLNotifications::instance().add(noscriptmsg); +			LLNotificationsUtil::add(noscriptmsg);  		}  		else if ( !func.modifiable )  		{  			std::string nomodmsg = std::string("Cannot") + msg + "SelectObjectsNoPermission"; -			LLNotifications::instance().add(nomodmsg); +			LLNotificationsUtil::add(nomodmsg);  		}  		else  		{ @@ -7136,7 +7141,7 @@ void handle_save_to_xml(void*)  	LLFloater* frontmost = gFloaterView->getFrontmost();  	if (!frontmost)  	{ -        LLNotifications::instance().add("NoFrontmostFloater"); +        LLNotificationsUtil::add("NoFrontmostFloater");  		return;  	} diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h index 9a6fe03f9f..01a6b34170 100644 --- a/indra/newview/llviewermenu.h +++ b/indra/newview/llviewermenu.h @@ -102,6 +102,8 @@ void handle_take_copy();  void handle_look_at_selection(const LLSD& param);  void handle_zoom_to_object(LLUUID object_id); +void handle_buy_land(); +  // Takes avatar UUID, or if no UUID passed, uses last selected object  void handle_avatar_freeze(const LLSD& avatar_id); diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index 753acab172..4b0dc8f668 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -61,6 +61,7 @@  #include "llassetuploadresponders.h"  #include "lleconomy.h"  #include "llhttpclient.h" +#include "llnotificationsutil.h"  #include "llsdserialize.h"  #include "llstring.h"  #include "lltransactiontypes.h" @@ -175,7 +176,7 @@ const std::string upload_pick(void* data)  		// No extension  		LLSD args;  		args["FILE"] = short_name; -		LLNotifications::instance().add("NoFileExtension", args); +		LLNotificationsUtil::add("NoFileExtension", args);  		return std::string();  	}  	else @@ -218,7 +219,7 @@ const std::string upload_pick(void* data)  			LLSD args;  			args["EXTENSION"] = ext;  			args["VALIDS"] = valid_extensions; -			LLNotifications::instance().add("InvalidFileExtension", args); +			LLNotificationsUtil::add("InvalidFileExtension", args);  			return std::string();  		}  	}//end else (non-null extension) @@ -236,7 +237,7 @@ const std::string upload_pick(void* data)  			llinfos << error_msg << ": " << filename << llendl;  			LLSD args;  			args["FILE"] = filename; -			LLNotifications::instance().add( error_msg, args ); +			LLNotificationsUtil::add( error_msg, args );  			return std::string();  		}  	}//end if a wave/sound file @@ -338,7 +339,7 @@ class LLFileUploadBulk : public view_listener_t  void upload_error(const std::string& error_message, const std::string& label, const std::string& filename, const LLSD& args)   {  	llwarns << error_message << llendl; -	LLNotifications::instance().add(label, args); +	LLNotificationsUtil::add(label, args);  	if(LLFile::remove(filename) == -1)  	{  		lldebugs << "unable to remove temp file" << llendl; @@ -792,7 +793,7 @@ void upload_new_resource(const std::string& src_filename, std::string name,  		llwarns << error_message << llendl;  		LLSD args;  		args["ERROR_MESSAGE"] = error_message; -		LLNotifications::instance().add("ErrorMessage", args); +		LLNotificationsUtil::add("ErrorMessage", args);  		if(LLFile::remove(filename) == -1)  		{  			lldebugs << "unable to remove temp file" << llendl; @@ -881,7 +882,7 @@ void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt  		LLSD args;  		args["FILE"] = LLInventoryType::lookupHumanReadable(data->mInventoryType);  		args["REASON"] = std::string(LLAssetStorage::getErrorString(result)); -		LLNotifications::instance().add("CannotUploadReason", args); +		LLNotificationsUtil::add("CannotUploadReason", args);  	}  	LLUploadDialog::modalUploadFinished(); diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index adad06dc6f..9fc818e1ff 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -97,6 +97,7 @@  #include "llmutelist.h"  #include "llnearbychat.h"  #include "llnotifications.h" +#include "llnotificationsutil.h"  #include "llnotify.h"  #include "llpanelgrouplandmoney.h"  #include "llpanelplaces.h" @@ -210,7 +211,7 @@ const BOOL SCRIPT_QUESTION_IS_CAUTION[SCRIPT_PERMISSION_EOF] =  bool friendship_offer_callback(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	LLMessageSystem* msg = gMessageSystem;  	const LLSD& payload = notification["payload"]; @@ -635,7 +636,7 @@ void send_sound_trigger(const LLUUID& sound_id, F32 gain)  bool join_group_response(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	BOOL delete_context_data = TRUE;  	bool accept_invite = false; @@ -650,7 +651,7 @@ bool join_group_response(const LLSD& notification, const LLSD& response)  		LLGroupActions::show(group_id);  		LLSD args;  		args["MESSAGE"] = message; -		LLNotifications::instance().add("JoinGroup", args, notification["payload"]); +		LLNotificationsUtil::add("JoinGroup", args, notification["payload"]);  		return false;  	}  	if(option == 0 && !group_id.isNull()) @@ -669,7 +670,7 @@ bool join_group_response(const LLSD& notification, const LLSD& response)  			LLSD args;  			args["NAME"] = name;  			args["INVITE"] = message; -			LLNotifications::instance().add("JoinedTooManyGroupsMember", args, notification["payload"]); +			LLNotificationsUtil::add("JoinedTooManyGroupsMember", args, notification["payload"]);  		}  	} @@ -686,7 +687,7 @@ bool join_group_response(const LLSD& notification, const LLSD& response)  			// asking about a fee.  			LLSD next_payload = notification["payload"];  			next_payload["fee"] = 0; -			LLNotifications::instance().add("JoinGroupCanAfford", +			LLNotificationsUtil::add("JoinGroupCanAfford",  									args,  									next_payload);  		} @@ -912,7 +913,7 @@ void open_inventory_offer(const std::vector<LLUUID>& items, const std::string& f  					LLSD args;  					args["LANDMARK_NAME"] = item->getName();  					args["FOLDER_NAME"] = std::string(parent_folder ? parent_folder->getName() : "unknown"); -					LLNotifications::instance().add("LandmarkCreated", args); +					LLNotificationsUtil::add("LandmarkCreated", args);  					// Created landmark is passed to Places panel to allow its editing.  					LLPanelPlaces *panel = dynamic_cast<LLPanelPlaces*>(LLSideTray::getInstance()->showPanel("panel_places", LLSD())); @@ -1108,7 +1109,7 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&  {  	LLChat chat;  	std::string log_message; -	S32 button = LLNotification::getSelectedOption(notification, response); +	S32 button = LLNotificationsUtil::getSelectedOption(notification, response);  	LLInventoryObserver* opener = NULL;  	LLViewerInventoryCategory* catp = NULL; @@ -1556,7 +1557,7 @@ bool lure_callback(const LLSD& notification, const LLSD& response)  	}  	else  	{ -		option = LLNotification::getSelectedOption(notification, response); +		option = LLNotificationsUtil::getSelectedOption(notification, response);  	}  	LLUUID from_id = notification["payload"]["from_id"].asUUID(); @@ -1587,7 +1588,7 @@ static LLNotificationFunctorRegistration lure_callback_reg("TeleportOffered", lu  bool goto_url_callback(const LLSD& notification, const LLSD& response)  {  	std::string url = notification["payload"]["url"].asString(); -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if(1 == option)  	{  		LLWeb::loadURL(url); @@ -1598,7 +1599,7 @@ static LLNotificationFunctorRegistration goto_url_callback_reg("GotoURL", goto_u  bool inspect_remote_object_callback(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (0 == option)  	{  		LLFloaterReg::showInstance("inspect_remote_object", notification["payload"]); @@ -1686,7 +1687,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  		// Note: don't put the message in the IM history, even though was sent  		// via the IM mechanism. -		LLNotifications::instance().add("SystemMessageTip",args); +		LLNotificationsUtil::add("SystemMessageTip",args);  		break;  	case IM_NOTHING_SPECIAL:  @@ -1758,7 +1759,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  			// Message to everyone from GOD  			args["NAME"] = name;  			args["MESSAGE"] = message; -			LLNotifications::instance().add("GodMessage", args); +			LLNotificationsUtil::add("GodMessage", args);  			// Treat like a system message and put in chat history.  			// Claim to be from a local agent so it doesn't go into @@ -1837,7 +1838,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  			// This is a block, modeless dialog.  			//*TODO: Translate  			args["MESSAGE"] = message; -			LLNotifications::instance().add("SystemMessage", args); +			LLNotificationsUtil::add("SystemMessage", args);  		}  		break;  	case IM_GROUP_NOTICE: @@ -1970,7 +1971,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  				LLSD args;  				args["MESSAGE"] = message; -				LLNotifications::instance().add("JoinGroup", args, payload, join_group_response); +				LLNotificationsUtil::add("JoinGroup", args, payload, join_group_response);  			}  		}  		break; @@ -2047,13 +2048,13 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  	case IM_INVENTORY_ACCEPTED:  	{  		args["NAME"] = name; -		LLNotifications::instance().add("InventoryAccepted", args); +		LLNotificationsUtil::add("InventoryAccepted", args);  		break;  	}  	case IM_INVENTORY_DECLINED:  	{  		args["NAME"] = name; -		LLNotifications::instance().add("InventoryDeclined", args); +		LLNotificationsUtil::add("InventoryDeclined", args);  		break;  	}  	// TODO: _DEPRECATED suffix as part of vote removal - DEV-24856 @@ -2135,7 +2136,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  			{  				payload["groupowned"] = "true";  			} -			LLNotifications::instance().add("ServerObjectMessage", substitutions, payload); +			LLNotificationsUtil::add("ServerObjectMessage", substitutions, payload);  		}  		break;  	case IM_FROM_TASK_AS_ALERT: @@ -2147,7 +2148,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  			// Construct a viewer alert for this message.  			args["NAME"] = name;  			args["MESSAGE"] = message; -			LLNotifications::instance().add("ObjectMessage", args); +			LLNotificationsUtil::add("ObjectMessage", args);  		}  		break;  	case IM_BUSY_AUTO_RESPONSE: @@ -2184,7 +2185,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  				payload["from_id"] = from_id;  				payload["lure_id"] = session_id;  				payload["godlike"] = FALSE; -				LLNotifications::instance().add("TeleportOffered", args, payload); +				LLNotificationsUtil::add("TeleportOffered", args, payload);  			}  		}  		break; @@ -2221,7 +2222,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  			args["URL"] = url;  			LLSD payload;  			payload["url"] = url; -			LLNotifications::instance().add("GotoURL", args, payload ); +			LLNotificationsUtil::add("GotoURL", args, payload );  		}  		break; @@ -2248,12 +2249,12 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  				if(message.empty())  				{  					//support for frienship offers from clients before July 2008 -				        LLNotifications::instance().add("OfferFriendshipNoMessage", args, payload); +				        LLNotificationsUtil::add("OfferFriendshipNoMessage", args, payload);  				}  				else  				{  					args["[MESSAGE]"] = message; -				        LLNotifications::instance().add("OfferFriendship", args, payload); +				        LLNotificationsUtil::add("OfferFriendship", args, payload);  				}  			}  		} @@ -2273,7 +2274,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  			args["NAME"] = name;  			LLSD payload;  			payload["from_id"] = from_id; -			LLNotifications::instance().add("FriendshipAccepted", args, payload); +			LLNotificationsUtil::add("FriendshipAccepted", args, payload);  		}  		break; @@ -2314,7 +2315,7 @@ void busy_message (LLMessageSystem* msg, LLUUID from_id)  bool callingcard_offer_callback(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	LLUUID fid;  	LLUUID from_id;  	LLMessageSystem* msg = gMessageSystem; @@ -2393,7 +2394,7 @@ void process_offer_callingcard(LLMessageSystem* msg, void**)  		}  		else  		{ -			LLNotifications::instance().add("OfferCallingCard", args, payload); +			LLNotificationsUtil::add("OfferCallingCard", args, payload);  		}  	}  	else @@ -2404,12 +2405,12 @@ void process_offer_callingcard(LLMessageSystem* msg, void**)  void process_accept_callingcard(LLMessageSystem* msg, void**)  { -	LLNotifications::instance().add("CallingCardAccepted"); +	LLNotificationsUtil::add("CallingCardAccepted");  }  void process_decline_callingcard(LLMessageSystem* msg, void**)  { -	LLNotifications::instance().add("CallingCardDeclined"); +	LLNotificationsUtil::add("CallingCardDeclined");  } @@ -2744,13 +2745,13 @@ public:  		{	// Show notification that they can now teleport to landmarks.  Use a random landmark from the inventory  			S32 random_land = ll_rand( land_items.count() - 1 );  			args["NAME"] = land_items[random_land]->getName(); -			LLNotifications::instance().add("TeleportToLandmark",args); +			LLNotificationsUtil::add("TeleportToLandmark",args);  		}  		if ( card_items.count() > 0 )  		{	// Show notification that they can now contact people.  Use a random calling card from the inventory  			S32 random_card = ll_rand( card_items.count() - 1 );  			args["NAME"] = card_items[random_card]->getName(); -			LLNotifications::instance().add("TeleportToPerson",args); +			LLNotificationsUtil::add("TeleportToPerson",args);  		}  		gInventory.removeObserver(this); @@ -3127,7 +3128,7 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**)  		LLSD args;  		args["URL"] = url; -		LLNotifications::instance().add("ServerVersionChanged", args); +		LLNotificationsUtil::add("ServerVersionChanged", args);  	}  	gLastVersionChannel = version_channel; @@ -4346,7 +4347,7 @@ void process_money_balance_reply( LLMessageSystem* msg, void** )  		// *TODO: Translate  		LLSD args;  		args["MESSAGE"] = desc; -		LLNotifications::instance().add("SystemMessage", args); +		LLNotificationsUtil::add("SystemMessage", args);  		// Once the 'recent' container gets large enough, chop some  		// off the beginning. @@ -4364,7 +4365,7 @@ void process_money_balance_reply( LLMessageSystem* msg, void** )  bool handle_special_notification_callback(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (0 == option)  	{ @@ -4385,18 +4386,18 @@ bool handle_special_notification(std::string notificationID, LLSD& llsdBlock)  	llsdBlock["REGIONMATURITY"] = LLViewerRegion::accessToString(regionAccess);  	// we're going to throw the LLSD in there in case anyone ever wants to use it -	LLNotifications::instance().add(notificationID+"_Notify", llsdBlock); +	LLNotificationsUtil::add(notificationID+"_Notify", llsdBlock);  	if (regionAccess == SIM_ACCESS_MATURE)  	{  		if (gAgent.isTeen())  		{ -			LLNotifications::instance().add(notificationID+"_KB", llsdBlock); +			LLNotificationsUtil::add(notificationID+"_KB", llsdBlock);  			return true;  		}  		else if (gAgent.prefersPG())  		{ -			LLNotifications::instance().add(notificationID+"_Change", llsdBlock, llsdBlock, handle_special_notification_callback); +			LLNotificationsUtil::add(notificationID+"_Change", llsdBlock, llsdBlock, handle_special_notification_callback);  			return true;  		}  	} @@ -4404,12 +4405,12 @@ bool handle_special_notification(std::string notificationID, LLSD& llsdBlock)  	{  		if (!gAgent.isAdult())  		{ -			LLNotifications::instance().add(notificationID+"_KB", llsdBlock); +			LLNotificationsUtil::add(notificationID+"_KB", llsdBlock);  			return true;  		}  		else if (gAgent.prefersPG() || gAgent.prefersMature())  		{ -			LLNotifications::instance().add(notificationID+"_Change", llsdBlock, llsdBlock, handle_special_notification_callback); +			LLNotificationsUtil::add(notificationID+"_Change", llsdBlock, llsdBlock, handle_special_notification_callback);  			return true;  		}  	} @@ -4469,7 +4470,7 @@ bool attempt_standard_notification(LLMessageSystem* msgsystem)  			}  		} -		LLNotifications::instance().add(notificationID, llsdBlock); +		LLNotificationsUtil::add(notificationID, llsdBlock);  		return true;  	}	  	return false; @@ -4535,14 +4536,14 @@ void process_alert_core(const std::string& message, BOOL modal)  		// Allow the server to spawn a named alert so that server alerts can be  		// translated out of English.  		std::string alert_name(message.substr(ALERT_PREFIX.length())); -		LLNotifications::instance().add(alert_name); +		LLNotificationsUtil::add(alert_name);  	}  	else if (message.find(NOTIFY_PREFIX) == 0)  	{  		// Allow the server to spawn a named notification so that server notifications can be  		// translated out of English.  		std::string notify_name(message.substr(NOTIFY_PREFIX.length())); -		LLNotifications::instance().add(notify_name); +		LLNotificationsUtil::add(notify_name);  	}  	else if (message[0] == '/')  	{ @@ -4554,20 +4555,20 @@ void process_alert_core(const std::string& message, BOOL modal)  			S32 mins = 0;  			LLStringUtil::convertToS32(text.substr(18), mins);  			args["MINUTES"] = llformat("%d",mins); -			LLNotifications::instance().add("RegionRestartMinutes", args); +			LLNotificationsUtil::add("RegionRestartMinutes", args);  		}  		else if (text.substr(0,17) == "RESTART_X_SECONDS")  		{  			S32 secs = 0;  			LLStringUtil::convertToS32(text.substr(18), secs);  			args["SECONDS"] = llformat("%d",secs); -			LLNotifications::instance().add("RegionRestartSeconds", args); +			LLNotificationsUtil::add("RegionRestartSeconds", args);  		}  		else  		{  			std::string new_msg =LLNotifications::instance().getGlobalString(text);  			args["MESSAGE"] = new_msg; -			LLNotifications::instance().add("SystemMessage", args); +			LLNotificationsUtil::add("SystemMessage", args);  		}  	}  	else if (modal) @@ -4575,14 +4576,14 @@ void process_alert_core(const std::string& message, BOOL modal)  		LLSD args;  		std::string new_msg =LLNotifications::instance().getGlobalString(message);  		args["ERROR_MESSAGE"] = new_msg; -		LLNotifications::instance().add("ErrorMessage", args); +		LLNotificationsUtil::add("ErrorMessage", args);  	}  	else  	{  		LLSD args;  		std::string new_msg =LLNotifications::instance().getGlobalString(message);  		args["MESSAGE"] = new_msg; -		LLNotifications::instance().add("SystemMessageTip", args); +		LLNotificationsUtil::add("SystemMessageTip", args);  	}  } @@ -4798,7 +4799,7 @@ void notify_cautioned_script_question(const LLSD& notification, const LLSD& resp  bool script_question_cb(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	LLMessageSystem *msg = gMessageSystem;  	S32 orig = notification["payload"]["questions"].asInteger();  	S32 new_questions = orig; @@ -4862,10 +4863,10 @@ bool script_question_cb(const LLSD& notification, const LLSD& response)  	if (response["Details"])  	{  		// respawn notification... -		LLNotifications::instance().add(notification["name"], notification["substitutions"], notification["payload"]); +		LLNotificationsUtil::add(notification["name"], notification["substitutions"], notification["payload"]);  		// ...with description on top -		LLNotifications::instance().add("DebitPermissionDetails"); +		LLNotificationsUtil::add("DebitPermissionDetails");  	}  	return false;  } @@ -4962,12 +4963,12 @@ void process_script_question(LLMessageSystem *msg, void **user_data)  		if (gSavedSettings.getBOOL("PermissionsCautionEnabled"))  		{  			// display the caution permissions prompt -			LLNotifications::instance().add(caution ? "ScriptQuestionCaution" : "ScriptQuestion", args, payload); +			LLNotificationsUtil::add(caution ? "ScriptQuestionCaution" : "ScriptQuestion", args, payload);  		}  		else  		{  			// fall back to default behavior if cautions are entirely disabled -			LLNotifications::instance().add("ScriptQuestion", args, payload); +			LLNotificationsUtil::add("ScriptQuestion", args, payload);  		}  	} @@ -5167,7 +5168,7 @@ void process_teleport_failed(LLMessageSystem *msg, void**)  		}  	} -	LLNotifications::instance().add("CouldNotTeleportReason", args); +	LLNotificationsUtil::add("CouldNotTeleportReason", args);  	// Let the interested parties know that teleport failed.  	LLViewerParcelMgr::getInstance()->onTeleportFailed(); @@ -5300,7 +5301,7 @@ void send_group_notice(const LLUUID& group_id,  bool handle_lure_callback(const LLSD& notification, const LLSD& response)  {  	std::string text = response["message"].asString(); -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if(0 == option)  	{ @@ -5347,11 +5348,11 @@ void handle_lure(const std::vector<LLUUID>& ids)  	}  	if (gAgent.isGodlike())  	{ -		LLNotifications::instance().add("OfferTeleportFromGod", edit_args, payload, handle_lure_callback); +		LLNotificationsUtil::add("OfferTeleportFromGod", edit_args, payload, handle_lure_callback);  	}  	else  	{ -		LLNotifications::instance().add("OfferTeleport", edit_args, payload, handle_lure_callback); +		LLNotificationsUtil::add("OfferTeleport", edit_args, payload, handle_lure_callback);  	}  } @@ -5555,7 +5556,7 @@ std::vector<LLSD> gLoadUrlList;  bool callback_load_url(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (0 == option)  	{ @@ -5600,7 +5601,7 @@ void callback_load_url_name(const LLUUID& id, const std::string& first, const st  			args["OBJECTNAME"] = load_url_info["object_name"].asString();  			args["NAME"] = owner_name; -			LLNotifications::instance().add("LoadWebPage", args, load_url_info); +			LLNotificationsUtil::add("LoadWebPage", args, load_url_info);  		}  		else  		{ @@ -5655,7 +5656,7 @@ void callback_download_complete(void** data, S32 result, LLExtStat ext_status)  	std::string* filepath = (std::string*)data;  	LLSD args;  	args["DOWNLOAD_PATH"] = *filepath; -	LLNotifications::instance().add("FinishedRawDownload", args); +	LLNotificationsUtil::add("FinishedRawDownload", args);  	delete filepath;  } diff --git a/indra/newview/llviewerparcelmedia.cpp b/indra/newview/llviewerparcelmedia.cpp index f61dbb1b39..90a7ee98b9 100644 --- a/indra/newview/llviewerparcelmedia.cpp +++ b/indra/newview/llviewerparcelmedia.cpp @@ -43,7 +43,7 @@  #include "message.h"  #include "llviewermediafocus.h"  #include "llviewerparcelmediaautoplay.h" -#include "llnotifications.h" +#include "llnotificationsutil.h"  #include "llfirstuse.h"  #include "llpluginclassmedia.h"  #include "llviewertexture.h" @@ -111,7 +111,7 @@ void LLViewerParcelMedia::update(LLParcel* parcel)  			// First use warning  			if(	! mediaUrl.empty() && gWarningSettings.getBOOL("FirstStreamingVideo") )  			{ -				LLNotifications::instance().add("ParcelCanPlayMedia", LLSD(), LLSD(), +				LLNotificationsUtil::add("ParcelCanPlayMedia", LLSD(), LLSD(),  					boost::bind(callback_play_media, _1, _2, parcel));  				return; @@ -167,7 +167,7 @@ void LLViewerParcelMedia::update(LLParcel* parcel)  				{  					gWarningSettings.setBOOL("QuickTimeInstalled", FALSE); -					LLNotifications::instance().add("NoQuickTime" ); +					LLNotificationsUtil::add("NoQuickTime" );  				};  			}  		} @@ -590,7 +590,7 @@ void LLViewerParcelMedia::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent  bool callback_play_media(const LLSD& notification, const LLSD& response, LLParcel* parcel)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (option == 0)  	{  		gSavedSettings.setBOOL("AudioStreamingVideo", TRUE); diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index fcaf49c884..2fae78cdfb 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -39,6 +39,8 @@  #include "indra_constants.h"  #include "llcachename.h"  #include "llgl.h" +#include "llnotifications.h" +#include "llnotificationsutil.h"  #include "llparcel.h"  #include "llsecondlifeurls.h"  #include "message.h" @@ -520,7 +522,7 @@ LLParcelSelectionHandle LLViewerParcelMgr::selectLand(const LLVector3d &corner1,  	if (region != region_other)  	{ -		LLNotifications::instance().add("CantSelectLandFromMultipleRegions"); +		LLNotificationsUtil::add("CantSelectLandFromMultipleRegions");  		mSelected = FALSE;  		notifyObservers();  		return NULL; @@ -943,7 +945,7 @@ void LLViewerParcelMgr::sendParcelGodForceOwner(const LLUUID& owner_id)  {  	if (!mSelected)  	{ -		LLNotifications::instance().add("CannotSetLandOwnerNothingSelected"); +		LLNotificationsUtil::add("CannotSetLandOwnerNothingSelected");  		return;  	} @@ -958,7 +960,7 @@ void LLViewerParcelMgr::sendParcelGodForceOwner(const LLUUID& owner_id)  	if (!region)  	{  		// TODO: Add a force owner version of this alert. -		LLNotifications::instance().add("CannotContentifyNoRegion"); +		LLNotificationsUtil::add("CannotContentifyNoRegion");  		return;  	} @@ -966,7 +968,7 @@ void LLViewerParcelMgr::sendParcelGodForceOwner(const LLUUID& owner_id)  	LLViewerRegion *region2 = LLWorld::getInstance()->getRegionFromPosGlobal( east_north_region_check );  	if (region != region2)  	{ -		LLNotifications::instance().add("CannotSetLandOwnerMultipleRegions"); +		LLNotificationsUtil::add("CannotSetLandOwnerMultipleRegions");  		return;  	} @@ -991,7 +993,7 @@ void LLViewerParcelMgr::sendParcelGodForceOwner(const LLUUID& owner_id)  bool callback_god_force_owner(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if(0 == option)  	{  		LLMessageSystem* msg = gMessageSystem; @@ -1011,13 +1013,13 @@ void LLViewerParcelMgr::sendParcelGodForceToContent()  {  	if (!mSelected)  	{ -		LLNotifications::instance().add("CannotContentifyNothingSelected"); +		LLNotificationsUtil::add("CannotContentifyNothingSelected");  		return;  	}  	LLViewerRegion* region = LLWorld::getInstance()->getRegionFromPosGlobal( mWestSouth );  	if (!region)  	{ -		LLNotifications::instance().add("CannotContentifyNoRegion"); +		LLNotificationsUtil::add("CannotContentifyNoRegion");  		return;  	} @@ -1035,14 +1037,14 @@ void LLViewerParcelMgr::sendParcelRelease()  {  	if (!mSelected)  	{ -        LLNotifications::instance().add("CannotReleaseLandNothingSelected"); +        LLNotificationsUtil::add("CannotReleaseLandNothingSelected");  		return;  	}  	LLViewerRegion *region = LLWorld::getInstance()->getRegionFromPosGlobal( mWestSouth );  	if (!region)  	{ -		LLNotifications::instance().add("CannotReleaseLandNoRegion"); +		LLNotificationsUtil::add("CannotReleaseLandNoRegion");  		return;  	} @@ -1097,14 +1099,14 @@ LLViewerParcelMgr::ParcelBuyInfo* LLViewerParcelMgr::setupParcelBuy(  {  	if (!mSelected || !mCurrentParcel)  	{ -		LLNotifications::instance().add("CannotBuyLandNothingSelected"); +		LLNotificationsUtil::add("CannotBuyLandNothingSelected");  		return NULL;  	}  	LLViewerRegion *region = LLWorld::getInstance()->getRegionFromPosGlobal( mWestSouth );  	if (!region)  	{ -		LLNotifications::instance().add("CannotBuyLandNoRegion"); +		LLNotificationsUtil::add("CannotBuyLandNoRegion");  		return NULL;  	} @@ -1122,7 +1124,7 @@ LLViewerParcelMgr::ParcelBuyInfo* LLViewerParcelMgr::setupParcelBuy(  		if (region != region2)  		{ -			LLNotifications::instance().add("CantBuyLandAcrossMultipleRegions"); +			LLNotificationsUtil::add("CantBuyLandAcrossMultipleRegions");  			return NULL;  		}  	} @@ -1204,18 +1206,18 @@ void LLViewerParcelMgr::sendParcelDeed(const LLUUID& group_id)  {  	if (!mSelected || !mCurrentParcel)  	{ -		LLNotifications::instance().add("CannotDeedLandNothingSelected"); +		LLNotificationsUtil::add("CannotDeedLandNothingSelected");  		return;  	}  	if(group_id.isNull())  	{ -		LLNotifications::instance().add("CannotDeedLandNoGroup"); +		LLNotificationsUtil::add("CannotDeedLandNoGroup");  		return;  	}  	LLViewerRegion *region = LLWorld::getInstance()->getRegionFromPosGlobal( mWestSouth );  	if (!region)  	{ -		LLNotifications::instance().add("CannotDeedLandNoRegion"); +		LLNotificationsUtil::add("CannotDeedLandNoRegion");  		return;  	} @@ -2037,18 +2039,18 @@ void LLViewerParcelMgr::deedLandToGroup()  		gCacheName->getName(mCurrentParcel->getOwnerID(), first_name, last_name);  		args["FIRST_NAME"] = first_name;  		args["LAST_NAME"] = last_name; -		LLNotifications::instance().add("DeedLandToGroupWithContribution",args, LLSD(), deedAlertCB); +		LLNotificationsUtil::add("DeedLandToGroupWithContribution",args, LLSD(), deedAlertCB);  	}  	else  	{ -		LLNotifications::instance().add("DeedLandToGroup",args, LLSD(), deedAlertCB); +		LLNotificationsUtil::add("DeedLandToGroup",args, LLSD(), deedAlertCB);  	}  }  // static  bool LLViewerParcelMgr::deedAlertCB(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (option == 0)  	{  		LLParcel* parcel = LLViewerParcelMgr::getInstance()->getParcelSelection()->getParcel(); @@ -2067,26 +2069,26 @@ void LLViewerParcelMgr::startReleaseLand()  {  	if (!mSelected)  	{ -		LLNotifications::instance().add("CannotReleaseLandNothingSelected"); +		LLNotificationsUtil::add("CannotReleaseLandNothingSelected");  		return;  	}  	if (mRequestResult == PARCEL_RESULT_NO_DATA)  	{ -		LLNotifications::instance().add("CannotReleaseLandWatingForServer"); +		LLNotificationsUtil::add("CannotReleaseLandWatingForServer");  		return;  	}  	if (mRequestResult == PARCEL_RESULT_MULTIPLE)  	{ -		LLNotifications::instance().add("CannotReleaseLandSelected"); +		LLNotificationsUtil::add("CannotReleaseLandSelected");  		return;  	}  	if (!isParcelOwnedByAgent(mCurrentParcel, GP_LAND_RELEASE)  		&& !(gAgent.canManageEstate()))  	{ -		LLNotifications::instance().add("CannotReleaseLandDontOwn"); +		LLNotificationsUtil::add("CannotReleaseLandDontOwn");  		return;  	} @@ -2094,7 +2096,7 @@ void LLViewerParcelMgr::startReleaseLand()  	LLViewerRegion* region = LLWorld::getInstance()->getRegionFromPosGlobal(parcel_center);  	if (!region)  	{ -		LLNotifications::instance().add("CannotReleaseLandRegionNotFound"); +		LLNotificationsUtil::add("CannotReleaseLandRegionNotFound");  		return;  	}  /* @@ -2103,21 +2105,21 @@ void LLViewerParcelMgr::startReleaseLand()  	{  		LLSD args;  		args["REGION"] = region->getName(); -		LLNotifications::instance().add("CannotReleaseLandNoTransfer", args); +		LLNotificationsUtil::add("CannotReleaseLandNoTransfer", args);  		return;  	}  */  	if (!mCurrentParcelSelection->mWholeParcelSelected)  	{ -		LLNotifications::instance().add("CannotReleaseLandPartialSelection"); +		LLNotificationsUtil::add("CannotReleaseLandPartialSelection");  		return;  	}  	// Compute claim price  	LLSD args;  	args["AREA"] = llformat("%d",mCurrentParcel->getArea()); -	LLNotifications::instance().add("ReleaseLandWarning", args, LLSD(), releaseAlertCB); +	LLNotificationsUtil::add("ReleaseLandWarning", args, LLSD(), releaseAlertCB);  }  bool LLViewerParcelMgr::canAgentBuyParcel(LLParcel* parcel, bool forGroup) const @@ -2192,13 +2194,13 @@ void LLViewerParcelMgr::startDivideLand()  {  	if (!mSelected)  	{ -		LLNotifications::instance().add("CannotDivideLandNothingSelected"); +		LLNotificationsUtil::add("CannotDivideLandNothingSelected");  		return;  	}  	if (mCurrentParcelSelection->mWholeParcelSelected)  	{ -		LLNotifications::instance().add("CannotDivideLandPartialSelection"); +		LLNotificationsUtil::add("CannotDivideLandPartialSelection");  		return;  	} @@ -2206,13 +2208,13 @@ void LLViewerParcelMgr::startDivideLand()  	payload["west_south_border"] = ll_sd_from_vector3d(mWestSouth);  	payload["east_north_border"] = ll_sd_from_vector3d(mEastNorth); -	LLNotifications::instance().add("LandDivideWarning", LLSD(), payload, callbackDivideLand); +	LLNotificationsUtil::add("LandDivideWarning", LLSD(), payload, callbackDivideLand);  }  // static  bool LLViewerParcelMgr::callbackDivideLand(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	LLVector3d west_south_d = ll_vector3d_from_sd(notification["payload"]["west_south_border"]);  	LLVector3d east_north_d = ll_vector3d_from_sd(notification["payload"]["east_north_border"]);  	LLVector3d parcel_center = (west_south_d + east_north_d) / 2.0; @@ -2220,7 +2222,7 @@ bool LLViewerParcelMgr::callbackDivideLand(const LLSD& notification, const LLSD&  	LLViewerRegion* region = LLWorld::getInstance()->getRegionFromPosGlobal(parcel_center);  	if (!region)  	{ -		LLNotifications::instance().add("CannotDivideLandNoRegion"); +		LLNotificationsUtil::add("CannotDivideLandNoRegion");  		return false;  	} @@ -2249,19 +2251,19 @@ void LLViewerParcelMgr::startJoinLand()  {  	if (!mSelected)  	{ -		LLNotifications::instance().add("CannotJoinLandNothingSelected"); +		LLNotificationsUtil::add("CannotJoinLandNothingSelected");  		return;  	}  	if (mCurrentParcelSelection->mWholeParcelSelected)  	{ -		LLNotifications::instance().add("CannotJoinLandEntireParcelSelected"); +		LLNotificationsUtil::add("CannotJoinLandEntireParcelSelected");  		return;  	}  	if (!mCurrentParcelSelection->mSelectedMultipleOwners)  	{ -		LLNotifications::instance().add("CannotJoinLandSelection"); +		LLNotificationsUtil::add("CannotJoinLandSelection");  		return;  	} @@ -2269,13 +2271,13 @@ void LLViewerParcelMgr::startJoinLand()  	payload["west_south_border"] = ll_sd_from_vector3d(mWestSouth);  	payload["east_north_border"] = ll_sd_from_vector3d(mEastNorth); -	LLNotifications::instance().add("JoinLandWarning", LLSD(), payload, callbackJoinLand); +	LLNotificationsUtil::add("JoinLandWarning", LLSD(), payload, callbackJoinLand);  }  // static  bool LLViewerParcelMgr::callbackJoinLand(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	LLVector3d west_south_d = ll_vector3d_from_sd(notification["payload"]["west_south_border"]);  	LLVector3d east_north_d = ll_vector3d_from_sd(notification["payload"]["east_north_border"]);  	LLVector3d parcel_center = (west_south_d + east_north_d) / 2.0; @@ -2283,7 +2285,7 @@ bool LLViewerParcelMgr::callbackJoinLand(const LLSD& notification, const LLSD& r  	LLViewerRegion* region = LLWorld::getInstance()->getRegionFromPosGlobal(parcel_center);  	if (!region)  	{ -		LLNotifications::instance().add("CannotJoinLandNoRegion"); +		LLNotificationsUtil::add("CannotJoinLandNoRegion");  		return false;  	} @@ -2312,19 +2314,19 @@ void LLViewerParcelMgr::startDeedLandToGroup()  {  	if (!mSelected || !mCurrentParcel)  	{ -		LLNotifications::instance().add("CannotDeedLandNothingSelected"); +		LLNotificationsUtil::add("CannotDeedLandNothingSelected");  		return;  	}  	if (mRequestResult == PARCEL_RESULT_NO_DATA)  	{ -		LLNotifications::instance().add("CannotDeedLandWaitingForServer"); +		LLNotificationsUtil::add("CannotDeedLandWaitingForServer");  		return;  	}  	if (mRequestResult == PARCEL_RESULT_MULTIPLE)  	{ -		LLNotifications::instance().add("CannotDeedLandMultipleSelected"); +		LLNotificationsUtil::add("CannotDeedLandMultipleSelected");  		return;  	} @@ -2332,7 +2334,7 @@ void LLViewerParcelMgr::startDeedLandToGroup()  	LLViewerRegion* region = LLWorld::getInstance()->getRegionFromPosGlobal(parcel_center);  	if (!region)  	{ -		LLNotifications::instance().add("CannotDeedLandNoRegion"); +		LLNotificationsUtil::add("CannotDeedLandNoRegion");  		return;  	} @@ -2344,7 +2346,7 @@ void LLViewerParcelMgr::startDeedLandToGroup()  		{  			LLSD args;  			args["REGION"] = region->getName(); -			LLNotifications::instance().add("CannotDeedLandNoTransfer", args); +			LLNotificationsUtil::add("CannotDeedLandNoTransfer", args);  			return;  		}  	} @@ -2374,7 +2376,7 @@ void LLViewerParcelMgr::reclaimParcel()  // static  bool LLViewerParcelMgr::releaseAlertCB(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (option == 0)  	{  		// Send the release message, not a force diff --git a/indra/newview/llviewerprecompiledheaders.h b/indra/newview/llviewerprecompiledheaders.h index bb317aeb5f..86f59b6e2f 100644 --- a/indra/newview/llviewerprecompiledheaders.h +++ b/indra/newview/llviewerprecompiledheaders.h @@ -233,4 +233,7 @@  // In skinning-7, llui.h dependencies are changing too often.  //#include "llui.h" +// llxuixml +#include "llinitparam.h" +  #endif diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp index 6f8818be6e..e0091145ce 100644 --- a/indra/newview/llviewertexteditor.cpp +++ b/indra/newview/llviewertexteditor.cpp @@ -50,6 +50,7 @@  #include "llmemorystream.h"  #include "llmenugl.h"  #include "llnotecard.h" +#include "llnotificationsutil.h"  #include "llnotify.h"  #include "llpanelplaces.h"  #include "llpreview.h" @@ -1181,13 +1182,13 @@ void LLViewerTextEditor::showUnsavedAlertDialog( LLInventoryItem* item )  	LLSD payload;  	payload["item_id"] = item->getUUID();  	payload["notecard_id"] = mNotecardInventoryID; -	LLNotifications::instance().add( "ConfirmNotecardSave", LLSD(), payload, LLViewerTextEditor::onNotecardDialog); +	LLNotificationsUtil::add( "ConfirmNotecardSave", LLSD(), payload, LLViewerTextEditor::onNotecardDialog);  }  // static  bool LLViewerTextEditor::onNotecardDialog(const LLSD& notification, const LLSD& response )  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if( option == 0 )  	{  		LLPreviewNotecard* preview = LLFloaterReg::findTypedInstance<LLPreviewNotecard>("preview_notecard", notification["payload"]["notecard_id"]);; @@ -1207,13 +1208,13 @@ void LLViewerTextEditor::showCopyToInvDialog( LLInventoryItem* item, llwchar wc  	LLUUID item_id = item->getUUID();  	payload["item_id"] = item_id;  	payload["item_wc"] = LLSD::Integer(wc); -	LLNotifications::instance().add( "ConfirmItemCopy", LLSD(), payload, +	LLNotificationsUtil::add( "ConfirmItemCopy", LLSD(), payload,  		boost::bind(&LLViewerTextEditor::onCopyToInvDialog, this, _1, _2));  }  bool LLViewerTextEditor::onCopyToInvDialog(const LLSD& notification, const LLSD& response)  { -	S32 option = LLNotification::getSelectedOption(notification, response); +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if( 0 == option )  	{  		LLUUID item_id = notification["payload"]["item_id"].asUUID(); diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index e30c8ab346..f12937194d 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -194,6 +194,8 @@  #include "llagentui.h"  #include "llwearablelist.h" +#include "llnotifications.h" +#include "llnotificationsutil.h"  #include "llnotificationmanager.h"  #include "llfloaternotificationsconsole.h" @@ -4680,7 +4682,7 @@ BOOL LLViewerWindow::changeDisplaySettings(BOOL fullscreen, LLCoordScreen size,  		LLSD args;  		args["RESX"] = llformat("%d",size.mX);  		args["RESY"] = llformat("%d",size.mY); -		LLNotifications::instance().add("ResolutionSwitchFail", args); +		LLNotificationsUtil::add("ResolutionSwitchFail", args);  		size = old_size; // for reshape below  	} diff --git a/indra/newview/llvograss.cpp b/indra/newview/llvograss.cpp index f33a5cc818..e311f07912 100644 --- a/indra/newview/llvograss.cpp +++ b/indra/newview/llvograss.cpp @@ -38,7 +38,7 @@  #include "llviewercontrol.h"  #include "llagent.h" -#include "llnotifications.h" +#include "llnotificationsutil.h"  #include "lldrawable.h"  #include "llface.h"  #include "llsky.h" @@ -211,7 +211,7 @@ void LLVOGrass::initClass()  	{  		LLSD args;  		args["SPECIES"] = err; -		LLNotifications::instance().add("ErrorUndefinedGrasses", args); +		LLNotificationsUtil::add("ErrorUndefinedGrasses", args);  	}  	for (S32 i = 0; i < GRASS_MAX_BLADES; ++i) diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp index 8f63df8c29..3554528d19 100644 --- a/indra/newview/llvoicechannel.cpp +++ b/indra/newview/llvoicechannel.cpp @@ -37,6 +37,7 @@  #include "llfloaterreg.h"  #include "llimview.h"  #include "llnotifications.h" +#include "llnotificationsutil.h"  #include "llpanel.h"  #include "llrecentpeople.h"  #include "llviewercontrol.h" @@ -81,13 +82,13 @@ void LLVoiceCallCapResponder::error(U32 status, const std::string& reason)  		if ( 403 == status )  		{  			//403 == no ability -			LLNotifications::instance().add( +			LLNotificationsUtil::add(  				"VoiceNotAllowed",  				channelp->getNotifyArgs());  		}  		else  		{ -			LLNotifications::instance().add( +			LLNotificationsUtil::add(  				"VoiceCallGenericError",  				channelp->getNotifyArgs());  		} @@ -159,13 +160,13 @@ void LLVoiceChannel::setChannelInfo(  	{  		if (mURI.empty())  		{ -			LLNotifications::instance().add("VoiceChannelJoinFailed", mNotifyArgs); +			LLNotificationsUtil::add("VoiceChannelJoinFailed", mNotifyArgs);  			llwarns << "Received empty URI for channel " << mSessionName << llendl;  			deactivate();  		}  		else if (mCredentials.empty())  		{ -			LLNotifications::instance().add("VoiceChannelJoinFailed", mNotifyArgs); +			LLNotificationsUtil::add("VoiceChannelJoinFailed", mNotifyArgs);  			llwarns << "Received empty credentials for channel " << mSessionName << llendl;  			deactivate();  		} @@ -209,7 +210,7 @@ void LLVoiceChannel::handleStatusChange(EStatusType type)  	{  	case STATUS_LOGIN_RETRY:  		//mLoginNotificationHandle = LLNotifyBox::showXml("VoiceLoginRetry")->getHandle(); -		LLNotifications::instance().add("VoiceLoginRetry"); +		LLNotificationsUtil::add("VoiceLoginRetry");  		break;  	case STATUS_LOGGED_IN:  		//if (!mLoginNotificationHandle.isDead()) @@ -227,7 +228,7 @@ void LLVoiceChannel::handleStatusChange(EStatusType type)  		{  			// if forceably removed from channel  			// update the UI and revert to default channel -			LLNotifications::instance().add("VoiceChannelDisconnected", mNotifyArgs); +			LLNotificationsUtil::add("VoiceChannelDisconnected", mNotifyArgs);  			deactivate();  		}  		mIgnoreNextSessionLeave = FALSE; @@ -619,7 +620,7 @@ void LLVoiceChannelGroup::handleError(EStatusType status)  	// notification  	if (!notify.empty())  	{ -		LLNotificationPtr notification = LLNotifications::instance().add(notify, mNotifyArgs); +		LLNotificationPtr notification = LLNotificationsUtil::add(notify, mNotifyArgs);  		// echo to im window  		gIMMgr->addMessage(mSessionID, LLUUID::null, SYSTEM_FROM, notification->getMessage());  	} @@ -725,7 +726,7 @@ void LLVoiceChannelProximal::handleError(EStatusType status)  	// notification  	if (!notify.empty())  	{ -		LLNotifications::instance().add(notify, mNotifyArgs); +		LLNotificationsUtil::add(notify, mNotifyArgs);  	}  	LLVoiceChannel::handleError(status); @@ -765,12 +766,12 @@ void LLVoiceChannelP2P::handleStatusChange(EStatusType type)  			if (mState == STATE_RINGING)  			{  				// other user declined call -				LLNotifications::instance().add("P2PCallDeclined", mNotifyArgs); +				LLNotificationsUtil::add("P2PCallDeclined", mNotifyArgs);  			}  			else  			{  				// other user hung up -				LLNotifications::instance().add("VoiceChannelDisconnectedP2P", mNotifyArgs); +				LLNotificationsUtil::add("VoiceChannelDisconnectedP2P", mNotifyArgs);  			}  			deactivate();  		} @@ -788,7 +789,7 @@ void LLVoiceChannelP2P::handleError(EStatusType type)  	switch(type)  	{  	case ERROR_NOT_AVAILABLE: -		LLNotifications::instance().add("P2PCallNoAnswer", mNotifyArgs); +		LLNotificationsUtil::add("P2PCallNoAnswer", mNotifyArgs);  		break;  	default:  		break; diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp index 479cf5a04d..d677634be6 100644 --- a/indra/newview/llvoiceclient.cpp +++ b/indra/newview/llvoiceclient.cpp @@ -35,8 +35,11 @@  #include <boost/tokenizer.hpp> +// library includes +#include "llnotificationsutil.h"  #include "llsdutil.h" +// project includes  #include "llvoavatar.h"  #include "llbufferstream.h"  #include "llfile.h" @@ -7051,7 +7054,7 @@ class LLViewerRequiredVoiceVersion : public LLHTTPNode  				if (!sAlertedUser)  				{  					//sAlertedUser = TRUE; -					LLNotifications::instance().add("VoiceVersionMismatch"); +					LLNotificationsUtil::add("VoiceVersionMismatch");  					gSavedSettings.setBOOL("EnableVoiceChat", FALSE); // toggles listener  				}  			} diff --git a/indra/newview/llvotree.cpp b/indra/newview/llvotree.cpp index 235e10f716..24f1c4bd24 100644 --- a/indra/newview/llvotree.cpp +++ b/indra/newview/llvotree.cpp @@ -55,7 +55,7 @@  #include "noise.h"  #include "pipeline.h"  #include "llspatialpartition.h" -#include "llnotifications.h" +#include "llnotificationsutil.h"  extern LLPipeline gPipeline; @@ -257,7 +257,7 @@ void LLVOTree::initClass()  		{  			LLSD args;  			args["SPECIES"] = err; -			LLNotifications::instance().add("ErrorUndefinedTrees", args); +			LLNotificationsUtil::add("ErrorUndefinedTrees", args);  		}  }; diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp index d92da4ef44..807434c397 100644 --- a/indra/newview/llwearable.cpp +++ b/indra/newview/llwearable.cpp @@ -36,6 +36,7 @@  #include "llagentwearables.h"  #include "llfloatercustomize.h"  #include "lllocaltextureobject.h" +#include "llnotificationsutil.h"  #include "llviewertexturelist.h"  #include "llinventorymodel.h"  #include "llinventoryobserver.h" @@ -1122,7 +1123,7 @@ void LLWearable::saveNewAsset() const  		LLSD args;  		args["NAME"] = mName; -		LLNotifications::instance().add("CannotSaveWearableOutOfSpace", args); +		LLNotificationsUtil::add("CannotSaveWearableOutOfSpace", args);  		return;  	} @@ -1170,7 +1171,7 @@ void LLWearable::onSaveNewAssetComplete(const LLUUID& new_asset_id, void* userda  		llwarns << buffer << " Status: " << status << llendl;  		LLSD args;  		args["NAME"] = type_name; -		LLNotifications::instance().add("CannotSaveToAssetStore", args); +		LLNotificationsUtil::add("CannotSaveToAssetStore", args);  	}  	// Delete temp file diff --git a/indra/newview/llwearablelist.cpp b/indra/newview/llwearablelist.cpp index 9bde85dcaf..31047413ef 100644 --- a/indra/newview/llwearablelist.cpp +++ b/indra/newview/llwearablelist.cpp @@ -40,6 +40,7 @@  #include "llvoavatar.h"  #include "llviewerinventory.h"  #include "llviewerstats.h" +#include "llnotificationsutil.h"  #include "llnotify.h"  #include "llinventorymodel.h"  #include "lltrans.h" @@ -187,16 +188,16 @@ void LLWearableList::processGetAssetReply( const char* filename, const LLAssetID  		args["TYPE"] =LLTrans::getString(LLAssetType::lookupHumanReadable(data->mAssetType));  		if (isNewWearable)  		{ -			LLNotifications::instance().add("InvalidWearable"); +			LLNotificationsUtil::add("InvalidWearable");  		}  		else if (data->mName.empty())  		{ -			LLNotifications::instance().add("FailedToFindWearableUnnamed", args); +			LLNotificationsUtil::add("FailedToFindWearableUnnamed", args);  		}  		else  		{  			args["DESC"] = data->mName; -			LLNotifications::instance().add("FailedToFindWearable", args); +			LLNotificationsUtil::add("FailedToFindWearable", args);  		}  	}  	// Always call callback; wearable will be NULL if we failed diff --git a/indra/newview/llwldaycycle.cpp b/indra/newview/llwldaycycle.cpp index 7f0c1a13f3..fcc43c2b1f 100644 --- a/indra/newview/llwldaycycle.cpp +++ b/indra/newview/llwldaycycle.cpp @@ -35,7 +35,7 @@  #include "llwldaycycle.h"  #include "llsdserialize.h"  #include "llwlparammanager.h" -#include "llnotifications.h" +#include "llnotificationsutil.h"  #include "llxmlnode.h"  #include <map> @@ -85,7 +85,7 @@ void LLWLDayCycle::loadDayCycle(const std::string & fileName)  				// alert the user  				LLSD args;  				args["SKY"] = day_data[i][1].asString(); -				LLNotifications::instance().add("WLMissingSky", args); +				LLNotificationsUtil::add("WLMissingSky", args);  				continue;  			} diff --git a/indra/newview/skins/default/xui/da/floater_buy_currency.xml b/indra/newview/skins/default/xui/da/floater_buy_currency.xml index a2b6dec91c..d1fca8984d 100644 --- a/indra/newview/skins/default/xui/da/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/da/floater_buy_currency.xml @@ -29,7 +29,7 @@  		1234  	</line_editor>  	<text name="currency_est"> -		for ca. US$ [USD] +		for ca. [LOCALAMOUNT]  	</text>  	<text name="getting_data">  		Henter data... @@ -63,6 +63,6 @@ og prøv igen.  	<button label="Annullér" name="cancel_btn" />  	<button label="Køb" name="buy_btn" />  	<string name="buy_currency"> -		Køb L$ [LINDENS] for ca. US$ [USD] +		Køb L$ [LINDENS] for ca. [LOCALAMOUNT]  	</string>  </floater> diff --git a/indra/newview/skins/default/xui/de/floater_buy_currency.xml b/indra/newview/skins/default/xui/de/floater_buy_currency.xml index 05750a1782..56b7868c33 100644 --- a/indra/newview/skins/default/xui/de/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/de/floater_buy_currency.xml @@ -29,7 +29,7 @@  		1234  	</line_editor>  	<text name="currency_est"> -		für ca. [USD] US$ +		für ca. [LOCALAMOUNT]  	</text>  	<text name="getting_data">  		Daten werden geladen... @@ -63,6 +63,6 @@ Kaufen Sie mehr.  	<button label="Kaufen" name="buy_btn" />  	<button label="Abbrechen" name="cancel_btn" />  	<text name="buy_currency"> -		[LINDENS] L$ für ca. [USD] US$ kaufen +		[LINDENS] L$ für ca. [LOCALAMOUNT] kaufen  	</text>  </floater> diff --git a/indra/newview/skins/default/xui/en/alert_line_editor.xml b/indra/newview/skins/default/xui/en/alert_line_editor.xml index ab708adb06..97991153d8 100644 --- a/indra/newview/skins/default/xui/en/alert_line_editor.xml +++ b/indra/newview/skins/default/xui/en/alert_line_editor.xml @@ -7,5 +7,5 @@    ignore_tab="true"    max_length="254"    text_pad_right="0" -  text_pad_left="0" +  text_pad_left="2"    mouse_opaque="true"/> diff --git a/indra/newview/skins/default/xui/en/floater_aaa.xml b/indra/newview/skins/default/xui/en/floater_aaa.xml index 4bbd561882..0c64408b50 100644 --- a/indra/newview/skins/default/xui/en/floater_aaa.xml +++ b/indra/newview/skins/default/xui/en/floater_aaa.xml @@ -5,6 +5,6 @@   name="floater_aaa"   can_resize="true"    width="1024"> - <string name="Nudge Parabuild">2</string> + <string name="Nudge Parabuild">4</string>    <panel filename="main_view.xml" follows="all" width="1024" height="768" top="0"/>  </floater> diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml index 4f1024f56d..8bfd64b3df 100644 --- a/indra/newview/skins/default/xui/en/floater_about_land.xml +++ b/indra/newview/skins/default/xui/en/floater_about_land.xml @@ -2093,7 +2093,6 @@ Texture:               width="195" />              <button               follows="bottom" -             font="SansSerifSmall"               height="16"               label="Add..."               label_selected="Add..." diff --git a/indra/newview/skins/default/xui/en/floater_animation_preview.xml b/indra/newview/skins/default/xui/en/floater_animation_preview.xml index 41b1f99d41..bb45e51137 100644 --- a/indra/newview/skins/default/xui/en/floater_animation_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_animation_preview.xml @@ -452,28 +452,38 @@ Maximum animation length is [MAX_LENGTH] seconds.       width="200" />      <button       follows="top|right" -     height="28" -     image_selected="button_anim_play_selected.tga" -     image_unselected="button_anim_play.tga" +     height="23" +     image_overlay="Play_Over" +     image_unselected="SegmentedBtn_Left_Off" +     image_selected="SegmentedBtn_Left_On_Selected" +        image_disabled_selected="SegmentedBtn_Left_Selected_Disabled" +        image_disabled="SegmentedBtn_Left_Disabled" +	image_pressed="SegmentedBtn_Left_Press" +	image_pressed_selected="SegmentedBtn_Left_Selected_Press"       layout="topleft"       left="10"       name="play_btn"       tool_tip="Play/pause your animation"       top_pad="0" -     width="28" /> +     width="23" />      <button       follows="top|right" -     height="28" -     image_selected="button_anim_stop_selected.tga" -     image_unselected="button_anim_stop.tga" +     height="23" +     image_overlay="StopReload_Over" +     image_unselected="SegmentedBtn_Right_Off" +     image_selected="SegmentedBtn_Right_On_Selected" +        image_disabled_selected="SegmentedBtn_Right_Selected_Disabled" +        image_disabled="SegmentedBtn_Right_Disabled" +	image_pressed="SegmentedBtn_Right_Press" +	image_pressed_selected="SegmentedBtn_Right_Selected_Press"       layout="topleft" -     left_pad="4"       name="stop_btn"       tool_tip="Stop animation playback"       top_delta="0" -     width="28" /> +     left_delta="23" +     width="23" />      <slider -     left_pad="0" +     left_pad="10"       follows="top|right"       height="23"       width="200" diff --git a/indra/newview/skins/default/xui/en/floater_bulk_perms.xml b/indra/newview/skins/default/xui/en/floater_bulk_perms.xml index 7ae079f553..53ae24fe3f 100644 --- a/indra/newview/skins/default/xui/en/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/en/floater_bulk_perms.xml @@ -154,7 +154,7 @@       image_name="Inv_Texture"       mouse_opaque="true"       name="icon_texture" -     tool_top="Textures" +     tool_tip="Textures"       left_pad="2" />      <button diff --git a/indra/newview/skins/default/xui/en/floater_land_holdings.xml b/indra/newview/skins/default/xui/en/floater_land_holdings.xml index e3751f2bd9..06c766f744 100644 --- a/indra/newview/skins/default/xui/en/floater_land_holdings.xml +++ b/indra/newview/skins/default/xui/en/floater_land_holdings.xml @@ -42,7 +42,6 @@      </scroll_list>      <button       height="23" -     font="SansSerif"       label="Teleport"       label_selected="Teleport"       layout="topleft" @@ -53,7 +52,6 @@       width="80" />      <button       height="23" -     font="SansSerif"       label="Map"       label_selected="Map"       layout="topleft" diff --git a/indra/newview/skins/default/xui/en/floater_preview_gesture.xml b/indra/newview/skins/default/xui/en/floater_preview_gesture.xml index 4f3978a5e3..8cc2c91ef5 100644 --- a/indra/newview/skins/default/xui/en/floater_preview_gesture.xml +++ b/indra/newview/skins/default/xui/en/floater_preview_gesture.xml @@ -173,7 +173,6 @@      <button       follows="top|left"       height="20" -     font="SansSerifSmall"       label="Add >>"       layout="topleft"       left_pad="10" @@ -205,7 +204,6 @@      <button       follows="top|left"       height="20" -     font="SansSerifSmall"       label="Up"       layout="topleft"       left_pad="10" @@ -215,7 +213,6 @@      <button       follows="top|left"       height="20" -     font="SansSerifSmall"       label="Down"       layout="topleft"       left_delta="0" @@ -225,7 +222,6 @@      <button       follows="top|left"       height="20" -     font="SansSerifSmall"       label="Remove"       layout="topleft"       left_delta="0" diff --git a/indra/newview/skins/default/xui/en/floater_select_key.xml b/indra/newview/skins/default/xui/en/floater_select_key.xml index 31d133ff9b..af4fdff044 100644 --- a/indra/newview/skins/default/xui/en/floater_select_key.xml +++ b/indra/newview/skins/default/xui/en/floater_select_key.xml @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <floater   legacy_header_height="18" - border="true" + border="false"   can_close="false"   can_minimize="false"   height="100" diff --git a/indra/newview/skins/default/xui/en/floater_test_line_editor.xml b/indra/newview/skins/default/xui/en/floater_test_line_editor.xml index 0531b52e5a..fe6ec91709 100644 --- a/indra/newview/skins/default/xui/en/floater_test_line_editor.xml +++ b/indra/newview/skins/default/xui/en/floater_test_line_editor.xml @@ -2,7 +2,7 @@  <floater   legacy_header_height="18"   can_resize="true" - height="400" + height="500"   layout="topleft"   name="floater_test_line_editor"   help_topic="floater_test_line_editor" @@ -62,6 +62,34 @@     width="200">      Disabled red-text line editor    </line_editor> +  <line_editor +   height="20" +   left_delta="0" +   name="left_pad_editor" +   text_pad_left="25" +   top_pad="10" +   width="200"> +    25 px left text padding +  </line_editor> +  <line_editor +   height="20" +   left_delta="0" +   name="left_pad_editor" +   text_pad_right="75" +   top_pad="10" +   width="200"> +    75 px right text padding +  </line_editor> +  <line_editor +   height="20" +   left_delta="0" +   name="left_pad_editor" +   text_pad_left="25" +   text_pad_right="75" +   top_pad="10" +   width="200"> +    25 px left 75 px right text padding +  </line_editor>    <!-- "search_editor" is a specialized line_editor that shows read-only         help text until the user clicks in the widget. -->    <search_editor diff --git a/indra/newview/skins/default/xui/en/floater_test_list_view.xml b/indra/newview/skins/default/xui/en/floater_test_list_view.xml index 1d2086d9bc..247c705687 100644 --- a/indra/newview/skins/default/xui/en/floater_test_list_view.xml +++ b/indra/newview/skins/default/xui/en/floater_test_list_view.xml @@ -7,27 +7,5 @@   name="floater_test_list_view"   help_topic="floater_test_list_view"   width="400"> -    <list_view -     height="300" -     left="10" -     name="test_list_view" -     top="28" -     width="300" /> -  <button -    name="test_1_btn" -    label="Test 1" -    top="350" -    left="10" -    height="20" -    width="80" -    commit_callback.function="TestListView.Test1" /> -  <button -    name="test_2_btn" -    label="Test 2" -    top_delta="0" -    left_pad="10" -    height="20" -    width="80" -    commit_callback.function="TestListView.Test2" /> - + <!-- intentionally empty -->  </floater> diff --git a/indra/newview/skins/default/xui/en/inspect_remote_object.xml b/indra/newview/skins/default/xui/en/inspect_remote_object.xml index 07c684d904..b5f2abf52a 100644 --- a/indra/newview/skins/default/xui/en/inspect_remote_object.xml +++ b/indra/newview/skins/default/xui/en/inspect_remote_object.xml @@ -71,7 +71,6 @@    </text>    <button     follows="top|left" -   font="SansSerif"     height="20"     label="Map"     left="10" @@ -80,7 +79,6 @@     width="75" />    <button     follows="top|left" -   font="SansSerif"     height="20"     label="Block"     left_pad="5" @@ -89,7 +87,6 @@     width="75" />    <button     follows="top|left" -   font="SansSerif"     height="20"     label="Close"     right="-10" diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 9722849690..ae8a1599a9 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -373,17 +373,17 @@                  <menu_item_call.on_enable                   function="World.EnableSetHomeLocation" />              </menu_item_call> -            <menu_item_call -             label="Teleport Home" -             layout="topleft" -             name="Teleport Home" -             shortcut="control|shift|H"> -                <menu_item_call.on_click -                 function="World.TeleportHome" /> -                <menu_item_call.on_enable -                 function="World.EnableTeleportHome" /> -            </menu_item_call>          </menu> +	    <menu_item_call +	     label="Home" +	     layout="topleft" +	     name="Teleport Home" +	     shortcut="control|shift|H"> +		<menu_item_call.on_click +		 function="World.TeleportHome" /> +		<menu_item_call.on_enable +		 function="World.EnableTeleportHome" /> +	    </menu_item_call>        <menu_item_check           label="Mini-Map"           layout="topleft" diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 1d385b5a9f..6e178ad570 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -5822,13 +5822,6 @@ If you continue to have problems, please visit the [SUPPORT_SITE].  - Your system memory does not meet the minimum requirements.    </global> -  <global name="PermYes"> -Yes -  </global> - -  <global name="PermNo"> -No -  </global>  <!-- this is alert string from server. the name needs to match entire the server string, and needs to be changed  	whenever the server string changes -->     <global name="You can only set your 'Home Location' on your land or at a mainland Infohub."> diff --git a/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml b/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml index ee333be0cb..b881719e3a 100644 --- a/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml +++ b/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml @@ -12,24 +12,24 @@       follows="all"       height="85"       image_name="ListItem_Over" -     right="-3" +     right="-2"       mouse_opaque="false"       name="hovered_icon"       top="1"       scale_image="true"       visible="false" -     width="307"/> +     width="308"/>      <icon       follows="all"       height="85"       image_name="ListItem_Select" -     right="-3" +     right="-2"       mouse_opaque="false"       name="selected_icon"       top="1"       scale_image="true"       visible="false" -     width="307"/> +     width="308"/>      <texture_picker       allow_no_texture="true"       border_enabled="true" @@ -47,37 +47,34 @@       width="90" />      <text       follows="top|left|right" -     font="SansSerifSmallBold" -     height="16" +     font="SansSerifSmall" +     height="15"       layout="topleft"       left="110"       name="name"       text_color="white"       top="9" -     use_ellipses="false" -     width="197" +     use_ellipses="true" +     width="193"       word_wrap="false" />      <expandable_text       follows="top|left|right"       font="SansSerifSmall" -     height="40" +     height="55"       layout="topleft" -     left="110" +     left="103"       name="description" -     top_pad="3" +     top_pad="0"       width="178"       word_wrap="true" />      <button -     follows="top|right" -     height="16" -     image_selected="BuyArrow_Press" -     image_pressed="BuyArrow_Press" -     image_unselected="BuyArrow_Press" +     follows="right" +     height="20" +     image_overlay="ForwardArrow_Off"       layout="topleft" +     left_pad="5" +     right="-8"       name="info_chevron" -     picture_style="true" -     right="-7" -     tab_stop="false" -     top="27" -     width="16" /> +     top_delta="15" +     width="20" />  </panel> diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml index a4149c174f..37d59de66f 100644 --- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml @@ -14,7 +14,7 @@          Things      </panel.string>      <filter_editor -     text_pad_left="12" +     text_pad_left="14"       follows="left|top|right"  	 font="SanSerif"       height="20" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml index 0ac0521b10..6a61953319 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml @@ -319,7 +319,6 @@ Avatars:       bottom_delta="0"       enabled_control="EnableVoiceChat"       follows="left" -     font="SansSerif"       halign="center"       height="20"       label="Middle Mouse Button" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 90fb3a6bf9..4b727e36ab 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -1819,6 +1819,9 @@ this texture in your inventory  	<string name="LoadingContents">Loading contents...</string>  	<string name="NoContents">No contents</string>  	<string name="WornOnAttachmentPoint" value=" (worn on [ATTACHMENT_POINT])" /> +	<!-- Inventory permissions --> +	<string name="PermYes">Yes</string> +	<string name="PermNo">No</string>  	<!-- Gestures labels -->      <!-- use value="" because they have preceding spaces --> @@ -2260,22 +2263,17 @@ If you continue to receive this message, contact the [SUPPORT_SITE].  <string name="Attached">Attached</string>  <string name="Attached Earlobes">Attached Earlobes</string> -<string name="Back Bangs">Back Bangs</string> -<string name="Back Bangs Down">Back Bangs Down</string> -<string name="Back Bangs Up">Back Bangs Up</string> +  <string name="Back Fringe">Back Fringe</string> -<string name="Back Hair">Back Hair</string> -<string name="Back Hair Down">Back Hair Down</string> -<string name="Back Hair Up">Back Hair Up</string> +  <string name="Baggy">Baggy</string>  <string name="Bangs">Bangs</string> -<string name="Bangs Down">Bangs Down</string> -<string name="Bangs Up">Bangs Up</string> +  <string name="Beady Eyes">Beady Eyes</string>  <string name="Belly Size">Belly Size</string>  <string name="Big">Big</string>  <string name="Big Butt">Big Butt</string> -<string name="Big Eyeball">Big Eyeball</string> +  <string name="Big Hair Back">Big Hair: Back</string>  <string name="Big Hair Front">Big Hair: Front</string>  <string name="Big Hair Top">Big Hair: Top</string> @@ -2345,20 +2343,20 @@ If you continue to receive this message, contact the [SUPPORT_SITE].  <string name="Corner Down">Corner Down</string> -<string name="Corner Normal">Corner Normal</string> +  <string name="Corner Up">Corner Up</string>  <string name="Creased">Creased</string>  <string name="Crooked Nose">Crooked Nose</string> -<string name="Cropped Hair">Cropped Hair</string> +  <string name="Cuff Flare">Cuff Flare</string>  <string name="Dark">Dark</string>  <string name="Dark Green">Dark Green</string>  <string name="Darker">Darker</string>  <string name="Deep">Deep</string>  <string name="Default Heels">Default Heels</string> -<string name="Default Toe">Default Toe</string> +  <string name="Dense">Dense</string> -<string name="Dense hair">Dense hair</string> +  <string name="Double Chin">Double Chin</string>  <string name="Downturned">Downturned</string>  <string name="Duffle Bag">Duffle Bag</string> @@ -2374,7 +2372,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].  <string name="Eye Pop">Eye Pop</string>  <string name="Eye Size">Eye Size</string>  <string name="Eye Spacing">Eye Spacing</string> -<string name="Eyeball Size">Eyeball Size</string> +  <string name="Eyebrow Arc">Eyebrow Arc</string>  <string name="Eyebrow Density">Eyebrow Density</string> @@ -2385,27 +2383,22 @@ If you continue to receive this message, contact the [SUPPORT_SITE].  <string name="Eyelash Length">Eyelash Length</string>  <string name="Eyeliner">Eyeliner</string>  <string name="Eyeliner Color">Eyeliner Color</string> -<string name="Eyes Back">Eyes Back</string> +  <string name="Eyes Bugged">Eyes Bugged</string> -<string name="Eyes Forward">Eyes Forward</string> -<string name="Eyes Long Head">Eyes Long Head</string> + +  <string name="Eyes Shear Left Up">Eyes Shear Left Up</string>  <string name="Eyes Shear Right Up">Eyes Shear Right Up</string> -<string name="Eyes Short Head">Eyes Short Head</string> -<string name="Eyes Spread">Eyes Spread</string> -<string name="Eyes Sunken">Eyes Sunken</string> -<string name="Eyes Together">Eyes Together</string> + + + +  <string name="Face Shear">Face Shear</string>  <string name="Facial Definition">Facial Definition</string>  <string name="Far Set Eyes">Far Set Eyes</string> -<string name="Fat">Fat</string> -<string name="Fat Head">Fat Head</string> +  <string name="Fat Lips">Fat Lips</string> -<string name="Fat Lower">Fat Lower</string> -<string name="Fat Lower Lip">Fat Lower Lip</string> -<string name="Fat Torso">Fat Torso</string> -<string name="Fat Upper">Fat Upper</string> -<string name="Fat Upper Lip">Fat Upper Lip</string> +  <string name="Female">Female</string>  <string name="Fingerless">Fingerless</string>  <string name="Fingers">Fingers</string> @@ -2418,12 +2411,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE].  <string name="Forehead Angle">Forehead Angle</string>  <string name="Forehead Heavy">Forehead Heavy</string>  <string name="Freckles">Freckles</string> -<string name="Front Bangs Down">Front Bangs Down</string> -<string name="Front Bangs Up">Front Bangs Up</string> +  <string name="Front Fringe">Front Fringe</string> -<string name="Front Hair">Front Hair</string> -<string name="Front Hair Down">Front Hair Down</string> -<string name="Front Hair Up">Front Hair Up</string> +  <string name="Full Back">Full Back</string>  <string name="Full Eyeliner">Full Eyeliner</string>  <string name="Full Front">Full Front</string> @@ -2522,7 +2512,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].  <string name="Long Ponytail">Long Ponytail</string>  <string name="Long Torso">Long Torso</string>  <string name="Long arms">Long arms</string> -<string name="Longcuffs">Longcuffs</string> +  <string name="Loose Pants">Loose Pants</string>  <string name="Loose Shirt">Loose Shirt</string> @@ -2582,7 +2572,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].  <string name="No Blush">No Blush</string>  <string name="No Eyeliner">No Eyeliner</string>  <string name="No Eyeshadow">No Eyeshadow</string> -<string name="No Heels">No Heels</string> +  <string name="No Lipgloss">No Lipgloss</string>  <string name="No Lipstick">No Lipstick</string>  <string name="No Part">No Part</string> @@ -2603,7 +2593,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].  <string name="Nostril Division">Nostril Division</string>  <string name="Nostril Width">Nostril Width</string> -<string name="Old">Old</string> +  <string name="Opaque">Opaque</string>  <string name="Open">Open</string>  <string name="Open Back">Open Back</string> @@ -2640,7 +2630,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].  <string name="Platform Width">Platform Width</string>  <string name="Pointy">Pointy</string>  <string name="Pointy Heels">Pointy Heels</string> -<string name="Pointy Toe">Pointy Toe</string> +  <string name="Ponytail">Ponytail</string>  <string name="Poofy Skirt">Poofy Skirt</string>  <string name="Pop Left Eye">Pop Left Eye</string> @@ -2649,30 +2639,30 @@ If you continue to receive this message, contact the [SUPPORT_SITE].  <string name="Puffy Eyelids">Puffy Eyelids</string>  <string name="Rainbow Color">Rainbow Color</string>  <string name="Red Hair">Red Hair</string> -<string name="Red Skin">Red Skin</string> +  <string name="Regular">Regular</string> -<string name="Regular Muscles">Regular Muscles</string> +  <string name="Right Part">Right Part</string>  <string name="Rosy Complexion">Rosy Complexion</string>  <string name="Round">Round</string> -<string name="Round Forehead">Round Forehead</string> +  <string name="Ruddiness">Ruddiness</string>  <string name="Ruddy">Ruddy</string>  <string name="Rumpled Hair">Rumpled Hair</string>  <string name="Saddle Bags">Saddle Bags</string> -<string name="Saddlebags">Saddlebags</string> -<string name="Scrawny">Scrawny</string> + +  <string name="Scrawny Leg">Scrawny Leg</string>  <string name="Separate">Separate</string> -<string name="Shading">Shading</string> -<string name="Shadow hair">Shadow hair</string> + +  <string name="Shallow">Shallow</string>  <string name="Shear Back">Shear Back</string>  <string name="Shear Face">Shear Face</string>  <string name="Shear Front">Shear Front</string> -<string name="Shear Left">Shear Left</string> +  <string name="Shear Left Up">Shear Left Up</string> -<string name="Shear Right">Shear Right</string> +  <string name="Shear Right Up">Shear Right Up</string>  <string name="Sheared Back">Sheared Back</string>  <string name="Sheared Front">Sheared Front</string> @@ -2696,16 +2686,14 @@ If you continue to receive this message, contact the [SUPPORT_SITE].  <string name="Short Torso">Short Torso</string>  <string name="Short hips">Short hips</string>  <string name="Shoulders">Shoulders</string> -<string name="Side Bangs">Side Bangs</string> -<string name="Side Bangs Down">Side Bangs Down</string> -<string name="Side Bangs Up">Side Bangs Up</string> +  <string name="Side Fringe">Side Fringe</string>  <string name="Sideburns">Sideburns</string>  <string name="Sides Hair">Sides Hair</string>  <string name="Sides Hair Down">Sides Hair Down</string>  <string name="Sides Hair Up">Sides Hair Up</string> -<string name="Skinny">Skinny</string> +  <string name="Skinny Neck">Skinny Neck</string>  <string name="Skirt Fit">Skirt Fit</string>  <string name="Skirt Length">Skirt Length</string> @@ -2726,7 +2714,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].  <string name="Smooth Hair">Smooth Hair</string>  <string name="Socks Length">Socks Length</string> -<string name="Some">Some</string> +  <string name="Soulpatch">Soulpatch</string>  <string name="Sparse">Sparse</string> @@ -2734,24 +2722,21 @@ If you continue to receive this message, contact the [SUPPORT_SITE].  <string name="Square">Square</string>  <string name="Square Toe">Square Toe</string>  <string name="Squash Head">Squash Head</string> -<string name="Squash/Stretch Head">Squash/Stretch Head</string> +  <string name="Stretch Head">Stretch Head</string>  <string name="Sunken">Sunken</string>  <string name="Sunken Chest">Sunken Chest</string>  <string name="Sunken Eyes">Sunken Eyes</string>  <string name="Sweep Back">Sweep Back</string>  <string name="Sweep Forward">Sweep Forward</string> -<string name="Swept Back">Swept Back</string> -<string name="Swept Back Hair">Swept Back Hair</string> -<string name="Swept Forward">Swept Forward</string> -<string name="Swept Forward Hair">Swept Forward Hair</string> +  <string name="Tall">Tall</string>  <string name="Taper Back">Taper Back</string>  <string name="Taper Front">Taper Front</string>  <string name="Thick Heels">Thick Heels</string>  <string name="Thick Neck">Thick Neck</string>  <string name="Thick Toe">Thick Toe</string> -<string name="Thickness">Thickness</string> +  <string name="Thin">Thin</string>  <string name="Thin Eyebrows">Thin Eyebrows</string>  <string name="Thin Lips">Thin Lips</string> @@ -2762,8 +2747,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].  <string name="Tight Shirt">Tight Shirt</string>  <string name="Tight Skirt">Tight Skirt</string>  <string name="Tight Sleeves">Tight Sleeves</string> -<string name="Tilt Left">Tilt Left</string> -<string name="Tilt Right">Tilt Right</string> +  <string name="Toe Shape">Toe Shape</string>  <string name="Toe Thickness">Toe Thickness</string>  <string name="Torso Length">Torso Length</string> diff --git a/indra/newview/skins/default/xui/en/widgets/button.xml b/indra/newview/skins/default/xui/en/widgets/button.xml index 7c54e618ef..28ed560543 100644 --- a/indra/newview/skins/default/xui/en/widgets/button.xml +++ b/indra/newview/skins/default/xui/en/widgets/button.xml @@ -15,6 +15,7 @@          image_color="ButtonImageColor"          image_color_disabled="ButtonImageColor"          flash_color="ButtonFlashBgColor" +	font="SansSerifSmall"          hover_glow_amount="0.15"          halign="center"          scale_image="true"> diff --git a/indra/newview/skins/default/xui/en/widgets/filter_editor.xml b/indra/newview/skins/default/xui/en/widgets/filter_editor.xml index ec8395a7c5..0e34243349 100644 --- a/indra/newview/skins/default/xui/en/widgets/filter_editor.xml +++ b/indra/newview/skins/default/xui/en/widgets/filter_editor.xml @@ -2,7 +2,7 @@  <filter_editor    clear_button_visible="true"    search_button_visible="true" -  text_pad_left="5" +  text_pad_left="7"    select_on_focus="true"    background_image="TextField_Search_Off"    background_image_disabled="TextField_Search_Disabled" diff --git a/indra/newview/skins/default/xui/en/widgets/floater.xml b/indra/newview/skins/default/xui/en/widgets/floater.xml index 6660fbf1a8..2263866471 100644 --- a/indra/newview/skins/default/xui/en/widgets/floater.xml +++ b/indra/newview/skins/default/xui/en/widgets/floater.xml @@ -7,4 +7,19 @@           bg_alpha_image="Window_Background"            background_visible="true"           background_opaque="false" -         header_height="25" /> +         header_height="25" +  close_image="Icon_Close_Foreground" +  restore_image="Icon_Restore_Foreground" +  minimize_image="Icon_Minimize_Foreground" +  tear_off_image="tearoffbox.tga" +  dock_image="Icon_Dock_Foreground" +  undock_image="Icon_Undock_Foreground" +  help_image="Icon_Help_Foreground" +  close_pressed_image="Icon_Close_Press" +  restore_pressed_image="Icon_Restore_Press" +  minimize_pressed_image="Icon_Minimize_Press" +  tear_off_pressed_image="tearoff_pressed.tga" +  dock_pressed_image="Icon_Dock_Press" +  undock_pressed_image="Icon_Undock_Press" +  help_pressed_image="Icon_Help_Press" +  /> diff --git a/indra/newview/skins/default/xui/en/widgets/line_editor.xml b/indra/newview/skins/default/xui/en/widgets/line_editor.xml index 546fbd9b47..a21e3f2645 100644 --- a/indra/newview/skins/default/xui/en/widgets/line_editor.xml +++ b/indra/newview/skins/default/xui/en/widgets/line_editor.xml @@ -8,6 +8,7 @@               ignore_tab="true"               cursor_color="TextCursorColor"               text_color="TextFgColor" +			 text_pad_left="2"               text_readonly_color="TextFgReadOnlyColor"               text_tentative_color="TextFgTentativeColor"  			 highlight_color="EmphasisColor" diff --git a/indra/newview/skins/default/xui/en/widgets/location_input.xml b/indra/newview/skins/default/xui/en/widgets/location_input.xml index 17b1479ec4..90887dead6 100644 --- a/indra/newview/skins/default/xui/en/widgets/location_input.xml +++ b/indra/newview/skins/default/xui/en/widgets/location_input.xml @@ -11,6 +11,7 @@                  add_landmark_image_disabled="Favorite_Star_Off"                  add_landmark_image_hover="Favorite_Star_Over"                  add_landmark_image_selected="Favorite_Star_Press" +				add_landmark_hpad="10"                  icon_hpad="2"                  allow_text_entry="true"                  list_position="below" @@ -38,6 +39,15 @@                            scale_image="false"  			  top="19"  			  left="-3" /> +  <for_sale_button +    name="for_sale_btn" +    image_unselected="parcel_lght_ForSale" +    width="22" +    height="18" +    follows="right|top" +    scale_image="false" +    top="21" +    />    <voice_icon      name="voice_icon"      width="22" @@ -84,7 +94,7 @@    <!-- Default text color is invisible on top of nav bar background -->    <damage_text      name="damage_text" -	width="50" +	width="35"  	height="18"  	top="16"  	halign="right" @@ -98,7 +108,7 @@    <combo_list bg_writeable_color="MenuDefaultBgColor" page_lines="10"                scroll_bar_bg_visible="true" />    <combo_editor name="Combo Text Entry" -                text_pad_left="20" +                text_pad_left="22"                  select_on_focus="false"                  font="SansSerifSmall"                  bevel_style="none" diff --git a/indra/newview/skins/default/xui/en/widgets/search_combo_box.xml b/indra/newview/skins/default/xui/en/widgets/search_combo_box.xml index 56204201ef..c2a70d4b39 100644 --- a/indra/newview/skins/default/xui/en/widgets/search_combo_box.xml +++ b/indra/newview/skins/default/xui/en/widgets/search_combo_box.xml @@ -13,7 +13,7 @@   <combo_editor    name="child1"    select_on_focus="true" -  text_pad_left="28"  +  text_pad_left="30"     background_image="TextField_Search_Off"    background_image_disabled="TextField_Search_Disabled"    background_image_focused="TextField_Search_Active"/> diff --git a/indra/newview/skins/default/xui/en/widgets/search_editor.xml b/indra/newview/skins/default/xui/en/widgets/search_editor.xml index 9a79243b03..f644a710b2 100644 --- a/indra/newview/skins/default/xui/en/widgets/search_editor.xml +++ b/indra/newview/skins/default/xui/en/widgets/search_editor.xml @@ -2,7 +2,7 @@  <search_editor    clear_button_visible="false"    search_button_visible="true" -  text_pad_left="4"  +  text_pad_left="6"     select_on_focus="true"    background_image="TextField_Search_Off"    background_image_disabled="TextField_Search_Disabled" diff --git a/indra/newview/skins/default/xui/es/floater_buy_currency.xml b/indra/newview/skins/default/xui/es/floater_buy_currency.xml index af542acbce..eb25493adc 100644 --- a/indra/newview/skins/default/xui/es/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/es/floater_buy_currency.xml @@ -29,7 +29,7 @@  		1234  	</line_editor>  	<text name="currency_est" width="138" left_delta="68"> -		L$  por, aprox., [USD] US$ +		por, aprox., [LOCALAMOUNT]  	</text>  	<text name="getting_data">  		Obteniendo los datos... @@ -63,6 +63,6 @@ Aumente la cantidad a comprar.  	<button label="Cancelar" name="cancel_btn"/>  	<button label="Comprar" name="buy_btn"/>  	<string name="buy_currency"> -		Compre [LINDENS] L$ por, aprox., [USD] US$ +		Compre [LINDENS] L$ por, aprox., [LOCALAMOUNT]  	</string>  </floater> diff --git a/indra/newview/skins/default/xui/fr/floater_animation_preview.xml b/indra/newview/skins/default/xui/fr/floater_animation_preview.xml index 4417006fc6..a4ad14294e 100644 --- a/indra/newview/skins/default/xui/fr/floater_animation_preview.xml +++ b/indra/newview/skins/default/xui/fr/floater_animation_preview.xml @@ -114,12 +114,13 @@ La longueur maximale est de [MAX_LENGTH] secondes.  	</text>  	<spinner label="Priorité" name="priority" tool_tip="Contrôle quelles animations peuvent êtres écrasées par cette animation."/>  	<check_box label="Boucle" left="6" name="loop_check" tool_tip="Joue cette animation en boucle."/> -	<spinner label="Début (%)" label_width="55" left="76" name="loop_in_point" tool_tip="Définit le moment de l'animation où la boucle repart." width="105"/> -	<spinner label="Fin (%)" left="195" name="loop_out_point" tool_tip="Définit le moment de l'animation où la boucle finit."/> -	<text name="hand_label" width="110"> -		Mouvement de main +	<spinner label="Début (%)" label_width="65" name="loop_in_point" tool_tip="Définit le moment de l'animation où la boucle repart." width="105"/> +	<spinner label="Fin (%)" name="loop_out_point" tool_tip="Définit le moment de l'animation où la boucle finit."/> +	<text name="hand_label"> +		Mouvement de +main  	</text> -	<combo_box label="" left_delta="116" name="hand_pose_combo" tool_tip="Contrôle le mouvement des mains au cours de l'animation" width="124"> +	<combo_box label="" name="hand_pose_combo" tool_tip="Contrôle le mouvement des mains au cours de l'animation">  		<combo_box.item label="Doigts écartés" name="Spread"/>  		<combo_box.item label="Détendues" name="Relaxed"/>  		<combo_box.item label="Pointer (les deux)" name="PointBoth"/> @@ -137,7 +138,7 @@ La longueur maximale est de [MAX_LENGTH] secondes.  	<text name="emote_label">  		Expression  	</text> -	<combo_box label="" left_delta="116" name="emote_combo" tool_tip="Contrôle l'expression du visage au cours de l'animation." width="124"> +	<combo_box label="" name="emote_combo" tool_tip="Contrôle l'expression du visage au cours de l'animation.">  		<combo_box.item label="None]" name="[None]"/>  		<combo_box.item label="Aaaaah" name="Aaaaah"/>  		<combo_box.item label="Effrayé" name="Afraid"/> @@ -159,27 +160,25 @@ La longueur maximale est de [MAX_LENGTH] secondes.  		<combo_box.item label="Clin d'œil" name="Wink"/>  		<combo_box.item label="Soucis" name="Worry"/>  	</combo_box> -	<text name="preview_label" width="110"> -		Prévisualiser pendant +	<text name="preview_label"> +		Prévisualiser +pendant  	</text> -	<combo_box label="" left_delta="116" name="preview_base_anim" tool_tip="Utilisez cette option pour tester votre animation pendant que votre avatar fait des choses banales." width="124"> +	<combo_box label="" name="preview_base_anim" tool_tip="Utilisez cette option pour tester votre animation pendant que votre avatar fait des choses banales.">  		<combo_box.item label="Debout" name="Standing"/>  		<combo_box.item label="En train de marcher" name="Walking"/>  		<combo_box.item label="Assis" name="Sitting"/>  		<combo_box.item label="En train de voler" name="Flying"/>  	</combo_box> -	<spinner label="Transition  -début (s)" label_width="65" name="ease_in_time" tool_tip="Durée (en secondes) pendant laquelle l'animation s'intègre au mouvement."/> -	<spinner label="Transition  -fin (s)" label_width="65" left="160" name="ease_out_time" tool_tip="Durée (en secondes) pendant laquelle l'animation disparaît du mouvement." width="125"/> -	<button bottom_delta="-48" label="" name="play_btn" tool_tip="Jouer/Arrêter votre animation."/> +	<spinner label="Transition début (s)" name="ease_in_time" tool_tip="Durée (en secondes) pendant laquelle l'animation s'intègre au mouvement."/> +	<spinner label="Transition fin (s)" name="ease_out_time" tool_tip="Durée (en secondes) pendant laquelle l'animation disparaît du mouvement." /> +	<button label="" name="play_btn" tool_tip="Jouer/Arrêter votre animation."/>  	<button label="" name="stop_btn" tool_tip="Arrêter le playback"/>  	<slider label="" name="playback_slider"/>  	<text name="bad_animation_text">  		Impossible de lire le fichier d'animation. -Nous recommandons les fichiers BVH extraits de -Poser 4. +Nous recommandons les fichiers BVH extraits de Poser 4.  	</text>  	<button label="Annuler" name="cancel_btn"/>  	<button label="Charger ([AMOUNT] L$)" name="ok_btn"/> diff --git a/indra/newview/skins/default/xui/fr/floater_buy_currency.xml b/indra/newview/skins/default/xui/fr/floater_buy_currency.xml index 9112d30be2..603b7587b4 100644 --- a/indra/newview/skins/default/xui/fr/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/fr/floater_buy_currency.xml @@ -29,7 +29,7 @@  		1234  	</line_editor>  	<text name="currency_est" width="138" left_delta="68"> -		L$  pour environ [USD] US$ +		pour environ [LOCALAMOUNT]  	</text>  	<text name="getting_data" width="138">  		Obtention des données... @@ -64,6 +64,6 @@ Veuillez saisir un montant plus élevé.  	<button label="Acheter" name="buy_btn"/>  	<button label="Annuler" name="cancel_btn"/>  	<string name="buy_currency"> -		Acheter [LINDENS] L$ pour environ [USD] US$ +		Acheter [LINDENS] L$ pour environ [LOCALAMOUNT]  	</string>  </floater> diff --git a/indra/newview/skins/default/xui/fr/floater_world_map.xml b/indra/newview/skins/default/xui/fr/floater_world_map.xml index 1f76202dee..ddb868b04a 100644 --- a/indra/newview/skins/default/xui/fr/floater_world_map.xml +++ b/indra/newview/skins/default/xui/fr/floater_world_map.xml @@ -1,71 +1,68 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <floater name="worldmap" title="CARTE DU MONDE"> -	<tab_container name="maptab" width="955"> -		<panel label="Objets" name="objects_mapview" width="953"/> -		<panel label="Terrain" name="terrain_mapview" width="953"/> -	</tab_container> -	<icon left="973" name="self"/> +	<panel name="objects_mapview" width="542"/> +	<icon name="self" left="-270"/>  	<text name="you_label">  		Vous  	</text> -	<icon left="1033" name="home"/> +	<icon name="home"/>  	<text name="home_label">  		Domicile  	</text> -	<icon left="973" name="square2"/> +	<icon name="square2" left="-270"/>  	<text name="auction_label">  		Terrain aux enchères  	</text> -	<icon left="1105" name="square"/> +	<icon name="square" left_delta="130"/>  	<text name="land_for_sale_label">  		Terrain à vendre  	</text> -	<button label="Aller chez moi" label_selected="Aller chez moi" name="Go Home" tool_tip="Vous téléporte à votre domicile"/> -	<icon left="977" name="person"/> +	<button left="-120" width="108" label="Aller chez moi" label_selected="Aller chez moi" name="Go Home" tool_tip="Vous téléporte à votre domicile"/> +	<icon left="-262" name="person"/>  	<check_box label="Résident" name="people_chk"/> -	<icon left="973" name="infohub"/> +	<icon left="-266" name="infohub"/>  	<check_box label="Infohub" name="infohub_chk"/> -	<icon left="973" name="telehub"/> +	<icon left="-266" name="telehub"/>  	<check_box label="Téléhub" name="telehubchk"/> -	<icon left="973" name="landforsale"/> +	<icon left="-266" name="landforsale"/>  	<check_box label="Terrain à vendre" name="land_for_sale_chk"/> -	<text name="events_label" left="1099"> +	<text name="events_label" left="-144">  		Événements :  	</text> -	<icon left="1121" name="event"/> +	<icon left="-132" name="event"/>  	<check_box label="PG" name="event_chk"/> -	<icon left="1121" name="events_mature_icon"/> +	<icon left="-132" name="events_mature_icon"/>  	<check_box label="Mature" name="event_mature_chk"/> -	<icon left="1121" name="events_adult_icon"/> +	<icon left="-132" name="events_adult_icon"/>  	<check_box label="Adult" name="event_adult_chk"/> -	<icon left="973" name="avatar_icon"/> +	<icon left="-270" name="avatar_icon"/>  	<combo_box label="Amis connectés" name="friend combo" tool_tip="Ami à afficher sur la carte" width="232">  		<combo_box.item name="item1" label="Amis connectés" />  	</combo_box> -	<icon left="973" name="landmark_icon"/> +	<icon left="-270" name="landmark_icon"/>  	<combo_box label="Repères" name="landmark combo" tool_tip="Repère à afficher sur la carte" width="232">  		<combo_box.item name="item1" label="Repères" />  	</combo_box> -	<icon left="973" name="location_icon"/> +	<icon left="-270" name="location_icon"/>  	<line_editor label="Rechercher par nom de région" name="location" tool_tip="Saisissez le nom d'une région" width="155"/>  	<button label="Rechercher" label_selected=">" left_delta="160" name="DoSearch" tool_tip="Recherchez sur la carte" width="75"/> -	<text left="973" name="search_label"> +	<text left="-270" name="search_label">  		Résultats de la recherche :  	</text> -	<scroll_list left="973" name="search_results" width="252"> +	<scroll_list left="-270" name="search_results" width="252">  		<column label="" name="icon"/>  		<column label="" name="sim_name"/>  	</scroll_list> -	<text left="973" name="location_label"> +	<text left="-270" name="location_label">  		Emplacement :  	</text> -	<spinner left="1078" name="spin x" tool_tip="Coordonnées des X du lieu à afficher sur la carte"/> +	<spinner left_delta="100" name="spin x" tool_tip="Coordonnées des X du lieu à afficher sur la carte"/>  	<spinner name="spin y" tool_tip="Coordonnées des Y du lieu à afficher sur la carte"/>  	<spinner name="spin z" tool_tip="Coordonnées des Z du lieu à afficher sur la carte"/>  	<button label="Téléporter" label_selected="Téléporter" left="-270" name="Teleport" tool_tip="Téléporter à l'endroit sélectionné"/>  	<button label="Afficher la destination" label_selected="Afficher la destination" name="Show Destination" tool_tip="Centrer la carte sur l'endroit sélectionné" width="165"/>  	<button label="Effacer" label_selected="Effacer" left="-270" name="Clear" tool_tip="Arrêter de suivre"/>  	<button label="Afficher mon emplacement" label_selected="Afficher mon emplacement" name="Show My Location" tool_tip="Centrer la carte sur l'emplacement de votre avatar" width="165"/> -	<button label="Copier la SLurl dans le presse-papiers" left="-270" name="copy_slurl" tool_tip="Copier l'emplacement actuel comme SLurl pour l'utiliser sur le Web." width="262"/> +	<button label="Copier la SLurl dans le presse-papiers" left="-270" name="copy_slurl" tool_tip="Copier l'emplacement actuel comme SLurl pour l'utiliser sur le Web." />  	<slider label="Zoom" left="-270" name="zoom slider"/>  </floater> diff --git a/indra/newview/skins/default/xui/it/floater_buy_currency.xml b/indra/newview/skins/default/xui/it/floater_buy_currency.xml index 6b881683f1..a22850bc4b 100644 --- a/indra/newview/skins/default/xui/it/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/it/floater_buy_currency.xml @@ -29,7 +29,7 @@  		1234  	</line_editor>  	<text name="currency_est"> -		L$  per circa [USD]US$ +		per circa [LOCALAMOUNT]  	</text>  	<text name="getting_data">  		Dati in ricezione... @@ -64,6 +64,6 @@ Devi aumentare l'importo da acquistare.  	<button label="Cancella" name="cancel_btn"/>  	<button label="Acquista" name="buy_btn"/>  	<string name="buy_currency"> -		acquistare [LINDENS] L$ per circa [USD] US$ +		acquistare [LINDENS]L$ per circa [LOCALAMOUNT]  	</string>  </floater> diff --git a/indra/newview/skins/default/xui/ja/floater_buy_currency.xml b/indra/newview/skins/default/xui/ja/floater_buy_currency.xml index 9d5aea612b..35516301fc 100644 --- a/indra/newview/skins/default/xui/ja/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/ja/floater_buy_currency.xml @@ -29,7 +29,7 @@  		1234  	</line_editor>  	<text name="currency_est"> -		約US$ [USD] +		約[LOCALAMOUNT]  	</text>  	<text name="getting_data" left_delta="3">  		データを取得しています... @@ -63,6 +63,6 @@  	<button label="購入" name="buy_btn" />  	<button label="取り消し" name="cancel_btn" />  	<text name="buy_currency"> -		約US$ [USD]でL$ [LINDENS]を購入 +		約[LOCALAMOUNT]でL$ [LINDENS]を購入  	</text>  </floater> diff --git a/indra/newview/skins/default/xui/nl/floater_buy_currency.xml b/indra/newview/skins/default/xui/nl/floater_buy_currency.xml index b6fc743abe..6ee5cc5341 100644 --- a/indra/newview/skins/default/xui/nl/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/nl/floater_buy_currency.xml @@ -29,7 +29,7 @@  		1234  	</line_editor>  	<text name="currency_est" left_delta="80"> -		voor ong. US$ [USD] +		voor ong. [LOCALAMOUNT]  	</text>  	<text name="getting_data">  		Data ophalen… @@ -63,6 +63,6 @@ Verhoog de hoeveelheid die gekocht moet worden.  	<button label="Annuleren" name="cancel_btn"/>  	<button label="Kopen" name="buy_btn"/>  	<string name="buy_currency"> -		Koop L$ [LINDENS] voor ong. US$ [USD] +		Koop L$ [LINDENS] voor ong. [LOCALAMOUNT]  	</string>  </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_buy_currency.xml b/indra/newview/skins/default/xui/pl/floater_buy_currency.xml index b0b8935433..5e59482883 100755 --- a/indra/newview/skins/default/xui/pl/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/pl/floater_buy_currency.xml @@ -29,7 +29,7 @@  		1234  	</line_editor>  	<text name="currency_est"> -		L$ za [USD]US$ +		za [LOCALAMOUNT]  	</text>  	<text name="getting_data">  		Otrzymywanie danych... @@ -64,6 +64,6 @@ Proszę zwiększyć ilość.  	<button label="Anuluj" name="cancel_btn" />  	<button label="Kup" name="buy_btn" />  	<string name="buy_currency"> -		Kup [LINDENS]L$ za [USD]US$ +		Kup [LINDENS]L$ za [LOCALAMOUNT]  	</string>  </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_buy_currency.xml b/indra/newview/skins/default/xui/pt/floater_buy_currency.xml index ceeb070c4e..aac8438fdc 100644 --- a/indra/newview/skins/default/xui/pt/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/pt/floater_buy_currency.xml @@ -29,7 +29,7 @@  		1234  	</line_editor>  	<text name="currency_est" left_delta="72"> -		por aproxim. US$ [USD] +		por aproxim. [LOCALAMOUNT]  	</text>  	<text name="getting_data">  		Obtendo dados... @@ -63,6 +63,6 @@ Aumente a quantidade de compra.  	<button label="Fechar" name="cancel_btn"/>  	<button label="Adquirir" name="buy_btn"/>  	<string name="buy_currency"> -		Comprar L$ [LINDENS] por aproximadamente US$ [USD] +		Comprar L$ [LINDENS] por aproxim. [LOCALAMOUNT]  	</string>  </floater>  | 
