diff options
142 files changed, 3083 insertions, 3970 deletions
diff --git a/indra/llcharacter/llvisualparam.h b/indra/llcharacter/llvisualparam.h index 16319ef621..43911f4ed7 100644 --- a/indra/llcharacter/llvisualparam.h +++ b/indra/llcharacter/llvisualparam.h @@ -119,9 +119,9 @@ public:  	const LLString&			getMaxDisplayName() const	{ return mInfo->mMaxName; }  	const LLString&			getMinDisplayName() const	{ return mInfo->mMinName; } -	void					setDisplayName(const char* s) 	 { mInfo->mDisplayName = s; } -	void					setMaxDisplayName(const char* s) { mInfo->mMaxName = s; } -	void					setMinDisplayName(const char* s) { mInfo->mMinName = s; } +	void					setDisplayName(const LLString& s) 	 { mInfo->mDisplayName = s; } +	void					setMaxDisplayName(const LLString& s) { mInfo->mMaxName = s; } +	void					setMinDisplayName(const LLString& s) { mInfo->mMinName = s; }  	EVisualParamGroup		getGroup() 			{ return mInfo->mGroup; }  	F32						getMinWeight() 		{ return mInfo->mMinWeight; } diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h index 649fcd41a6..70f7d5483e 100644 --- a/indra/llcommon/llstring.h +++ b/indra/llcommon/llstring.h @@ -321,6 +321,18 @@ template<class T> LLStringBase<T> LLStringBase<T>::null;  typedef LLStringBase<char> LLString;  typedef LLStringBase<llwchar> LLWString; +//@ Use this where we want to disallow input in the form of "foo" +//  This is used to catch places where english text is embedded in the code +//  instead of in a translatable XUI file. +class LLStringExplicit : public LLString +{ +public: +	explicit LLStringExplicit(const char* s) : LLString(s) {} +	LLStringExplicit(const LLString& s) : LLString(s) {} +	LLStringExplicit(const std::string& s) : LLString(s) {} +	LLStringExplicit(const std::string& s, size_type pos, size_type n = std::string::npos) : LLString(s, pos, n) {} +}; +  struct LLDictionaryLess  {  public: @@ -336,7 +348,7 @@ public:   */  /** - * @breif chop off the trailing characters in a string. + * @brief chop off the trailing characters in a string.   *   * This function works on bytes rather than glyphs, so this will   * incorrectly truncate non-single byte strings. diff --git a/indra/llimage/llimage.h b/indra/llimage/llimage.h index ae5f5eb55f..65a7c54a50 100644 --- a/indra/llimage/llimage.h +++ b/indra/llimage/llimage.h @@ -114,7 +114,7 @@ protected:  public:  	static const LLString& getLastError() {return sLastErrorMessage;};  	static void resetLastError() {sLastErrorMessage = LLString("No Error"); }; -	static BOOL setLastError(const LLString& message, const LLString& filename = ""); // returns FALSE +	static BOOL setLastError(const LLString& message, const LLString& filename = LLString()); // returns FALSE  	static void generateMip(const U8 *indata, U8* mipdata, int width, int height, S32 nchannels); diff --git a/indra/llinventory/llparcel.cpp b/indra/llinventory/llparcel.cpp index 92049c068b..3a67385030 100644 --- a/indra/llinventory/llparcel.cpp +++ b/indra/llinventory/llparcel.cpp @@ -259,42 +259,25 @@ void LLParcel::overrideParcelFlags(U32 flags)  	mParcelFlags = flags;  } -void set_std_string(const char* src, std::string& dest) -{ -	if(src) -	{ -		dest.assign(src); -	} -	else -	{ -#if (LL_LINUX && __GNUC__ < 3) -		dest.assign(std::string("")); -#else -		dest.clear(); -#endif -	} -} - -void LLParcel::setName(const char* name) +void LLParcel::setName(const LLString& name)  {  	// The escaping here must match the escaping in the database  	// abstraction layer. -	set_std_string(name, mName); +	mName = name;  	LLStringFn::replace_nonprintable(mName, LL_UNKNOWN_CHAR);  } -void LLParcel::setDesc(const char* desc) +void LLParcel::setDesc(const LLString& desc)  {  	// The escaping here must match the escaping in the database  	// abstraction layer. -	set_std_string(desc, mDesc); +	mDesc = desc;  	mDesc = rawstr_to_utf8(mDesc);  } -void LLParcel::setMusicURL(const char* url) +void LLParcel::setMusicURL(const LLString& url)  { -	set_std_string(url, mMusicURL); - +	mMusicURL = url;  	// The escaping here must match the escaping in the database  	// abstraction layer.  	// This should really filter the url in some way. Other than @@ -302,10 +285,9 @@ void LLParcel::setMusicURL(const char* url)  	LLStringFn::replace_nonprintable(mMusicURL, LL_UNKNOWN_CHAR);  } -void LLParcel::setMediaURL(const char* url) +void LLParcel::setMediaURL(const LLString& url)  { -	set_std_string(url, mMediaURL); - +	mMediaURL = url;  	// The escaping here must match the escaping in the database  	// abstraction layer if it's ever added.  	// This should really filter the url in some way. Other than @@ -571,19 +553,19 @@ BOOL LLParcel::importStream(std::istream& input_stream)  		}  		else if ("name" == keyword)  		{ -			setName( value.c_str() ); +			setName( value );  		}  		else if ("desc" == keyword)  		{ -			setDesc( value.c_str() ); +			setDesc( value );  		}  		else if ("music_url" == keyword)  		{ -			setMusicURL( value.c_str() ); +			setMusicURL( value );  		}  		else if ("media_url" == keyword)  		{ -			setMediaURL( value.c_str() ); +			setMediaURL( value );  		}  		else if ("media_id" == keyword)  		{ @@ -1838,3 +1820,4 @@ LLParcel::ECategory category_ui_string_to_category(const char* s)  	return LLParcel::C_ANY;  } + diff --git a/indra/llinventory/llparcel.h b/indra/llinventory/llparcel.h index efabde3358..9c6300811b 100644 --- a/indra/llinventory/llparcel.h +++ b/indra/llinventory/llparcel.h @@ -203,10 +203,10 @@ public:  	// MANIPULATORS  	void generateNewID() { mID.generate(); } -	void setName(const char* name); -	void setDesc(const char* desc); -	void setMusicURL(const char* url); -	void setMediaURL(const char* url); +	void setName(const LLString& name); +	void setDesc(const LLString& desc); +	void setMusicURL(const LLString& url); +	void setMediaURL(const LLString& url);  	void	setMediaID(const LLUUID& id) { mMediaID = id; }  	void	setMediaAutoScale ( U8 flagIn ) { mMediaAutoScale = flagIn; }  	virtual void	setLocalID(S32 local_id); @@ -256,7 +256,7 @@ public:  	void	setDrawDistance(F32 dist)	{ mDrawDistance = dist; }  	void	setSalePrice(S32 price)		{ mSalePrice = price; }  	void	setGroupID(const LLUUID& id)	{ mGroupID = id; } -	//void	setGroupName(const char* s)	{ mGroupName.assign(s); } +	//void	setGroupName(const LLString& s)	{ mGroupName.assign(s); }  	void	setPassPrice(S32 price)				{ mPassPrice = price; }  	void	setPassHours(F32 hours)				{ mPassHours = hours; } @@ -292,10 +292,10 @@ public:  	// ACCESSORS  	const LLUUID&	getID() const				{ return mID; } -	const char*		getName() const				{ return mName.c_str(); } -	const char*		getDesc() const				{ return mDesc.c_str(); } -	const char*		getMusicURL() const			{ return mMusicURL.c_str(); } -	const char*		getMediaURL() const			{ return mMediaURL.c_str(); } +	const LLString&	getName() const			{ return mName; } +	const LLString&	getDesc() const			{ return mDesc; } +	const LLString&	getMusicURL() const		{ return mMusicURL; } +	const LLString&	getMediaURL() const		{ return mMediaURL; }  	const LLUUID&	getMediaID() const			{ return mMediaID; }  	U8				getMediaAutoScale() const	{ return mMediaAutoScale; }  	S32				getLocalID() const			{ return mLocalID; } @@ -567,10 +567,10 @@ protected:  	F32					mDrawDistance;  	U32					mParcelFlags;  	S32					mSalePrice;				// linden dollars -	std::string mName; -	std::string mDesc; -	std::string mMusicURL; -	std::string mMediaURL; +	LLString 			mName; +	LLString 			mDesc; +	LLString 			mMusicURL; +	LLString 			mMediaURL;  	U8					mMediaAutoScale;  	LLUUID				mMediaID;  	S32					mPassPrice; diff --git a/indra/llinventory/llpermissions.cpp b/indra/llinventory/llpermissions.cpp index 4b44fc24f6..8f9f73d0bd 100644 --- a/indra/llinventory/llpermissions.cpp +++ b/indra/llinventory/llpermissions.cpp @@ -1143,6 +1143,12 @@ void mask_to_string(U32 mask, char* str)  	*str = '\0';  } +std::string mask_to_string(U32 mask) +{ +	char str[16]; +	mask_to_string(mask, str); +	return std::string(str); +}  ///----------------------------------------------------------------------------  /// exported functions diff --git a/indra/llinventory/llpermissions.h b/indra/llinventory/llpermissions.h index ab12abb9ed..9370d6480b 100644 --- a/indra/llinventory/llpermissions.h +++ b/indra/llinventory/llpermissions.h @@ -41,6 +41,7 @@  // prototypes  class LLMessageSystem;  extern void mask_to_string(U32 mask, char* str); +extern std::string mask_to_string(U32 mask);  template<class T> class LLMetaClassT;  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/indra/llmessage/lltransfertargetfile.h b/indra/llmessage/lltransfertargetfile.h index 6b30aa2941..18b44e2611 100644 --- a/indra/llmessage/lltransfertargetfile.h +++ b/indra/llmessage/lltransfertargetfile.h @@ -40,7 +40,7 @@ class LLTransferTargetParamsFile : public LLTransferTargetParams  {  public:  	LLTransferTargetParamsFile() : LLTransferTargetParams(LLTTT_FILE) {} -	void setFilename(const char *filename)			{ mFilename = filename; } +	void setFilename(const LLString& filename)	{ mFilename = filename; }  	void setCallback(LLTTFCompleteCallback cb, void *user_data)		{ mCompleteCallback = cb; mUserData = user_data; }  	friend class LLTransferTargetFile; diff --git a/indra/llprimitive/llprimitive.cpp b/indra/llprimitive/llprimitive.cpp index e3718fe578..628f7f8cc8 100644 --- a/indra/llprimitive/llprimitive.cpp +++ b/indra/llprimitive/llprimitive.cpp @@ -1660,6 +1660,52 @@ void LLPrimitive::setTextureList(LLTextureEntry *listp)  //============================================================================ +// Moved from llselectmgr.cpp +// BUG: Only works for boxes. +// Face numbering for flex boxes as of 1.14.2 + +// static +bool LLPrimitive::getTESTAxes(const U8 face, U32* s_axis, U32* t_axis) +{ +	if (face == 0) +	{ +		*s_axis = VX; *t_axis = VY; +		return true; +	} +	else if (face == 1) +	{ +		*s_axis = VX; *t_axis = VZ; +		return true; +	} +	else if (face == 2) +	{ +		*s_axis = VY; *t_axis = VZ; +		return true; +	} +	else if (face == 3) +	{ +		*s_axis = VX; *t_axis = VZ; +		return true; +	} +	else if (face == 4) +	{ +		*s_axis = VY; *t_axis = VZ; +		return true; +	} +	else if (face == 5) +	{ +		*s_axis = VX; *t_axis = VY; +		return true; +	} +	else +	{ +		// unknown face +		return false; +	} +} + +//============================================================================ +  //static   BOOL LLNetworkData::isValid(U16 param_type, U32 size)  { diff --git a/indra/llprimitive/llprimitive.h b/indra/llprimitive/llprimitive.h index 98b70a47d8..53b17bc2ef 100644 --- a/indra/llprimitive/llprimitive.h +++ b/indra/llprimitive/llprimitive.h @@ -362,7 +362,8 @@ public:  	static const char *pCodeToString(const LLPCode pcode);  	static LLPCode legacyToPCode(const U8 legacy);  	static U8 pCodeToLegacy(const LLPCode pcode); - +	static bool getTESTAxes(const U8 face, U32* s_axis, U32* t_axis); +	  	inline static BOOL isPrimitive(const LLPCode pcode);  	inline static BOOL isApp(const LLPCode pcode); diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp index 5c9b49c5a8..65cbcf3634 100644 --- a/indra/llui/llbutton.cpp +++ b/indra/llui/llbutton.cpp @@ -776,36 +776,36 @@ LLSD LLButton::getValue() const  	return mToggleState;  } -void LLButton::setLabel( const LLString& label ) +void LLButton::setLabel( const LLStringExplicit& label )  {  	setLabelUnselected(label);  	setLabelSelected(label);  }  //virtual -BOOL LLButton::setLabelArg( const LLString& key, const LLString& text ) +BOOL LLButton::setLabelArg( const LLString& key, const LLStringExplicit& text )  {  	mUnselectedLabel.setArg(key, text);  	mSelectedLabel.setArg(key, text);  	return TRUE;  } -void LLButton::setLabelUnselected( const LLString& label ) +void LLButton::setLabelUnselected( const LLStringExplicit& label )  {  	mUnselectedLabel = label;  } -void LLButton::setLabelSelected( const LLString& label ) +void LLButton::setLabelSelected( const LLStringExplicit& label )  {  	mSelectedLabel = label;  } -void LLButton::setDisabledLabel( const LLString& label ) +void LLButton::setDisabledLabel( const LLStringExplicit& label )  {  	mDisabledLabel = label;  } -void LLButton::setDisabledSelectedLabel( const LLString& label ) +void LLButton::setDisabledSelectedLabel( const LLStringExplicit& label )  {  	mDisabledSelectedLabel = label;  } diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h index 74926f2b52..5f7d917b4e 100644 --- a/indra/llui/llbutton.h +++ b/indra/llui/llbutton.h @@ -68,7 +68,7 @@ class LLButton  {  public:  	// simple button with text label -	LLButton(const LLString& name, const LLRect &rect, const LLString& control_name = "",  +	LLButton(const LLString& name, const LLRect &rect, const LLString& control_name = LLString(),   			 void (*on_click)(void*) = NULL, void *data = NULL);  	LLButton(const LLString& name, const LLRect& rect,  @@ -152,12 +152,12 @@ public:  	virtual void	setValue(const LLSD& value );  	virtual LLSD	getValue() const; -	void			setLabel( const LLString& label); -	virtual BOOL	setLabelArg( const LLString& key, const LLString& text ); -	void			setLabelUnselected(const LLString& label); -	void			setLabelSelected(const LLString& label); -	void			setDisabledLabel(const LLString& disabled_label); -	void			setDisabledSelectedLabel(const LLString& disabled_label); +	void			setLabel( const LLStringExplicit& label); +	virtual BOOL	setLabelArg( const LLString& key, const LLStringExplicit& text ); +	void			setLabelUnselected(const LLStringExplicit& label); +	void			setLabelSelected(const LLStringExplicit& label); +	void			setDisabledLabel(const LLStringExplicit& disabled_label); +	void			setDisabledSelectedLabel(const LLStringExplicit& disabled_label);  	void			setDisabledLabelColor( const LLColor4& c )		{ mDisabledLabelColor = c; }  	void			setFont(const LLFontGL *font)		 @@ -288,12 +288,12 @@ class LLSquareButton  {  public:  	LLSquareButton(const LLString& name, const LLRect& rect,  -		const LLString& label, -		const LLFontGL *font = NULL, -		const LLString& control_name = "",	 -		void (*click_callback)(void*) = NULL, -		void *callback_data = NULL, -		const LLString& selected_label = LLString::null ); +				   const LLString& label, +				   const LLFontGL *font = NULL, +				   const LLString& control_name = LLString(),	 +				   void (*click_callback)(void*) = NULL, +				   void *callback_data = NULL, +				   const LLString& selected_label = LLString::null );  };  // Helpful functions diff --git a/indra/llui/llcheckboxctrl.cpp b/indra/llui/llcheckboxctrl.cpp index 08ebfafa53..504b342003 100644 --- a/indra/llui/llcheckboxctrl.cpp +++ b/indra/llui/llcheckboxctrl.cpp @@ -242,7 +242,7 @@ LLSD LLCheckBoxCtrl::getValue() const  	return mButton->getToggleState();  } -void LLCheckBoxCtrl::setLabel( const LLString& label ) +void LLCheckBoxCtrl::setLabel( const LLStringExplicit& label )  {  	mLabel->setText( label );  	reshape(getRect().getWidth(), getRect().getHeight(), FALSE); @@ -253,7 +253,7 @@ LLString LLCheckBoxCtrl::getLabel() const  	return mLabel->getText();  } -BOOL LLCheckBoxCtrl::setLabelArg( const LLString& key, const LLString& text ) +BOOL LLCheckBoxCtrl::setLabelArg( const LLString& key, const LLStringExplicit& text )  {  	BOOL res = mLabel->setTextArg(key, text);  	reshape(getRect().getWidth(), getRect().getHeight(), FALSE); diff --git a/indra/llui/llcheckboxctrl.h b/indra/llui/llcheckboxctrl.h index 37e689173b..513b2930e1 100644 --- a/indra/llui/llcheckboxctrl.h +++ b/indra/llui/llcheckboxctrl.h @@ -94,7 +94,7 @@ public:  	virtual void		setTentative(BOOL b)	{ mButton->setTentative(b); }  	virtual BOOL		getTentative() const	{ return mButton->getTentative(); } -	virtual BOOL		setLabelArg( const LLString& key, const LLString& text ); +	virtual BOOL		setLabelArg( const LLString& key, const LLStringExplicit& text );  	virtual void		clear();  	virtual void		onCommit(); @@ -105,7 +105,7 @@ public:  	void				setEnabledColor( const LLColor4 &color ) { mTextEnabledColor = color; }  	void				setDisabledColor( const LLColor4 &color ) { mTextDisabledColor = color; } -	void				setLabel( const LLString& label ); +	void				setLabel( const LLStringExplicit& label );  	LLString			getLabel() const;  	virtual void		setControlName(const LLString& control_name, LLView* context); diff --git a/indra/llui/llcombobox.cpp b/indra/llui/llcombobox.cpp index 7ed3d3efbd..5f76cfc94b 100644 --- a/indra/llui/llcombobox.cpp +++ b/indra/llui/llcombobox.cpp @@ -229,12 +229,12 @@ void LLComboBox::clear()  {   	if (mTextEntry)  	{ -		mTextEntry->setText(""); +		mTextEntry->setText(LLString::null);  	} -	mButton->setLabelSelected(""); -	mButton->setLabelUnselected(""); -	mButton->setDisabledLabel(""); -	mButton->setDisabledSelectedLabel(""); +	mButton->setLabelSelected(LLString::null); +	mButton->setLabelUnselected(LLString::null); +	mButton->setDisabledLabel(LLString::null); +	mButton->setDisabledSelectedLabel(LLString::null);  	mList->deselectAllItems();  } @@ -309,7 +309,7 @@ void LLComboBox::sortByName()  // Choose an item with a given name in the menu.  // Returns TRUE if the item was found. -BOOL LLComboBox::setSimple(const LLString& name) +BOOL LLComboBox::setSimple(const LLStringExplicit& name)  {  	BOOL found = mList->selectSimpleItem(name, FALSE); @@ -371,7 +371,7 @@ LLSD LLComboBox::getValue() const  	}  } -void LLComboBox::setLabel(const LLString& name) +void LLComboBox::setLabel(const LLStringExplicit& name)  {  	if ( mAllowTextEntry )  	{ @@ -803,7 +803,7 @@ void LLComboBox::setAllowTextEntry(BOOL allow, S32 max_chars, BOOL set_tentative  		// clear label on button  		LLString cur_label = mButton->getLabelSelected(); -		setLabel(""); +		setLabel(LLString::null);  		if (!mTextEntry)  		{  			LLRect text_entry_rect(0, mRect.getHeight(), mRect.getWidth(), 0); @@ -852,7 +852,7 @@ void LLComboBox::setAllowTextEntry(BOOL allow, S32 max_chars, BOOL set_tentative  	mTextEntryTentative = set_tentative;	  } -void LLComboBox::setTextEntry(const LLString& text) +void LLComboBox::setTextEntry(const LLStringExplicit& text)  {  	if (mTextEntry)  	{ diff --git a/indra/llui/llcombobox.h b/indra/llui/llcombobox.h index 9b47bfcabb..ff17d2874f 100644 --- a/indra/llui/llcombobox.h +++ b/indra/llui/llcombobox.h @@ -105,7 +105,7 @@ public:  	virtual LLSD	getValue() const;  	void			setAllowTextEntry(BOOL allow, S32 max_chars = 50, BOOL make_tentative = TRUE); -	void			setTextEntry(const LLString& text); +	void			setTextEntry(const LLStringExplicit& text);  	void			add(const LLString& name, EAddPosition pos = ADD_BOTTOM, BOOL enabled = TRUE);	// add item "name" to menu  	void			add(const LLString& name, const LLUUID& id, EAddPosition pos = ADD_BOTTOM, BOOL enabled = TRUE); @@ -117,7 +117,7 @@ public:  	void			sortByName(); // Sort the entries in the combobox by name  	// Select current item by name using selectSimpleItem.  Returns FALSE if not found. -	BOOL			setSimple(const LLString& name); +	BOOL			setSimple(const LLStringExplicit& name);  	// Get name of current item. Returns an empty string if not found.  	const LLString&	getSimple() const;  	// Get contents of column x of selected row @@ -125,7 +125,7 @@ public:  	// Sets the label, which doesn't have to exist in the label.  	// This is probably a UI abuse. -	void			setLabel(const LLString& name); +	void			setLabel(const LLStringExplicit& name);  	BOOL			remove(const LLString& name);	// remove item "name", return TRUE if found and removed diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp index 13947d0605..37ee4c46ba 100644 --- a/indra/llui/lllineeditor.cpp +++ b/indra/llui/lllineeditor.cpp @@ -320,12 +320,12 @@ void LLLineEditor::setBorderWidth(S32 left, S32 right)  	mMaxHPixels = mRect.getWidth() - mMinHPixels - mBorderThickness - mBorderRight;  } -void LLLineEditor::setLabel(const LLString &new_label) +void LLLineEditor::setLabel(const LLStringExplicit &new_label)  {  	mLabel = new_label;  } -void LLLineEditor::setText(const LLString &new_text) +void LLLineEditor::setText(const LLStringExplicit &new_text)  {  	// If new text is identical, don't copy and don't move insertion point  	if (mText.getString() == new_text) @@ -2322,13 +2322,13 @@ LLSD LLLineEditor::getValue() const  	return ret;  } -BOOL LLLineEditor::setTextArg( const LLString& key, const LLString& text ) +BOOL LLLineEditor::setTextArg( const LLString& key, const LLStringExplicit& text )  {  	mText.setArg(key, text);  	return TRUE;  } -BOOL LLLineEditor::setLabelArg( const LLString& key, const LLString& text ) +BOOL LLLineEditor::setLabelArg( const LLString& key, const LLStringExplicit& text )  {  	mLabel.setArg(key, text);  	return TRUE; @@ -2353,8 +2353,7 @@ LLSearchEditor::LLSearchEditor(const LLString& name,  			onSearchEdit,  			NULL,  			this); -	// TODO: this should be translatable -	mSearchEdit->setLabel("Type here to search"); +  	mSearchEdit->setFollowsAll();  	mSearchEdit->setSelectAllonFocusReceived(TRUE); @@ -2409,13 +2408,13 @@ LLSD LLSearchEditor::getValue() const  }  //virtual -BOOL LLSearchEditor::setTextArg( const LLString& key, const LLString& text ) +BOOL LLSearchEditor::setTextArg( const LLString& key, const LLStringExplicit& text )  {  	return mSearchEdit->setTextArg(key, text);  }  //virtual -BOOL LLSearchEditor::setLabelArg( const LLString& key, const LLString& text ) +BOOL LLSearchEditor::setLabelArg( const LLString& key, const LLStringExplicit& text )  {  	return mSearchEdit->setLabelArg(key, text);  } @@ -2437,7 +2436,7 @@ void LLSearchEditor::draw()  	LLUICtrl::draw();  } -void LLSearchEditor::setText(const LLString &new_text) +void LLSearchEditor::setText(const LLStringExplicit &new_text)  {  	mSearchEdit->setText(new_text);  } @@ -2483,6 +2482,12 @@ LLView* LLSearchEditor::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFacto  								max_text_length,  								NULL, NULL); +	LLString label; +	if(node->getAttributeString("label", label)) +	{ +		search_editor->mSearchEdit->setLabel(label); +	} +	  	search_editor->setText(text);  	search_editor->initFromXML(node, parent); diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h index 0d1ec08ab2..2cd2ebf9fe 100644 --- a/indra/llui/lllineeditor.h +++ b/indra/llui/lllineeditor.h @@ -136,11 +136,11 @@ public:  	// assumes UTF8 text  	virtual void	setValue(const LLSD& value );  	virtual LLSD	getValue() const; -	virtual BOOL	setTextArg( const LLString& key, const LLString& text ); -	virtual BOOL	setLabelArg( const LLString& key, const LLString& text ); +	virtual BOOL	setTextArg( const LLString& key, const LLStringExplicit& text ); +	virtual BOOL	setLabelArg( const LLString& key, const LLStringExplicit& text ); -	void			setLabel(const LLString &new_label); -	void			setText(const LLString &new_text); +	void			setLabel(const LLStringExplicit &new_label); +	void			setText(const LLStringExplicit &new_text);  	const LLString& getText() const		{ return mText.getString(); }  	const LLWString& getWText() const	{ return mText.getWString(); } @@ -312,15 +312,15 @@ public:  	virtual LLString getWidgetTag() const;  	static LLView* fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFactory *factory); -	void setText(const LLString &new_text); +	void setText(const LLStringExplicit &new_text);  	void setSearchCallback(void (*search_callback)(const LLString& search_string, void* user_data), void* data) { mSearchCallback = search_callback; mCallbackUserData = data; }  	// LLUICtrl interface  	virtual void	setValue(const LLSD& value );  	virtual LLSD	getValue() const; -	virtual BOOL	setTextArg( const LLString& key, const LLString& text ); -	virtual BOOL	setLabelArg( const LLString& key, const LLString& text ); +	virtual BOOL	setTextArg( const LLString& key, const LLStringExplicit& text ); +	virtual BOOL	setLabelArg( const LLString& key, const LLStringExplicit& text );  	virtual void	clear(); diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index b8cdd52deb..9b4a2a168c 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -373,7 +373,7 @@ void LLMenuItemGL::setHighlightFGColor( const LLColor4& color )  // change the label -void LLMenuItemGL::setLabel( const LLString& label ) +void LLMenuItemGL::setLabel( const LLStringExplicit& label )  {  	mLabel = label;  } @@ -598,7 +598,7 @@ void LLMenuItemGL::draw( void )  	mGotHover = FALSE;  } -BOOL LLMenuItemGL::setLabelArg( const LLString& key, const LLString& text ) +BOOL LLMenuItemGL::setLabelArg( const LLString& key, const LLStringExplicit& text )  {  	mLabel.setArg(key, text);  	return TRUE; diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h index 6e5ac7482e..6dc9282ba6 100644 --- a/indra/llui/llmenugl.h +++ b/indra/llui/llmenugl.h @@ -127,8 +127,8 @@ public:  	LLString getLabel( void ) const { return mLabel.getString(); }  	// change the label -	void setLabel( const LLString& label ); -	virtual BOOL setLabelArg( const LLString& key, const LLString& text ); +	void setLabel( const LLStringExplicit& label ); +	virtual BOOL setLabelArg( const LLString& key, const LLStringExplicit& text );  	// Get the parent menu for this item  	virtual LLMenuGL*	getMenu(); @@ -443,7 +443,7 @@ public:  	// return the name label  	const LLString& getLabel( void ) const { return mLabel.getString(); } -	void setLabel(const LLString& label) { mLabel = label; } +	void setLabel(const LLStringExplicit& label) { mLabel = label; }  	static void setDefaultBackgroundColor( const LLColor4& color );  	void setBackgroundColor( const LLColor4& color ); diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp index 8ff047efa7..3a0ee9b013 100644 --- a/indra/llui/llpanel.cpp +++ b/indra/llui/llpanel.cpp @@ -962,7 +962,7 @@ LLSD LLPanel::childGetValue(const LLString& id) const  	return LLSD();  } -BOOL LLPanel::childSetTextArg(const LLString& id, const LLString& key, const LLString& text) +BOOL LLPanel::childSetTextArg(const LLString& id, const LLString& key, const LLStringExplicit& text)  {  	LLUICtrl* child = (LLUICtrl*)getChildByName(id, true);  	if (child) @@ -972,7 +972,7 @@ BOOL LLPanel::childSetTextArg(const LLString& id, const LLString& key, const LLS  	return FALSE;  } -BOOL LLPanel::childSetLabelArg(const LLString& id, const LLString& key, const LLString& text) +BOOL LLPanel::childSetLabelArg(const LLString& id, const LLString& key, const LLStringExplicit& text)  {  	LLView* child = getChildByName(id, true);  	if (child) @@ -1033,7 +1033,7 @@ void LLPanel::childSetTabChangeCallback(const LLString& id, const LLString& tabn  	}  } -void LLPanel::childSetText(const LLString& id, const LLString& text) +void LLPanel::childSetText(const LLString& id, const LLStringExplicit& text)  {  	childSetValue(id, LLSD(text));  } @@ -1106,7 +1106,7 @@ void LLPanel::childSetControlName(const LLString& id, const LLString& control_na  LLView* LLPanel::getChildByName(const LLString& name, BOOL recurse) const  {  	LLView* view = LLUICtrl::getChildByName(name, recurse); -	if (!view) +	if (!view && !recurse)  	{  		childNotFound(name);  	} diff --git a/indra/llui/llpanel.h b/indra/llui/llpanel.h index 318c278be0..dfd7a51529 100644 --- a/indra/llui/llpanel.h +++ b/indra/llui/llpanel.h @@ -119,7 +119,7 @@ public:  	void			setBackgroundOpaque(BOOL b)		{ mBgOpaque = b; }  	void			setDefaultBtn(LLButton* btn = NULL);  	void			setDefaultBtn(const LLString& id); -	void			setLabel(LLString label) { mLabel = label; } +	void			setLabel(const LLStringExplicit& label) { mLabel = label; }  	LLString		getLabel() const { return mLabel; }  	void            setRectControl(const LLString& rect_control) { mRectControl.assign(rect_control); } @@ -192,8 +192,8 @@ public:  	// For setting text / label replacement params, e.g. "Hello [NAME]"  	// Not implemented for all types, defaults to noop, returns FALSE if not applicaple -	BOOL childSetTextArg(const LLString& id, const LLString& key, const LLString& text); -	BOOL childSetLabelArg(const LLString& id, const LLString& key, const LLString& text); +	BOOL childSetTextArg(const LLString& id, const LLString& key, const LLStringExplicit& text); +	BOOL childSetLabelArg(const LLString& id, const LLString& key, const LLStringExplicit& text);  	// LLSlider / LLSpinCtrl  	void childSetMinValue(const LLString& id, LLSD min_value); @@ -208,7 +208,7 @@ public:  	void childSetWrappedText(const LLString& id, const LLString& text, bool visible = true);  	// LLTextBox/LLTextEditor/LLLineEditor -	void childSetText(const LLString& id, const LLString& text); +	void childSetText(const LLString& id, const LLStringExplicit& text);  	LLString childGetText(const LLString& id);  	// LLLineEditor diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp index 048cfa7e9d..f5eef29dcb 100644 --- a/indra/llui/llscrolllistctrl.cpp +++ b/indra/llui/llscrolllistctrl.cpp @@ -232,7 +232,7 @@ void LLScrollListText::setColor(const LLColor4& color)  	*mColor = color;  } -void LLScrollListText::setText(const LLString& text) +void LLScrollListText::setText(const LLStringExplicit& text)  {  	mText = text;  } diff --git a/indra/llui/llscrolllistctrl.h b/indra/llui/llscrolllistctrl.h index 78f34a2ed2..5ceee2e1f6 100644 --- a/indra/llui/llscrolllistctrl.h +++ b/indra/llui/llscrolllistctrl.h @@ -101,7 +101,7 @@ public:  	virtual const LLString&		getText() const		{ return mText.getString(); }  	virtual BOOL	getVisible() const  { return mVisible; }  	virtual void	highlightText(S32 offset, S32 num_chars) {mHighlightOffset = offset; mHighlightCount = num_chars;} -	void			setText(const LLString& text); +	void			setText(const LLStringExplicit& text);  	virtual void	setColor(const LLColor4&);  	virtual BOOL	isText() { return TRUE; } @@ -169,10 +169,10 @@ class LLScrollListColumn  public:  	// Default constructor  	LLScrollListColumn() :  -		mName(""),  -		mSortingColumn(""),  -        	mSortAscending(TRUE),  -		mLabel(""),  +		mName(),  +		mSortingColumn(),  +		mSortAscending(TRUE),  +		mLabel(),   		mWidth(-1),   		mRelWidth(-1.0),   		mDynamicWidth(FALSE),  diff --git a/indra/llui/llsliderctrl.cpp b/indra/llui/llsliderctrl.cpp index c46ec2252f..dd4a9941c5 100644 --- a/indra/llui/llsliderctrl.cpp +++ b/indra/llui/llsliderctrl.cpp @@ -170,7 +170,7 @@ void LLSliderCtrl::setValue(F32 v, BOOL from_event)  	updateText();  } -BOOL LLSliderCtrl::setLabelArg( const LLString& key, const LLString& text ) +BOOL LLSliderCtrl::setLabelArg( const LLString& key, const LLStringExplicit& text )  {  	BOOL res = FALSE;  	if (mLabelBox) @@ -200,11 +200,11 @@ void LLSliderCtrl::clear()  	setValue(0.0f);  	if( mEditor )  	{ -		mEditor->setText( "" ); +		mEditor->setText( LLString::null );  	}  	if( mTextBox )  	{ -		mTextBox->setText( "" ); +		mTextBox->setText( LLString::null );  	}  } diff --git a/indra/llui/llsliderctrl.h b/indra/llui/llsliderctrl.h index d5485e6a63..fa6c0bccae 100644 --- a/indra/llui/llsliderctrl.h +++ b/indra/llui/llsliderctrl.h @@ -80,7 +80,7 @@ public:  	virtual void	setValue(const LLSD& value )	{ setValue((F32)value.asReal(), TRUE); }  	virtual LLSD	getValue() const		{ return LLSD(getValueF32()); } -	virtual BOOL	setLabelArg( const LLString& key, const LLString& text ); +	virtual BOOL	setLabelArg( const LLString& key, const LLStringExplicit& text );  	virtual void	setMinValue(LLSD min_value)	{ setMinValue((F32)min_value.asReal()); }  	virtual void	setMaxValue(LLSD max_value)	{ setMaxValue((F32)max_value.asReal());  } @@ -97,7 +97,7 @@ public:  	F32				getMinValue() { return mSlider->getMinValue(); }  	F32				getMaxValue() { return mSlider->getMaxValue(); } -	void			setLabel(const LLString& label)				{ if (mLabelBox) mLabelBox->setText(label); } +	void			setLabel(const LLStringExplicit& label)				{ if (mLabelBox) mLabelBox->setText(label); }  	void			setLabelColor(const LLColor4& c)			{ mTextEnabledColor = c; }  	void			setDisabledLabelColor(const LLColor4& c)	{ mTextDisabledColor = c; } diff --git a/indra/llui/llspinctrl.cpp b/indra/llui/llspinctrl.cpp index 4e7218e141..2be2814080 100644 --- a/indra/llui/llspinctrl.cpp +++ b/indra/llui/llspinctrl.cpp @@ -385,7 +385,7 @@ void LLSpinCtrl::setPrecision(S32 precision)  	updateEditor();  } -void LLSpinCtrl::setLabel(const LLString& label) +void LLSpinCtrl::setLabel(const LLStringExplicit& label)  {  	if (mLabelBox)  	{ diff --git a/indra/llui/llspinctrl.h b/indra/llui/llspinctrl.h index 7795e26719..f2c7b40cfe 100644 --- a/indra/llui/llspinctrl.h +++ b/indra/llui/llspinctrl.h @@ -96,7 +96,7 @@ public:  	virtual void	setMaxValue(F32 max)			{ mMaxValue = max; }  	virtual void	setIncrement(F32 inc)			{ mIncrement = inc; } -	void			setLabel(const LLString& label); +	void			setLabel(const LLStringExplicit& label);  	void			setLabelColor(const LLColor4& c)			{ mTextEnabledColor = c; }  	void			setDisabledLabelColor(const LLColor4& c)	{ mTextDisabledColor = c; } diff --git a/indra/llui/lltextbox.cpp b/indra/llui/lltextbox.cpp index 4251f81322..c0b0788c0b 100644 --- a/indra/llui/lltextbox.cpp +++ b/indra/llui/lltextbox.cpp @@ -161,7 +161,7 @@ BOOL LLTextBox::handleMouseUp(S32 x, S32 y, MASK mask)  	return handled;  } -void LLTextBox::setText(const LLString& text) +void LLTextBox::setText(const LLStringExplicit& text)  {  	mText.assign(text);  	setLineLengths(); @@ -194,7 +194,7 @@ void LLTextBox::setLineLengths()  	}  } -void LLTextBox::setWrappedText(const LLString& in_text, F32 max_width) +void LLTextBox::setWrappedText(const LLStringExplicit& in_text, F32 max_width)  {  	if (max_width < 0.0)  	{ @@ -286,7 +286,7 @@ LLSD LLTextBox::getValue() const  	return LLSD(getText());  } -BOOL LLTextBox::setTextArg( const LLString& key, const LLString& text ) +BOOL LLTextBox::setTextArg( const LLString& key, const LLStringExplicit& text )  {  	mText.setArg(key, text);  	setLineLengths(); diff --git a/indra/llui/lltextbox.h b/indra/llui/lltextbox.h index 24ad4d7aae..7e7018ac52 100644 --- a/indra/llui/lltextbox.h +++ b/indra/llui/lltextbox.h @@ -71,8 +71,8 @@ public:  	void			setDisabledColor( const LLColor4& c)	{ mDisabledColor = c; }  	void			setBackgroundColor( const LLColor4& c)	{ mBackgroundColor = c; }	  	void			setBorderColor( const LLColor4& c)		{ mBorderColor = c; }	 -	void			setText( const LLString& text ); -	void			setWrappedText(const LLString& text, F32 max_width = -1.0); +	void			setText( const LLStringExplicit& text ); +	void			setWrappedText(const LLStringExplicit& text, F32 max_width = -1.0);  						// default width means use existing control width  	void			setBackgroundVisible(BOOL visible)		{ mBackgroundVisible = visible; } @@ -97,7 +97,7 @@ public:  	virtual void	setValue(const LLSD& value );  	virtual LLSD	getValue() const; -	virtual BOOL	setTextArg( const LLString& key, const LLString& text ); +	virtual BOOL	setTextArg( const LLString& key, const LLStringExplicit& text );  protected:  	void			setLineLengths(); diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index cede015016..12ad339886 100644 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -520,7 +520,7 @@ void LLTextEditor::truncate()  	}  } -void LLTextEditor::setText(const LLString &utf8str) +void LLTextEditor::setText(const LLStringExplicit &utf8str)  {  	// LLString::removeCRLF(utf8str);  	mUTF8Text = utf8str_removeCRLF(utf8str); @@ -3068,7 +3068,7 @@ void LLTextEditor::onTabInto()  void LLTextEditor::clear()  { -	setText(""); +	setText(LLString::null);  }  // Start or stop the editor from accepting text-editing keystrokes @@ -3949,7 +3949,7 @@ BOOL LLTextEditor::importBuffer(const LLString& buffer )  	if( success )  	{  		// Actually set the text -		setText( text ); +		setText( LLStringExplicit(text) );  	}  	delete[] text; diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h index f3d03ab1d6..55aba57551 100644 --- a/indra/llui/lltexteditor.h +++ b/indra/llui/lltexteditor.h @@ -231,7 +231,7 @@ public:   	const LLString&	getText() const;  	// Non-undoable -	void			setText(const LLString &utf8str); +	void			setText(const LLStringExplicit &utf8str);  	void			setWText(const LLWString &wtext);  	S32				getMaxLength() const 			{ return mMaxTextLength; } diff --git a/indra/llui/lluictrl.cpp b/indra/llui/lluictrl.cpp index ea1b53502e..7d354753d3 100644 --- a/indra/llui/lluictrl.cpp +++ b/indra/llui/lluictrl.cpp @@ -99,13 +99,13 @@ void LLUICtrl::onCommit()  }  // virtual -BOOL LLUICtrl::setTextArg( const LLString& key, const LLString& text )  +BOOL LLUICtrl::setTextArg( const LLString& key, const LLStringExplicit& text )   {   	return FALSE;   }  // virtual -BOOL LLUICtrl::setLabelArg( const LLString& key, const LLString& text )  +BOOL LLUICtrl::setLabelArg( const LLString& key, const LLStringExplicit& text )   {   	return FALSE;   } diff --git a/indra/llui/lluictrl.h b/indra/llui/lluictrl.h index 0227157636..00f78748a7 100644 --- a/indra/llui/lluictrl.h +++ b/indra/llui/lluictrl.h @@ -72,10 +72,10 @@ public:  	virtual LLSD	getValue() const { return LLSD(); }  	// Defaults to no-op -	virtual BOOL	setTextArg( const LLString& key, const LLString& text ); +	virtual BOOL	setTextArg( const LLString& key, const LLStringExplicit& text );  	// Defaults to no-op -	virtual BOOL	setLabelArg( const LLString& key, const LLString& text ); +	virtual BOOL	setLabelArg( const LLString& key, const LLStringExplicit& text );  	// Defaults to return NULL  	virtual LLCtrlSelectionInterface* getSelectionInterface(); diff --git a/indra/llui/lluictrlfactory.cpp b/indra/llui/lluictrlfactory.cpp index 503b83bca2..4b4c4636d5 100644 --- a/indra/llui/lluictrlfactory.cpp +++ b/indra/llui/lluictrlfactory.cpp @@ -473,7 +473,7 @@ LLPieMenu *LLUICtrlFactory::buildPieMenu(const LLString &filename, LLView* paren  	// root must be called panel  	if( !root->hasName( LL_PIE_MENU_TAG ))  	{ -		llwarns << "Root node should be named " LL_PIE_MENU_TAG " in : " << filename << llendl; +		llwarns << "Root node should be named " << LL_PIE_MENU_TAG << " in : " << filename << llendl;  		return NULL;  	} @@ -808,3 +808,4 @@ void LLUICtrlFactory::registerCreator(LLString ctrlname, creator_function_t func  	mCreatorFunctions[ctrlname] = function;  } + diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp index 192ba1f1ab..ef91d9c85e 100644 --- a/indra/llui/llview.cpp +++ b/indra/llui/llview.cpp @@ -786,7 +786,7 @@ void LLView::setHidden(BOOL hidden)  }  // virtual -BOOL LLView::setLabelArg(const LLString& key, const LLString& text) +BOOL LLView::setLabelArg(const LLString& key, const LLStringExplicit& text)  {  	return FALSE;  } @@ -1712,7 +1712,8 @@ BOOL LLView::hasChild(const LLString& childname, BOOL recurse) const  //-----------------------------------------------------------------------------  LLView* LLView::getChildByName(const LLString& name, BOOL recurse) const  { -	if(name.empty()) return NULL; +	if(name.empty()) +		return NULL;  	child_list_const_iter_t child_it;  	// Look for direct children *first*  	for ( child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it) @@ -1725,7 +1726,7 @@ LLView* LLView::getChildByName(const LLString& name, BOOL recurse) const  	}  	if (recurse)  	{ -		// Look inside the child as well. +		// Look inside each child as well.  		for ( child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)  		{  			LLView* childp = *child_it; diff --git a/indra/llui/llview.h b/indra/llui/llview.h index 91351612db..63c1efc296 100644 --- a/indra/llui/llview.h +++ b/indra/llui/llview.h @@ -290,7 +290,7 @@ public:  	virtual void	setHidden(BOOL hidden);		// Never show (replacement text)  	// by default, does nothing and returns false -	virtual BOOL	setLabelArg( const LLString& key, const LLString& text ); +	virtual BOOL	setLabelArg( const LLString& key, const LLStringExplicit& text );  	virtual void	onVisibilityChange ( BOOL curVisibilityIn ); diff --git a/indra/llxml/llxmlnode.h b/indra/llxml/llxmlnode.h index 51837ebf14..7c221574ac 100644 --- a/indra/llxml/llxmlnode.h +++ b/indra/llxml/llxmlnode.h @@ -132,8 +132,8 @@ public:  	LLXMLNodePtr& node,  	LLXMLNodePtr& update_node);  	static void writeHeaderToFile(FILE *fOut); -    void writeToFile(FILE *fOut, LLString indent = ""); -    void writeToOstream(std::ostream& output_stream, const LLString& indent = ""); +    void writeToFile(FILE *fOut, LLString indent = LLString()); +    void writeToOstream(std::ostream& output_stream, const LLString& indent = LLString());      // Utility      void findName(const LLString& name, LLXMLNodeList &results); diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 1a20d8da20..d825704bfc 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -2038,7 +2038,8 @@ void LLAgent::setAFK()  		gAwayTimer.start();  		if (gAFKMenu)  		{ -			gAFKMenu->setLabel("Set Not Away"); +			//*TODO:Translate +			gAFKMenu->setLabel(LLString("Set Not Away"));  		}  	}  } @@ -2061,7 +2062,8 @@ void LLAgent::clearAFK()  		clearControlFlags(AGENT_CONTROL_AWAY);  		if (gAFKMenu)  		{ -			gAFKMenu->setLabel("Set Away"); +			//*TODO:Translate +			gAFKMenu->setLabel(LLString("Set Away"));  		}  	}  } @@ -2083,7 +2085,8 @@ void LLAgent::setBusy()  	mIsBusy = TRUE;  	if (gBusyMenu)  	{ -		gBusyMenu->setLabel("Set Not Busy"); +		//*TODO:Translate +		gBusyMenu->setLabel(LLString("Set Not Busy"));  	}  	if (gFloaterMute)  	{ @@ -2100,7 +2103,8 @@ void LLAgent::clearBusy()  	sendAnimationRequest(ANIM_AGENT_BUSY, ANIM_REQUEST_STOP);  	if (gBusyMenu)  	{ -		gBusyMenu->setLabel("Set Busy"); +		//*TODO:Translate +		gBusyMenu->setLabel(LLString("Set Busy"));  	}  	if (gFloaterMute)  	{ @@ -4888,7 +4892,7 @@ void LLAgent::buildLocationString(std::string& str)  	// create a defult name and description for the landmark  	std::string buffer; -	if( !strcmp("", gParcelMgr->getAgentParcelName()) ) +	if( gParcelMgr->getAgentParcelName().empty() )  	{  		// the parcel doesn't have a name  		buffer = llformat("%.32s (%d, %d, %d)", @@ -4899,7 +4903,7 @@ void LLAgent::buildLocationString(std::string& str)  	{  		// the parcel has a name, so include it in the landmark name  		buffer = llformat("%.32s, %.32s (%d, %d, %d)", -						  gParcelMgr->getAgentParcelName(), +						  gParcelMgr->getAgentParcelName().c_str(),  						  getRegion()->getName().c_str(),  						  pos_x, pos_y, pos_z);  	} diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h index 991a55b796..5b6c3c0a1d 100644 --- a/indra/newview/llagent.h +++ b/indra/newview/llagent.h @@ -422,7 +422,7 @@ public:  	void			propagate(const F32 dt);									// BUG: should roll into updateAgentPosition -	void			startAutoPilotGlobal(const LLVector3d &pos_global, const std::string& behavior_name = "", const LLQuaternion *target_rotation = NULL,  +	void			startAutoPilotGlobal(const LLVector3d &pos_global, const std::string& behavior_name = std::string(), const LLQuaternion *target_rotation = NULL,   									void (*finish_callback)(BOOL, void *) = NULL, void *callback_data = NULL, F32 stop_distance = 0.f, F32 rotation_threshold = 0.03f);  	void 			startFollowPilot(const LLUUID &leader_id); diff --git a/indra/newview/llcallingcard.cpp b/indra/newview/llcallingcard.cpp index c876a24aa8..b80c2bb5e3 100644 --- a/indra/newview/llcallingcard.cpp +++ b/indra/newview/llcallingcard.cpp @@ -681,7 +681,6 @@ void LLAvatarTracker::processNotify(LLMessageSystem* msg, bool online)  	}  } -// XUI:translate  void LLAvatarTracker::formFriendship(const LLUUID& id)  {  	if(id.notNull()) @@ -849,3 +848,4 @@ bool LLCollectAllBuddies::operator()(const LLUUID& buddy_id, LLRelationship* bud  	return true;  } + diff --git a/indra/newview/llcompilequeue.cpp b/indra/newview/llcompilequeue.cpp index 33109ad5ce..cebd51d4da 100644 --- a/indra/newview/llcompilequeue.cpp +++ b/indra/newview/llcompilequeue.cpp @@ -59,13 +59,11 @@  #include "llviewerstats.h"  #include "llvieweruictrlfactory.h" -// XUI:translate -  ///----------------------------------------------------------------------------  /// Local function declarations, constants, enums, and typedefs  ///---------------------------------------------------------------------------- -// XUI:translate +// *TODO:Translate  const char* COMPILE_QUEUE_TITLE = "Recompilation Progress";  const char* COMPILE_START_STRING = "recompile";  const char* RESET_QUEUE_TITLE = "Reset Progress"; diff --git a/indra/newview/llcurrencyuimanager.cpp b/indra/newview/llcurrencyuimanager.cpp index 6f649acb29..1e97df0b8b 100644 --- a/indra/newview/llcurrencyuimanager.cpp +++ b/indra/newview/llcurrencyuimanager.cpp @@ -380,7 +380,7 @@ void LLCurrencyUIManager::Impl::updateUI()  		{  			if (!mZeroMessage.empty() && mUserCurrencyBuy == 0)  			{ -				lindenAmount->setText(""); +				lindenAmount->setText(LLString::null);  			}  			else  			{ @@ -459,20 +459,20 @@ bool LLCurrencyUIManager::process()  	return changed;  } -void LLCurrencyUIManager::buy() +void LLCurrencyUIManager::buy(const LLString& buy_msg)  {  	if (!canBuy())  	{  		return;  	} -	// XUI:translate +	LLUIString msg = buy_msg; +	msg.setArg("[LINDENS]", llformat("%d", impl.mUserCurrencyBuy)); +	msg.setArg("[USD]", llformat("%#.2f", impl.mSiteCurrencyEstimatedCost / 100.0));  	LLConfirmationManager::confirm(impl.mSiteConfirm, -		llformat("Buy L$ %d for approx. US$ %#.2f\n", -			impl.mUserCurrencyBuy, -			impl.mSiteCurrencyEstimatedCost / 100.0), -		impl, -		&LLCurrencyUIManager::Impl::startCurrencyBuy); +								   msg, +								   impl, +								   &LLCurrencyUIManager::Impl::startCurrencyBuy);  } @@ -518,3 +518,4 @@ std::string LLCurrencyUIManager::errorURI()  	return impl.mErrorURI;  } + diff --git a/indra/newview/llcurrencyuimanager.h b/indra/newview/llcurrencyuimanager.h index 7a3a8b7060..bb135d0189 100644 --- a/indra/newview/llcurrencyuimanager.h +++ b/indra/newview/llcurrencyuimanager.h @@ -71,7 +71,7 @@ public:  		// call periodically, for example, from draw()  		// returns true if the UI needs to be updated -	void buy(); +	void buy(const LLString& buy_msg);  		// call to initiate the purchase  	bool inProcess();	// is a transaction in process @@ -93,3 +93,4 @@ private:  #endif  + diff --git a/indra/newview/lldebugmessagebox.cpp b/indra/newview/lldebugmessagebox.cpp index a66aef86fd..de185e280d 100644 --- a/indra/newview/lldebugmessagebox.cpp +++ b/indra/newview/lldebugmessagebox.cpp @@ -218,22 +218,22 @@ void LLDebugVarMessageBox::onClose(bool app_quitting)  void LLDebugVarMessageBox::draw()  { -	char text[128];	 /*Flawfinder: ignore*/ +	LLString text;  	switch(mVarType)  	{ -	case VAR_TYPE_F32: -		snprintf(text, sizeof(text), "%.3f", *((F32*)mVarData));		 	/* Flawfinder: ignore */ +	  case VAR_TYPE_F32: +		text = llformat("%.3f", *((F32*)mVarData));  		break; -	case VAR_TYPE_S32: -		snprintf(text, sizeof(text), "%d", *((S32*)mVarData)); 		 	/* Flawfinder: ignore */ +	  case VAR_TYPE_S32: +		text = llformat("%d", *((S32*)mVarData));  		break; -	case VAR_TYPE_VEC3: -	{ -		LLVector3* vec_p = (LLVector3*)mVarData; -		snprintf(text, sizeof(text), "%.3f %.3f %.3f", vec_p->mV[VX], vec_p->mV[VY], vec_p->mV[VZ]);	 	/* Flawfinder: ignore */ -		break; -	} -	default: +	  case VAR_TYPE_VEC3: +	  { +		  LLVector3* vec_p = (LLVector3*)mVarData; +		  text= llformat("%.3f %.3f %.3f", vec_p->mV[VX], vec_p->mV[VY], vec_p->mV[VZ]); +		  break; +	  } +	  default:  		llwarns << "Unhandled var type " << mVarType << llendl;  		break;  	} diff --git a/indra/newview/lldrawpoolbump.h b/indra/newview/lldrawpoolbump.h index 45b554905f..15d84639fe 100644 --- a/indra/newview/lldrawpoolbump.h +++ b/indra/newview/lldrawpoolbump.h @@ -90,7 +90,7 @@ enum EBumpEffect  class LLStandardBumpmap  {  public:  -	LLStandardBumpmap() : mLabel("") {}  +	LLStandardBumpmap() : mLabel() {}   	LLStandardBumpmap( const char* label ) : mLabel(label) {}  	LLString	mLabel; diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp index d6f00f8110..460b719094 100644 --- a/indra/newview/llfloaterabout.cpp +++ b/indra/newview/llfloaterabout.cpp @@ -96,10 +96,10 @@ LLFloaterAbout::LLFloaterAbout()  	LLViewerRegion* region = gAgent.getRegion();  	if (region)  	{ -		//XUI:translate  		const LLVector3d &pos = gAgent.getPositionGlobal(); -		LLString pos_text = llformat("You are at %.1f, %.1f, %.1f ",  -			pos.mdV[VX], pos.mdV[VY], pos.mdV[VZ]); +		LLUIString pos_text = childGetText("you_are_at"); +		pos_text.setArg("[POSITION]", +						llformat("%.1f, %.1f, %.1f ", pos.mdV[VX], pos.mdV[VY], pos.mdV[VZ]));  		support.append(pos_text);  		LLString region_text = llformat("in %s located at ", @@ -117,6 +117,10 @@ LLFloaterAbout::LLFloaterAbout()  		support.append("\n\n");  	} +	//*NOTE: Do not translate text like GPU, Graphics Card, etc - +	//  Most PC users that know what these mean will be used to the english versions, +	//  and this info sometimes gets sent to support +	  	// CPU  	support.append("CPU: ");  	support.append( gSysCPU.getCPUString() ); diff --git a/indra/newview/llfloateranimpreview.cpp b/indra/newview/llfloateranimpreview.cpp index 1d89a07c43..71c221775e 100644 --- a/indra/newview/llfloateranimpreview.cpp +++ b/indra/newview/llfloateranimpreview.cpp @@ -294,8 +294,7 @@ BOOL LLFloaterAnimPreview::postBuild()  			delete mAnimPreview;  			mAnimPreview = NULL;  			mMotionID.setNull(); -			// XUI:translate -			childSetValue("bad_animation_text", LLSD("Failed to initialize motion.")); +			childSetValue("bad_animation_text", childGetText("failed_to_initialize"));  			mEnabled = FALSE;  		}  	} @@ -305,18 +304,16 @@ BOOL LLFloaterAnimPreview::postBuild()  		{  			if (loaderp->getDuration() > MAX_ANIM_DURATION)  			{ -				char output_str[256];	/*Flawfinder: ignore*/ - -				snprintf(output_str, sizeof(output_str), "Animation file is %.1f seconds in length.\n\nMaximum animation length is %.1f seconds.\n",	/* Flawfinder: ignore */ -					loaderp->getDuration(), MAX_ANIM_DURATION); -				childSetValue("bad_animation_text", LLSD(output_str)); +				LLUIString out_str = childGetText("anim_too_long"); +				out_str.setArg("[LENGTH]", llformat("%.1f", loaderp->getDuration())); +				out_str.setArg("[MAX_LENGTH]", llformat("%.1f", MAX_ANIM_DURATION)); +				childSetValue("bad_animation_text", out_str.getString());  			}  			else  			{ -				char* status = loaderp->getStatus(); -				LLString error_string("Unable to read animation file.\n\n"); -				error_string += LLString(status); -				childSetValue("bad_animation_text", LLSD(error_string)); +				LLUIString out_str = childGetText("failed_file_read"); +				out_str.setArg("[STATUS]", loaderp->getStatus()); // *TODO:Translate +				childSetValue("bad_animation_text", out_str.getString());  			}  		} @@ -1158,3 +1155,4 @@ void LLPreviewAnimation::pan(F32 right, F32 up)  	mCameraOffset.mV[VZ] = llclamp(mCameraOffset.mV[VZ] + up * mCameraDistance / mCameraZoom, -1.f, 1.f);  } + diff --git a/indra/newview/llfloaterauction.cpp b/indra/newview/llfloaterauction.cpp index 44ebe0c98b..bc00565a28 100644 --- a/indra/newview/llfloaterauction.cpp +++ b/indra/newview/llfloaterauction.cpp @@ -126,7 +126,7 @@ void LLFloaterAuction::initialize()  		}  		else  		{ -			childSetText("parcel_text", ""); +			childSetText("parcel_text", LLString::null);  		}  		mParcelID = -1;  		childSetEnabled("snapshot_btn", false); diff --git a/indra/newview/llfloaterbuy.cpp b/indra/newview/llfloaterbuy.cpp index 7767a37ccb..707ec0e852 100644 --- a/indra/newview/llfloaterbuy.cpp +++ b/indra/newview/llfloaterbuy.cpp @@ -113,21 +113,23 @@ void LLFloaterBuy::show(const LLSaleInfo& sale_info)  	sInstance->center();  	LLSelectNode* node = selection->getFirstRootNode(); -	if (!node) return; +	if (!node) +		return;  	// Set title based on sale type -	std::ostringstream title; +	LLUIString title;  	switch (sale_info.getSaleType())  	{ -	case LLSaleInfo::FS_ORIGINAL: -		title << "Buy " << node->mName; // XUI:translate +	  case LLSaleInfo::FS_ORIGINAL: +		title = sInstance->childGetText("title_buy_text");  		break; -	case LLSaleInfo::FS_COPY: -	default: -		title << "Buy Copy of " << node->mName; // XUI:translate +	  case LLSaleInfo::FS_COPY: +	  default: +		title = sInstance->childGetText("title_buy_copy_text");  		break;  	} -	sInstance->setTitle(title.str()); +	title.setArg("[NAME]", node->mName); +	sInstance->setTitle(title);  	LLUUID owner_id;  	LLString owner_name; @@ -163,15 +165,15 @@ void LLFloaterBuy::show(const LLSaleInfo& sale_info)  	LLString text = node->mName;  	if (!(next_owner_mask & PERM_COPY))  	{ -		text.append(" (no copy)");	// XUI:translate +		text.append(sInstance->childGetText("no_copy_text"));  	}  	if (!(next_owner_mask & PERM_MODIFY))  	{ -		text.append(" (no modify)");	// XUI:translate +		text.append(sInstance->childGetText("no_modify_text"));  	}  	if (!(next_owner_mask & PERM_TRANSFER))  	{ -		text.append(" (no transfer)");	// XUI:translate +		text.append(sInstance->childGetText("no_transfer_text"));  	}  	row["columns"][1]["column"] = "text"; diff --git a/indra/newview/llfloaterbuycontents.cpp b/indra/newview/llfloaterbuycontents.cpp index b99b2bac1e..38266797cf 100644 --- a/indra/newview/llfloaterbuycontents.cpp +++ b/indra/newview/llfloaterbuycontents.cpp @@ -238,20 +238,19 @@ void LLFloaterBuyContents::inventoryChanged(LLViewerObject* obj,  		U32 next_owner_mask = inv_item->getPermissions().getMaskNextOwner();  		LLString text = (*it)->getName(); -		// *TODO: Move into shared library function.  		if (!(next_owner_mask & PERM_COPY))  		{ -			text.append(" (no copy)");	// XUI:translate +			text.append(childGetText("no_copy_text"));  		}  		if (!(next_owner_mask & PERM_MODIFY))  		{ -			text.append(" (no modify)");	// XUI:translate +			text.append(childGetText("no_modify_text"));  		}  		if (!(next_owner_mask & PERM_TRANSFER))  		{ -			text.append(" (no transfer)");	// XUI:translate +			text.append(childGetText("no_transfer_text"));  		} - +		  		row["columns"][1]["column"] = "text";  		row["columns"][1]["value"] = text;  		row["columns"][1]["font"] = "SANSSERIF"; diff --git a/indra/newview/llfloaterbuycurrency.cpp b/indra/newview/llfloaterbuycurrency.cpp index 2da9c95a19..a7233c310a 100644 --- a/indra/newview/llfloaterbuycurrency.cpp +++ b/indra/newview/llfloaterbuycurrency.cpp @@ -316,7 +316,7 @@ void LLFloaterBuyCurrencyUI::onClickBuy(void* data)  	LLFloaterBuyCurrencyUI* self = LLFloaterBuyCurrencyUI::soleInstance(false);  	if (self)  	{ -		self->mManager.buy(); +		self->mManager.buy(self->childGetText("buy_currency"));  		self->updateUI();  		// JC: updateUI() doesn't get called again until progress is made  		// with transaction processing, so the "Purchase" button would be @@ -377,3 +377,4 @@ void LLFloaterBuyCurrency::buyCurrency(const std::string& name, S32 price)  	ui->open();  } + diff --git a/indra/newview/llfloaterbuyland.cpp b/indra/newview/llfloaterbuyland.cpp index c6bb53aed7..9ae634c76f 100644 --- a/indra/newview/llfloaterbuyland.cpp +++ b/indra/newview/llfloaterbuyland.cpp @@ -1022,9 +1022,9 @@ void LLFloaterBuyLandUI::refreshUI()  		}  		else  		{ -			childSetText("info_parcel", "(no parcel selected)"); -			childSetText("info_size", ""); -			childSetText("info_price", ""); +			childSetText("info_parcel", childGetText("no_parcel_selected")); +			childSetText("info_size", LLString::null); +			childSetText("info_price", LLString::null);  		}  		childSetText("info_action", @@ -1127,7 +1127,7 @@ void LLFloaterBuyLandUI::refreshUI()  		if (mIsForGroup)  		{ -			childSetTextArg("insufficient_land_credits", "[GROUP]", gAgent.mGroupName); +			childSetTextArg("insufficient_land_credits", "[GROUP]", LLString(gAgent.mGroupName));  			message += childGetText("insufficient_land_credits"); @@ -1306,7 +1306,7 @@ void LLFloaterBuyLandUI::startBuyPreConfirm()  	}  	childSetTextArg("pay_to_for_land", "[AMOUNT]", llformat("%d", mParcelPrice)); -	childSetTextArg("pay_to_for_land", "[SELLER]", mParcelSellerName.c_str()); +	childSetTextArg("pay_to_for_land", "[SELLER]", mParcelSellerName);  	action += childGetText("pay_to_for_land"); @@ -1349,3 +1349,4 @@ void LLFloaterBuyLandUI::onClickErrorWeb(void* data)  	self->close();  } + diff --git a/indra/newview/llfloatercolorpicker.cpp b/indra/newview/llfloatercolorpicker.cpp index bdb927cac7..03e3a2e967 100644 --- a/indra/newview/llfloatercolorpicker.cpp +++ b/indra/newview/llfloatercolorpicker.cpp @@ -83,6 +83,7 @@ LLFloaterColorPicker (LLColorSwatchCtrl* swatch, BOOL show_apply_immediate )  	  mMouseDownInLumRegion	( FALSE ),  	  mMouseDownInHueRegion	( FALSE ),  	  mMouseDownInSwatch	( FALSE ), +	  // *TODO: Specify this in XML  	  mRGBViewerImageLeft	( 140 ),  	  mRGBViewerImageTop	( 356 ),  	  mRGBViewerImageWidth	( 256 ), @@ -92,17 +93,19 @@ LLFloaterColorPicker (LLColorSwatchCtrl* swatch, BOOL show_apply_immediate )  	  mLumRegionWidth		( 16 ),  	  mLumRegionHeight		( mRGBViewerImageHeight ),  	  mLumMarkerSize		( 6 ), +	  // *TODO: Specify this in XML  	  mSwatchRegionLeft		( 12 ), -	  mSwatchRegionTop		( 160 + 16 - 4 ),	// get help text baseline to line up with bottom of RGB viewer -	  mSwatchRegionWidth	( 110 ), +	  mSwatchRegionTop		( 190 ), +	  mSwatchRegionWidth	( 116 ),  	  mSwatchRegionHeight	( 60 ),  	  mSwatchView			( NULL ), +	  // *TODO: Specify this in XML  	  numPaletteColumns		( 16 ),  	  numPaletteRows		( 2 ),  	  highlightEntry		( -1 ), -	  mPaletteRegionLeft	( mSwatchRegionLeft - 1 ), +	  mPaletteRegionLeft	( 11 ),  	  mPaletteRegionTop		( 100 - 8 ), -	  mPaletteRegionWidth	( mLumRegionLeft + mLumRegionWidth - mSwatchRegionLeft + 2 ), +	  mPaletteRegionWidth	( mLumRegionLeft + mLumRegionWidth - 10 ),  	  mPaletteRegionHeight	( 40 ),  	  mSwatch				( swatch ),  	  mActive				( TRUE ), diff --git a/indra/newview/llfloaterfriends.cpp b/indra/newview/llfloaterfriends.cpp index 4a614ca8e1..6f792e062f 100644 --- a/indra/newview/llfloaterfriends.cpp +++ b/indra/newview/llfloaterfriends.cpp @@ -422,7 +422,7 @@ void LLPanelFriends::refreshUI()  		single_selected = TRUE;  		if(num_selected > 1)  		{ -			childSetText("friend_name_label", "Multiple friends..."); +			childSetText("friend_name_label", childGetText("Multiple"));  			multiple_selected = TRUE;		  		}  		else @@ -432,7 +432,7 @@ void LLPanelFriends::refreshUI()  	}  	else  	{ -		childSetText("friend_name_label", ""); +		childSetText("friend_name_label", LLString::null);  	} diff --git a/indra/newview/llfloatergodtools.cpp b/indra/newview/llfloatergodtools.cpp index 6a56052e12..27d427115b 100644 --- a/indra/newview/llfloatergodtools.cpp +++ b/indra/newview/llfloatergodtools.cpp @@ -1260,8 +1260,8 @@ void LLPanelObjectTools::onClickSetBySelection(void* data)  	LLPanelObjectTools* panelp = (LLPanelObjectTools*) data;  	if (!panelp) return; -	LLSelectNode* node = gSelectMgr->getSelection()->getFirstRootNode(); -	if (!node) node = gSelectMgr->getSelection()->getFirstNode(); +	const BOOL non_root_ok = TRUE;  +	LLSelectNode* node = gSelectMgr->getSelection()->getFirstRootNode(NULL, non_root_ok);  	if (!node) return;  	LLString owner_name; diff --git a/indra/newview/llfloatergodtools.h b/indra/newview/llfloatergodtools.h index f817a7bda1..53e250f67e 100644 --- a/indra/newview/llfloatergodtools.h +++ b/indra/newview/llfloatergodtools.h @@ -109,8 +109,6 @@ protected:  	LLFloaterGodTools();  	~LLFloaterGodTools(); -	void setStatusText(const std::string& text); -  	// When the floater is going away, reset any options that need to be   	// cleared.  	void resetToolState(); diff --git a/indra/newview/llfloaterinspect.cpp b/indra/newview/llfloaterinspect.cpp index 0f9f60a49a..0ce91ef740 100644 --- a/indra/newview/llfloaterinspect.cpp +++ b/indra/newview/llfloaterinspect.cpp @@ -97,27 +97,28 @@ void LLFloaterInspect::show(void* ignored)  void LLFloaterInspect::onClickCreatorProfile(void* ctrl)  { -	if(sInstance->mObjectList->getAllSelected().size() == 0) return; +	if(sInstance->mObjectList->getAllSelected().size() == 0) +	{ +		return; +	}  	LLScrollListItem* first_selected =  		sInstance->mObjectList->getFirstSelected();  	if (first_selected)  	{ -		LLSelectNode* obj= sInstance->mObjectSelection->getFirstNode(); -		LLUUID obj_id, creator_id; -		obj_id = first_selected->getUUID(); -		while(obj) +		struct f : public LLSelectedNodeFunctor  		{ -			if(obj_id == obj->getObject()->getID()) +			LLUUID obj_id; +			f(const LLUUID& id) : obj_id(id) {} +			virtual bool apply(LLSelectNode* node)  			{ -				creator_id = obj->mPermissions->getCreator(); -				break; +				return (obj_id == node->getObject()->getID());  			} -			obj = sInstance->mObjectSelection->getNextNode(); -		} -		if(obj) +		} func(first_selected->getUUID()); +		LLSelectNode* node = sInstance->mObjectSelection->getFirstNode(&func); +		if(node)  		{ -			LLFloaterAvatarInfo::showFromDirectory(creator_id); +			LLFloaterAvatarInfo::showFromDirectory(node->mPermissions->getCreator());  		}  	}  } @@ -130,20 +131,20 @@ void LLFloaterInspect::onClickOwnerProfile(void* ctrl)  	if (first_selected)  	{ -		LLSelectNode* obj= sInstance->mObjectSelection->getFirstNode(); -		LLUUID obj_id, owner_id; -		obj_id = first_selected->getUUID(); -		while(obj) +		LLUUID selected_id = first_selected->getUUID(); +		struct f : public LLSelectedNodeFunctor  		{ -			if(obj_id == obj->getObject()->getID()) +			LLUUID obj_id; +			f(const LLUUID& id) : obj_id(id) {} +			virtual bool apply(LLSelectNode* node)  			{ -				owner_id = obj->mPermissions->getOwner(); -				break; +				return (obj_id == node->getObject()->getID());  			} -			obj = sInstance->mObjectSelection->getNextNode(); -		} -		if(obj) +		} func(selected_id); +		LLSelectNode* node = sInstance->mObjectSelection->getFirstNode(&func); +		if(node)  		{ +			const LLUUID& owner_id = node->mPermissions->getOwner();  			LLFloaterAvatarInfo::showFromDirectory(owner_id);  		}  	} @@ -204,10 +205,12 @@ void LLFloaterInspect::refresh()  	}  	mObjectList->operateOnAll(LLScrollListCtrl::OP_DELETE);  	//List all transient objects, then all linked objects -	LLSelectNode* obj = mObjectSelection->getFirstNode(); -	LLSD row; -	while(obj) + +	for (LLObjectSelection::iterator iter = mObjectSelection->begin(); +		 iter != mObjectSelection->end(); iter++)  	{ +		LLSelectNode* obj = *iter; +		LLSD row;  		char owner_first_name[MAX_STRING], owner_last_name[MAX_STRING];  		char creator_first_name[MAX_STRING], creator_last_name[MAX_STRING];  		char time[MAX_STRING]; @@ -243,7 +246,6 @@ void LLFloaterInspect::refresh()  		row["columns"][3]["type"] = "text";  		row["columns"][3]["value"] = time;  		mObjectList->addElement(row, ADD_TOP); -		obj = mObjectSelection->getNextNode();  	}  	if(selected_index > -1 && mObjectList->getItemIndex(selected_uuid) == selected_index)  	{ diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 65b93e704a..43c39aa3ea 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -72,43 +72,10 @@  #include "llviewercontrol.h"  #include "roles_constants.h" -static const S32 EDIT_HEIGHT = 16; -static const S32 LEFT = HPAD; -static const S32 BOTTOM = VPAD; -static const S32 RULER0  = LEFT; -static const S32 RULER05 = RULER0 + 24; -static const S32 RULER1  = RULER05 + 16; -static const S32 RULER15 = RULER1 + 20; -static const S32 RULER2  = RULER1 + 32; -static const S32 RULER205= RULER2 + 32; -static const S32 RULER20 = RULER2 + 64; -static const S32 RULER21 = RULER20 + 16; -static const S32 RULER22 = RULER21 + 32; -static const S32 RULER225 = RULER20 + 64; -static const S32 RULER23 = RULER22 + 64; -static const S32 RULER24 = RULER23 + 26; -static const S32 RULER3  = RULER2 + 102; -static const S32 RULER4  = RULER3 + 8; -static const S32 RULER5  = RULER4 + 50; -static const S32 RULER6  = RULER5 + 52; -static const S32 RULER7  = RULER6 + 24; -static const S32 RIGHT  = LEFT + 278; -static const S32 FAR_RIGHT  = LEFT + 324 + 40; - -static const char PRICE[] = "Price:"; -static const char NO_PRICE[] = ""; -static const char AREA[] = "Area:"; -  static const char OWNER_ONLINE[] 	= "0";  static const char OWNER_OFFLINE[]	= "1";  static const char OWNER_GROUP[] 	= "2"; -static const char NEED_TIER_TO_MODIFY_STRING[] = "You must approve your purchase to modify this land."; - -static const char WEB_PAGE[] = "Web page"; -static const char QUICKTIME_MOVIE[] = "QuickTime movie"; -static const char RAW_HTML[] = "Raw HTML"; -  // constants used in callbacks below - syntactic sugar.  static const BOOL BUY_GROUP_LAND = TRUE;  static const BOOL BUY_PERSONAL_LAND = FALSE; @@ -508,12 +475,12 @@ void LLPanelLandGeneral::refresh()  	{  		// nothing selected, disable panel  		mEditName->setEnabled(FALSE); -		mEditName->setText(""); +		mEditName->setText(LLString::null);  		mEditDesc->setEnabled(FALSE); -		mEditDesc->setText(""); +		mEditDesc->setText(LLString::null); -		mTextSalePending->setText(""); +		mTextSalePending->setText(LLString::null);  		mTextSalePending->setEnabled(FALSE);  		mBtnDeedToGroup->setEnabled(FALSE); @@ -525,14 +492,13 @@ void LLPanelLandGeneral::refresh()  		mCheckContributeWithDeed->set(FALSE);  		mCheckContributeWithDeed->setEnabled(FALSE); -		mTextOwner->setText(""); -		mBtnProfile->setLabelSelected("Profile..."); -		mBtnProfile->setLabelUnselected("Profile..."); +		mTextOwner->setText(LLString::null); +		mBtnProfile->setLabel(childGetText("profile_text"));  		mBtnProfile->setEnabled(FALSE); -		mTextClaimDate->setText(""); -		mTextGroup->setText(""); -		mTextPrice->setText(""); +		mTextClaimDate->setText(LLString::null); +		mTextGroup->setText(LLString::null); +		mTextPrice->setText(LLString::null);  		mSaleInfoForSale1->setVisible(FALSE);  		mSaleInfoForSale2->setVisible(FALSE); @@ -542,8 +508,8 @@ void LLPanelLandGeneral::refresh()  		mBtnSellLand->setVisible(FALSE);  		mBtnStopSellLand->setVisible(FALSE); -		mTextPriceLabel->setText(NO_PRICE); -		mTextDwell->setText(""); +		mTextPriceLabel->setText(LLString::null); +		mTextDwell->setText(LLString::null);  		mBtnBuyLand->setEnabled(FALSE);  		mBtnBuyGroupLand->setEnabled(FALSE); @@ -579,14 +545,14 @@ void LLPanelLandGeneral::refresh()  		// Is it owned?  		if (is_public)  		{ -			mTextSalePending->setText(""); +			mTextSalePending->setText(LLString::null);  			mTextSalePending->setEnabled(FALSE); -			mTextOwner->setText("(public)"); +			mTextOwner->setText(childGetText("public_text"));  			mTextOwner->setEnabled(FALSE);  			mBtnProfile->setEnabled(FALSE); -			mTextClaimDate->setText(""); +			mTextClaimDate->setText(LLString::null);  			mTextClaimDate->setEnabled(FALSE); -			mTextGroup->setText("(none)"); +			mTextGroup->setText(childGetText("none_text"));  			mTextGroup->setEnabled(FALSE);  			mBtnStartAuction->setEnabled(FALSE);  		} @@ -594,20 +560,19 @@ void LLPanelLandGeneral::refresh()  		{  			if(!is_leased && (owner_id == gAgent.getID()))  			{ -				mTextSalePending->setText(NEED_TIER_TO_MODIFY_STRING); +				mTextSalePending->setText(childGetText("need_tier_to_modify"));  				mTextSalePending->setEnabled(TRUE);  			}  			else if(parcel->getAuctionID())  			{ -				char auction_str[MAX_STRING];		/*Flawfinder: ignore*/ -				snprintf(auction_str, sizeof(auction_str), "Auction ID: %u", parcel->getAuctionID());		/* Flawfinder: ignore */ -				mTextSalePending->setText(auction_str); +				mTextSalePending->setText(childGetText("auction_id_text")); +				mTextSalePending->setTextArg("[ID]", llformat("%u", parcel->getAuctionID()));  				mTextSalePending->setEnabled(TRUE);  			}  			else  			{  				// not the owner, or it is leased -				mTextSalePending->setText(""); +				mTextSalePending->setText(LLString::null);  				mTextSalePending->setEnabled(FALSE);  			}  			//refreshNames(); @@ -619,26 +584,25 @@ void LLPanelLandGeneral::refresh()  			if (parcel->getGroupID().isNull())  			{  				// Not group owned, so "Profile" -				mBtnProfile->setLabelSelected("Profile..."); -				mBtnProfile->setLabelUnselected("Profile..."); +				mBtnProfile->setLabel(childGetText("profile_text")); -				mTextGroup->setText("(none)"); +				mTextGroup->setText(childGetText("none_text"));  				mTextGroup->setEnabled(FALSE);  			}  			else  			{  				// Group owned, so "Info" -				mBtnProfile->setLabelSelected("Info..."); -				mBtnProfile->setLabelUnselected("Info..."); +				mBtnProfile->setLabel(childGetText("info_text"));  				//mTextGroup->setText("HIPPOS!");//parcel->getGroupName());  				mTextGroup->setEnabled(TRUE);  			}  			// Display claim date +			// *TODO:Localize (Time format may need Translating)  			time_t claim_date = parcel->getClaimDate();  			char time_buf[TIME_STR_LENGTH];		/*Flawfinder: ignore*/ -			mTextClaimDate->setText(formatted_time(claim_date, time_buf)); +			mTextClaimDate->setText(LLString(formatted_time(claim_date, time_buf)));  			mTextClaimDate->setEnabled(is_leased);  			BOOL enable_auction = (gAgent.getGodLevel() >= GOD_LIAISON) @@ -727,8 +691,6 @@ void LLPanelLandGeneral::refresh()  			gParcelMgr->canAgentBuyParcel(parcel, true));  		// show pricing information -		char price[64];		/*Flawfinder: ignore*/ -		const char* label = NULL;  		S32 area;  		S32 claim_price;  		S32 rent_price; @@ -740,14 +702,12 @@ void LLPanelLandGeneral::refresh()  								   &dwell);  		// Area -		snprintf(price, sizeof(price), "%d sq. m.", area);			/* Flawfinder: ignore */ -		label = AREA; -		 -		mTextPriceLabel->setText(label); -		mTextPrice->setText(price); +		LLUIString price = childGetText("area_size_text"); +		price.setArg("[AREA]", llformat("%d",area));	 +		mTextPriceLabel->setText(childGetText("area_text")); +		mTextPrice->setText(price.getString()); -		snprintf(price, sizeof(price), "%.0f", dwell); 			/* Flawfinder: ignore */ -		mTextDwell->setText(price); +		mTextDwell->setText(llformat("%.0f", dwell));  		if(region_owner)  		{ @@ -775,15 +735,14 @@ void LLPanelLandGeneral::refreshNames()  	LLParcel *parcel = mParcel->getParcel();  	if (!parcel)  	{ -		mTextOwner->setText(""); +		mTextOwner->setText(LLString::null);  		return;  	} -	char buffer[MAX_STRING];		/*Flawfinder: ignore*/ +	LLString owner;  	if (parcel->getIsGroupOwned())  	{ -		buffer[0] = '\0'; -		strcat(buffer, "(Group Owned)");	/*Flawfinder: ignore*/ +		owner = childGetText("group_owned_text");  	}  	else  	{ @@ -791,24 +750,23 @@ void LLPanelLandGeneral::refreshNames()  		char owner_first[MAX_STRING];	/*Flawfinder: ignore*/  		char owner_last[MAX_STRING];	/*Flawfinder: ignore*/  		gCacheName->getName(parcel->getOwnerID(), owner_first, owner_last); -		snprintf(buffer, sizeof(buffer), "%s %s", owner_first, owner_last); 		/* Flawfinder: ignore */ +		owner = llformat("%s %s", owner_first, owner_last);  	}  	if(LLParcel::OS_LEASE_PENDING == parcel->getOwnershipStatus())  	{ -		strcat(buffer, " (Sale Pending)");	/*Flawfinder: ignore*/ +		owner += childGetText("sale_pending_text");  	} -	mTextOwner->setText(buffer); +	mTextOwner->setText(owner); +	LLString group;  	if(!parcel->getGroupID().isNull())  	{ +		char buffer[MAX_STRING];	/*Flawfinder: ignore*/  		gCacheName->getGroupName(parcel->getGroupID(), buffer); +		group = buffer;  	} -	else -	{ -		buffer[0] = '\0'; -	} -	mTextGroup->setText(buffer); +	mTextGroup->setText(group);  	const LLUUID& auth_buyer_id = parcel->getAuthorizedBuyerID();  	if(auth_buyer_id.notNull()) @@ -955,7 +913,7 @@ void LLPanelLandGeneral::onClickBuyPass(void* data)  	if (!parcel) return;  	S32 pass_price = parcel->getPassPrice(); -	const char* parcel_name = parcel->getName(); +	LLString parcel_name = parcel->getName();  	F32 pass_hours = parcel->getPassHours();  	char cost[256], time[256];		/*Flawfinder: ignore*/ @@ -1071,8 +1029,8 @@ BOOL LLPanelLandObjects::postBuild()  {  	mFirstReply = TRUE; -	mParcelObjectBonus = LLUICtrlFactory::getTextBoxByName(this, "Simulator Primitive Bonus Factor: 1.00"); -	mSWTotalObjects = LLUICtrlFactory::getTextBoxByName(this, "0 out of 0 available"); +	mParcelObjectBonus = LLUICtrlFactory::getTextBoxByName(this, "parcel_object_bonus"); +	mSWTotalObjects = LLUICtrlFactory::getTextBoxByName(this, "objects_available");  	mObjectContribution = LLUICtrlFactory::getTextBoxByName(this, "object_contrib_text");  	mTotalObjects = LLUICtrlFactory::getTextBoxByName(this, "total_objects_text");  	mOwnerObjects = LLUICtrlFactory::getTextBoxByName(this, "owner_objects_text"); @@ -1221,17 +1179,18 @@ void LLPanelLandObjects::refresh()  	if (!parcel)  	{ -		mSWTotalObjects->setText("0 out of 0 available"); -		mObjectContribution->setText("0"); -		mTotalObjects->setText("0"); -		mOwnerObjects->setText("0"); -		mGroupObjects->setText("0"); -		mOtherObjects->setText("0"); -		mSelectedObjects->setText("0"); +		mSWTotalObjects->setTextArg("[COUNT]", llformat("%d", 0)); +		mSWTotalObjects->setTextArg("[TOTAL]", llformat("%d", 0)); +		mSWTotalObjects->setTextArg("[AVAILABLE]", llformat("%d", 0)); +		mObjectContribution->setTextArg("[COUNT]", llformat("%d", 0)); +		mTotalObjects->setTextArg("[COUNT]", llformat("%d", 0)); +		mOwnerObjects->setTextArg("[COUNT]", llformat("%d", 0)); +		mGroupObjects->setTextArg("[COUNT]", llformat("%d", 0)); +		mOtherObjects->setTextArg("[COUNT]", llformat("%d", 0)); +		mSelectedObjects->setTextArg("[COUNT]", llformat("%d", 0));  	}  	else  	{ -		char count[MAX_STRING];		/*Flawfinder: ignore*/  		S32 sw_max = 0;  		S32 sw_total = 0;  		S32 max = 0; @@ -1258,47 +1217,34 @@ void LLPanelLandObjects::refresh()  		if (parcel_object_bonus != 1.0f)  		{ -			snprintf(count, sizeof(count), "Region Object Bonus Factor: %.2f", 			/* Flawfinder: ignore */ -					parcel_object_bonus); -			mParcelObjectBonus->setText(count); +			mParcelObjectBonus->setVisible(TRUE); +			mParcelObjectBonus->setTextArg("[BONUS]", llformat("%.2f", parcel_object_bonus));  		}  		else  		{ -			mParcelObjectBonus->setText(""); +			mParcelObjectBonus->setVisible(FALSE);  		}  		if (sw_total > sw_max)  		{ -			snprintf(count, sizeof(count), "%d out of %d (%d will be deleted)", 			/* Flawfinder: ignore */ -					sw_total, sw_max, sw_total - sw_max); +			mSWTotalObjects->setText(childGetText("objects_deleted_text")); +			mSWTotalObjects->setTextArg("[DELETED]", llformat("%d", sw_total - sw_max));  		}  		else  		{ -			snprintf(count, sizeof(count), "%d out of %d (%d available)",  				/* Flawfinder: ignore */ -					sw_total, sw_max, sw_max - sw_total); +			mSWTotalObjects->setText(childGetText("objects_available_text")); +			mSWTotalObjects->setTextArg("[AVAILABLE]", llformat("%d", sw_max - sw_total));  		} -		mSWTotalObjects->setText(count); - -		snprintf(count, sizeof(count),  "%d", max);	/* Flawfinder: ignore */ -		mObjectContribution->setText(count); +		mSWTotalObjects->setTextArg("[COUNT]", llformat("%d", sw_total)); +		mSWTotalObjects->setTextArg("[MAX]", llformat("%d", sw_max)); -		snprintf(count, sizeof(count), "%d", total);			/* Flawfinder: ignore */ -		mTotalObjects->setText(count); - -		snprintf(count, sizeof(count), "%d", owned);		/* Flawfinder: ignore */ -		mOwnerObjects->setText(count); - -		snprintf(count, sizeof(count), "%d", group);			/* Flawfinder: ignore */ -		mGroupObjects->setText(count); - -		snprintf(count, sizeof(count), "%d", other);			/* Flawfinder: ignore */ -		mOtherObjects->setText(count); - -		snprintf(count, sizeof(count), "%d", selected);		/* Flawfinder: ignore */ -		mSelectedObjects->setText(count); - -		snprintf(count, sizeof(count), "%d", mOtherTime);	/* Flawfinder: ignore */ -		mCleanOtherObjectsTime->setText(count); +		mObjectContribution->setTextArg("[COUNT]", llformat("%d", max)); +		mTotalObjects->setTextArg("[COUNT]", llformat("%d", total)); +		mOwnerObjects->setTextArg("[COUNT]", llformat("%d", owned)); +		mGroupObjects->setTextArg("[COUNT]", llformat("%d", group)); +		mOtherObjects->setTextArg("[COUNT]", llformat("%d", other)); +		mSelectedObjects->setTextArg("[COUNT]", llformat("%d", selected)); +		mCleanOtherObjectsTime->setText(llformat("%d", mOtherTime));  		BOOL can_return_owned = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_RETURN_GROUP_OWNED);  		BOOL can_return_group_set = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_RETURN_GROUP_SET); @@ -1488,7 +1434,6 @@ void LLPanelLandObjects::callbackReturnOwnerList(S32 option, void* userdata)  				}  				else  				{ -					// XUI:translate NAME -> FIRST LAST  					args["[NAME]"] = self->mSelectedName;  					LLNotifyBox::showXml("OtherObjectsReturned2", args);  				} @@ -1633,7 +1578,7 @@ void LLPanelLandObjects::processParcelObjectOwnersReply(LLMessageSystem *msg, vo  			row->addColumn(OWNER_OFFLINE, FONT, self->mColWidth[1]);  		}  		// Placeholder for name. -		row->addColumn("", FONT, self->mColWidth[2]); +		row->addColumn(LLString::null, FONT, self->mColWidth[2]);  		snprintf(object_count_str, sizeof(object_count_str), "%d", object_count); 		/* Flawfinder: ignore */  		row->addColumn(object_count_str, FONT, self->mColWidth[3]); @@ -2032,7 +1977,7 @@ BOOL LLPanelLandOptions::postBuild()  	} -	mLocationText = LLUICtrlFactory::getTextBoxByName(this, "Landing Point: (none)"); +	mLocationText = LLUICtrlFactory::getTextBoxByName(this, "landing_point");  	mSetBtn = LLUICtrlFactory::getButtonByName(this, "Set");  	mSetBtn->setClickedCallback(onClickSet, this); @@ -2097,8 +2042,9 @@ void LLPanelLandOptions::refresh()  		mPushRestrictionCtrl->set(FALSE);  		mPushRestrictionCtrl->setEnabled(FALSE); +		// *TODO:Translate  		const char* none_string = LLParcel::getCategoryUIString(LLParcel::C_NONE); -		mCategoryCombo->setSimple(none_string); +		mCategoryCombo->setSimple(LLString(none_string));  		mCategoryCombo->setEnabled(FALSE);  		mLandingTypeCombo->setCurrentByIndex(0); @@ -2107,7 +2053,7 @@ void LLPanelLandOptions::refresh()  		mSnapshotCtrl->setImageAssetID(LLUUID::null);  		mSnapshotCtrl->setEnabled(FALSE); -		mLocationText->setText("Landing Point: (none)"); +		mLocationText->setTextArg("[LANDING]", childGetText("landing_point_none"));  		mSetBtn->setEnabled(FALSE);  		mClearBtn->setEnabled(FALSE); @@ -2154,24 +2100,23 @@ void LLPanelLandOptions::refresh()  		mPushRestrictionCtrl->set( parcel->getRestrictPushObject() );  		if(parcel->getRegionPushOverride())  		{ -			mPushRestrictionCtrl->setLabel("Restrict Pushing (Region Override)"); +			mPushRestrictionCtrl->setLabel(childGetText("push_restrict_region_text"));  			mPushRestrictionCtrl->setEnabled(false);  			mPushRestrictionCtrl->set(TRUE);  		}  		else  		{ -			mPushRestrictionCtrl->setLabel("Restrict Pushing"); +			mPushRestrictionCtrl->setLabel(childGetText("push_restrict_text"));  			mPushRestrictionCtrl->setEnabled(can_change_options);  		}  		BOOL can_change_identity =   			LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_CHANGE_IDENTITY); - -		// Set by string in case the order in UI doesn't match the order -		// by index. +		// Set by string in case the order in UI doesn't match the order by index. +		// *TODO:Translate  		LLParcel::ECategory cat = parcel->getCategory();  		const char* category_string = LLParcel::getCategoryUIString(cat); -		mCategoryCombo->setSimple(category_string); +		mCategoryCombo->setSimple(LLString(category_string));  		mCategoryCombo->setEnabled( can_change_identity );  		BOOL can_change_landing_point = LLViewerParcelMgr::isParcelModifiableByAgent(parcel,  @@ -2185,16 +2130,14 @@ void LLPanelLandOptions::refresh()  		LLVector3 pos = parcel->getUserLocation();  		if (pos.isExactlyZero())  		{ -			mLocationText->setText("Landing Point: (none)"); +			mLocationText->setTextArg("[LANDING]", childGetText("landing_point_none"));  		}  		else  		{ -			char buffer[256];	/*Flawfinder: ignore*/ -			snprintf(buffer, sizeof(buffer), "Landing Point: %d, %d, %d",		/* Flawfinder: ignore */ -					llround(pos.mV[VX]), -					llround(pos.mV[VY]), -					llround(pos.mV[VZ])); -			mLocationText->setText(buffer); +			mLocationText->setTextArg("[LANDING]",llformat("%d, %d, %d", +														   llround(pos.mV[VX]), +														   llround(pos.mV[VY]), +														   llround(pos.mV[VZ])));  		}  		mSetBtn->setEnabled( can_change_landing_point ); @@ -2445,10 +2388,10 @@ void LLPanelLandMedia::refresh()  		mRadioVoiceChat->setSelectedIndex(kRadioVoiceChatEstate);  		mRadioVoiceChat->setEnabled(FALSE); -		mMusicURLEdit->setText(""); +		mMusicURLEdit->setText(LLString::null);  		mMusicURLEdit->setEnabled(FALSE); -		mMediaURLEdit->setText(""); +		mMediaURLEdit->setText(LLString::null);  		mMediaURLEdit->setEnabled(FALSE);  		mMediaAutoScaleCheck->set ( FALSE ); @@ -2664,24 +2607,20 @@ void LLPanelLandAccess::refresh()  	if (parcel)  	{ -		char label[256];	/*Flawfinder: ignore*/ -  		// Display options  		BOOL use_group = parcel->getParcelFlag(PF_USE_ACCESS_GROUP);  		mCheckGroup->set( use_group );  		char group_name[MAX_STRING];	/*Flawfinder: ignore*/  		gCacheName->getGroupName(parcel->getGroupID(), group_name); -		snprintf(label, sizeof(label), "Group: %s", group_name);		/* Flawfinder: ignore */ -		mCheckGroup->setLabel( label ); +		mCheckGroup->setLabelArg( "[GROUP]", LLString(group_name) );  		S32 count = parcel->mAccessList.size();  		BOOL use_list = parcel->getParcelFlag(PF_USE_ACCESS_LIST);  		mCheckAccess->set( use_list ); -		snprintf(label, sizeof(label), "Avatars: (%d listed, %d max)",		/* Flawfinder: ignore */ -				count, PARCEL_MAX_ACCESS_LIST); -		mCheckAccess->setLabel( label ); +		mCheckAccess->setLabelArg( "[LISTED]", llformat("%d",count)); +		mCheckAccess->setLabelArg( "[MAX]", llformat("%d",PARCEL_MAX_ACCESS_LIST));  		access_map_const_iterator cit = parcel->mAccessList.begin();  		access_map_const_iterator end = parcel->mAccessList.end(); @@ -2749,9 +2688,9 @@ void LLPanelLandAccess::refresh()  	else  	{  		mCheckGroup->set(FALSE); -		mCheckGroup->setLabel("Group:"); +		mCheckGroup->setLabelArg( "[GROUP]", LLString::null );  		mCheckAccess->set(FALSE); -		mCheckAccess->setLabel("Avatars:"); +		mCheckAccess->setLabelArg( "[LISTED]", llformat("%d",0));  		mBtnAddAccess->setEnabled(FALSE);  		mBtnRemoveAccess->setEnabled(FALSE);  		mSpinPrice->set((F32)PARCEL_PASS_PRICE_DEFAULT); @@ -2773,9 +2712,7 @@ void LLPanelLandAccess::refreshNames()  	{  		gCacheName->getGroupName(parcel->getGroupID(), group_name);  	} -	char label[MAX_STRING];		/*Flawfinder: ignore*/ -	snprintf(label, sizeof(label), "Group: %s", group_name);		/* Flawfinder: ignore */ -	mCheckGroup->setLabel(label); +	mCheckGroup->setLabelArg("[GROUP]", LLString(group_name));  } @@ -2941,18 +2878,14 @@ void LLPanelLandBan::refresh()  	if (parcel)  	{ -		char label[256];	/*Flawfinder: ignore*/ -  		// Display options  		S32 count = parcel->mBanList.size();  		BOOL use_ban = parcel->getParcelFlag(PF_USE_BAN_LIST);  		mCheck->set( use_ban ); - -		snprintf(label, sizeof(label), "Ban these avatars: (%d listed, %d max)",		/* Flawfinder: ignore */ -				count, PARCEL_MAX_ACCESS_LIST); -		mCheck->setLabel( label ); +		mCheck->setLabelArg( "[LISTED]", llformat("%d",count)); +		mCheck->setLabelArg( "[MAX]", llformat("%d",PARCEL_MAX_ACCESS_LIST));  		access_map_const_iterator cit = parcel->mBanList.begin();  		access_map_const_iterator end = parcel->mBanList.end(); @@ -3031,7 +2964,7 @@ void LLPanelLandBan::refresh()  	else  	{  		mCheck->set(FALSE); -		mCheck->setLabel("Ban these avatars:"); +		mCheck->setLabelArg( "[LISTED]", llformat("%d",0));  		mCheck->setEnabled(FALSE);  		mBtnAdd->setEnabled(FALSE);  		mBtnRemove->setEnabled(FALSE); @@ -3125,82 +3058,6 @@ void LLPanelLandBan::onClickRemove(void* data)  }  //--------------------------------------------------------------------------- -// LLPanelLandRenters -//--------------------------------------------------------------------------- -LLPanelLandRenters::LLPanelLandRenters(LLParcelSelectionHandle& parcel) -:	LLPanel("landrenters", LLRect(0,500,500,0)), mParcel(parcel) -{ -	const S32 BTN_WIDTH = 64; - -	S32 x = LEFT; -	S32 y = mRect.getHeight() - VPAD; - -	LLCheckBoxCtrl* check = NULL; -	LLButton* btn = NULL; -	LLNameListCtrl* list = NULL; - -	check = new LLCheckBoxCtrl("RentersCheck", -							LLRect(RULER0, y, RIGHT, y-LINE), -							"Rent space to these avatars:"); -	addChild(check); -	mCheckRenters = check; - -	y -= VPAD + LINE; - -	const S32 ITEMS = 5; -	const BOOL NO_MULTIPLE_SELECT = FALSE; - -	list = new LLNameListCtrl("RentersList", -							LLRect(RULER05, y, RIGHT, y-LINE*ITEMS), -							NULL, NULL, -							NO_MULTIPLE_SELECT); -	list->addSimpleItem("foo tester"); -	list->addSimpleItem("bar tester"); -	list->setFollows(FOLLOWS_TOP | FOLLOWS_LEFT); -	addChild(list); -	mListRenters = list; - -	y -= VPAD + LINE*ITEMS; - -	x = RULER05; -	btn = new LLButton("Add...", -						LLRect(x, y, x+BTN_WIDTH, y-LINE), -						"", -						onClickAdd, this); -	btn->setFont( LLFontGL::sSansSerifSmall ); -	btn->setFollows(FOLLOWS_TOP | FOLLOWS_LEFT); -	addChild(btn); -	mBtnAddRenter = btn; - -	x += HPAD + BTN_WIDTH; - -	btn = new LLButton("Remove", -						LLRect(x, y, x+BTN_WIDTH, y-LINE), -						"", -						onClickRemove, this); -	btn->setFont( LLFontGL::sSansSerifSmall ); -	btn->setFollows(FOLLOWS_TOP | FOLLOWS_LEFT); -	addChild(btn); -	mBtnRemoveRenter = btn; -} - -LLPanelLandRenters::~LLPanelLandRenters() -{ } - -void LLPanelLandRenters::refresh() -{ } - -// static -void LLPanelLandRenters::onClickAdd(void*) -{ -} - -// static -void LLPanelLandRenters::onClickRemove(void*) -{ -} - -//---------------------------------------------------------------------------  // LLPanelLandCovenant  //---------------------------------------------------------------------------  LLPanelLandCovenant::LLPanelLandCovenant(LLParcelSelectionHandle& parcel) diff --git a/indra/newview/llfloaterland.h b/indra/newview/llfloaterland.h index f3ad542be9..9eb9172b60 100644 --- a/indra/newview/llfloaterland.h +++ b/indra/newview/llfloaterland.h @@ -113,7 +113,6 @@ protected:  	LLPanelLandAccess*		mPanelAccess;  	LLPanelLandBan*			mPanelBan;  	LLPanelLandCovenant*	mPanelCovenant; -	LLPanelLandRenters*		mPanelRenters;  	LLHandle<LLParcelSelection>	mParcel; diff --git a/indra/newview/llfloateropenobject.cpp b/indra/newview/llfloateropenobject.cpp index 8aaf1089a5..0b79c85963 100644 --- a/indra/newview/llfloateropenobject.cpp +++ b/indra/newview/llfloateropenobject.cpp @@ -67,7 +67,7 @@ LLFloaterOpenObject::LLFloaterOpenObject()  	childSetAction("copy_to_inventory_button", onClickMoveToInventory, this);  	childSetAction("copy_and_wear_button", onClickMoveAndWear, this); -	childSetTextArg("object_name", "[DESC]", "Object"); +	childSetTextArg("object_name", "[DESC]", LLString("Object") ); // *Note: probably do not want to translate this  }  LLFloaterOpenObject::~LLFloaterOpenObject() diff --git a/indra/newview/llfloaterpostcard.cpp b/indra/newview/llfloaterpostcard.cpp index 821e5190ce..8dcdb99a69 100644 --- a/indra/newview/llfloaterpostcard.cpp +++ b/indra/newview/llfloaterpostcard.cpp @@ -357,7 +357,7 @@ void LLFloaterPostcard::onMsgFormFocusRecieved(LLUICtrl* receiver, void* data)  		if(msgForm && msgForm == receiver && msgForm->hasFocus() && !(self->mHasFirstMsgFocus))  		{  			self->mHasFirstMsgFocus = true; -			msgForm->setText(LLString("")); +			msgForm->setText(LLString::null);  		}  	}  } @@ -380,7 +380,6 @@ void LLFloaterPostcard::missingSubjMsgAlertCallback(S32 option, void* data)  			{  				// The user never switched focus to the messagee window.   				// Using the default string. -				// XUI: translate  				self->childSetValue("msg_form", self->childGetText("default_message"));  			} diff --git a/indra/newview/llfloaterproperties.cpp b/indra/newview/llfloaterproperties.cpp index 4df3ab04c7..af2a717ff7 100644 --- a/indra/newview/llfloaterproperties.cpp +++ b/indra/newview/llfloaterproperties.cpp @@ -59,14 +59,6 @@  #include "llvieweruictrlfactory.h" -///---------------------------------------------------------------------------- -/// Local function declarations, constants, enums, and typedefs -///---------------------------------------------------------------------------- - -const char* YOU_CAN = "You can:"; -const char* OWNER_CAN = "Owner can: "; - -  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  // Class LLPropertiesObserver  // @@ -302,22 +294,11 @@ void LLFloaterProperties::refreshFromItem(LLInventoryItem* item)  	childSetEnabled("LabelItemNameTitle",TRUE);  	childSetEnabled("LabelItemName",is_modifiable); -	const char EMPTY_STRING[1] = "";		/* Flawfinder: ignore */ -	const char* txt = EMPTY_STRING; -	if(!item->getName().empty()) -	{ -		txt = item->getName().c_str(); -	} -	childSetText("LabelItemName",txt); +	childSetText("LabelItemName",item->getName());  	childSetEnabled("LabelItemDescTitle",TRUE);  	childSetEnabled("LabelItemDesc",is_modifiable);  	childSetVisible("IconLocked",!is_modifiable); -	txt = EMPTY_STRING; -	if(!item->getDescription().empty()) -	{ -		txt = item->getDescription().c_str(); -	} -	childSetText("LabelItemDesc",txt); +	childSetText("LabelItemDesc",item->getDescription());  	//////////////////  	// CREATOR NAME // @@ -344,7 +325,7 @@ void LLFloaterProperties::refreshFromItem(LLInventoryItem* item)  		childSetEnabled("BtnCreator",FALSE);  		childSetEnabled("LabelCreatorTitle",FALSE);  		childSetEnabled("LabelCreatorName",FALSE); -		childSetText("LabelCreatorName","(unknown)"); // XUI:translate +		childSetText("LabelCreatorName",childGetText("unknown"));  	}  	//////////////// @@ -376,20 +357,22 @@ void LLFloaterProperties::refreshFromItem(LLInventoryItem* item)  		childSetEnabled("BtnOwner",FALSE);  		childSetEnabled("LabelOwnerTitle",FALSE);  		childSetEnabled("LabelOwnerName",FALSE); -		childSetText("LabelOwnerName","(public)"); // XUI:translate +		childSetText("LabelOwnerName",childGetText("public"));  	}  	//////////////////  	// ACQUIRE DATE //  	////////////////// + +	// *TODO: Localize / translate this  	time_t time_utc = (time_t)item->getCreationDate();  	if (0 == time_utc)  	{ -		childSetText("LabelAcquiredDate","(unknown)"); +		childSetText("LabelAcquiredDate",childGetText("unknown"));  	}  	else  	{ -		childSetText("LabelAcquiredDate", ctime(&time_utc) ); +		childSetText("LabelAcquiredDate", LLString(ctime(&time_utc)) );  	}  	/////////////////////// @@ -397,11 +380,11 @@ void LLFloaterProperties::refreshFromItem(LLInventoryItem* item)  	///////////////////////  	if(can_agent_manipulate)  	{ -		childSetText("OwnerLabel",YOU_CAN); +		childSetText("OwnerLabel",childGetText("you_can"));  	}  	else  	{ -		childSetText("OwnerLabel",OWNER_CAN); +		childSetText("OwnerLabel",childGetText("owner_can"));  	}  	U32 base_mask		= perm.getMaskBase(); @@ -436,30 +419,33 @@ void LLFloaterProperties::refreshFromItem(LLInventoryItem* item)  			overwrite_group		= flags & LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP;  		} -		char perm_string[11];		/* Flawfinder: ignore */ +		std::string perm_string; -		snprintf(perm_string, sizeof(perm_string), "B: ");			/* Flawfinder: ignore */ -		mask_to_string(base_mask, perm_string+3); +		perm_string = "B: "; +		perm_string += mask_to_string(base_mask);  		childSetText("BaseMaskDebug",perm_string);  		childSetVisible("BaseMaskDebug",TRUE); -		snprintf(perm_string, sizeof(perm_string), "O: ");			/* Flawfinder: ignore */ -		mask_to_string(owner_mask, perm_string+3); +		perm_string = "O: "; +		perm_string += mask_to_string(owner_mask);  		childSetText("OwnerMaskDebug",perm_string);  		childSetVisible("OwnerMaskDebug",TRUE); -		snprintf(perm_string, sizeof(perm_string), "G%s: ", overwrite_group ? "*" : "");			/* Flawfinder: ignore */ -		mask_to_string(group_mask, perm_string + (overwrite_group ? 4 : 3)); +		perm_string = "G"; +		perm_string += overwrite_group ? "*: " : ": "; +		perm_string += perm_string += mask_to_string(group_mask);  		childSetText("GroupMaskDebug",perm_string);  		childSetVisible("GroupMaskDebug",TRUE); -		snprintf(perm_string, sizeof(perm_string), "E%s: ", overwrite_everyone ? "*" : "");			/* Flawfinder: ignore */ -		mask_to_string(everyone_mask, perm_string + (overwrite_everyone ? 4 : 3)); +		perm_string = "E"; +		perm_string += overwrite_everyone ? "*: " : ": "; +		perm_string += mask_to_string(everyone_mask);  		childSetText("EveryoneMaskDebug",perm_string);  		childSetVisible("EveryoneMaskDebug",TRUE); -		snprintf(perm_string, sizeof(perm_string), "N%s: ", slam_perm ? "*" : "");			/* Flawfinder: ignore */ -		mask_to_string(next_owner_mask, perm_string + (slam_perm ? 4 : 3)); +		perm_string = "N"; +		perm_string += slam_perm ? "*: " : ": "; +		perm_string += mask_to_string(next_owner_mask);  		childSetText("NextMaskDebug",perm_string);  		childSetVisible("NextMaskDebug",TRUE);  	} @@ -571,14 +557,14 @@ void LLFloaterProperties::refreshFromItem(LLInventoryItem* item)  	if (is_for_sale)  	{  		radioSaleType->setSelectedIndex((S32)sale_info.getSaleType() - 1); -		char numerical_price[MAX_STRING];		/* Flawfinder: ignore */ -		snprintf(numerical_price, MAX_STRING, "%d", sale_info.getSalePrice());			/* Flawfinder: ignore */ +		std::string numerical_price; +		numerical_price = sale_info.getSalePrice();  		childSetText("EditPrice",numerical_price);  	}  	else  	{  		radioSaleType->setSelectedIndex(-1); -		childSetText("EditPrice",""); +		childSetText("EditPrice",LLString::null);  	}  } diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp index 0d62b93ed5..a7cd2114e0 100644 --- a/indra/newview/llfloaterreporter.cpp +++ b/indra/newview/llfloaterreporter.cpp @@ -177,8 +177,8 @@ LLFloaterReporter::LLFloaterReporter(  	setVisible(TRUE);  	// Default text to be blank -	childSetText("object_name", ""); -	childSetText("owner_name", ""); +	childSetText("object_name", LLString::null); +	childSetText("owner_name", LLString::null);  	childSetFocus("summary_edit"); @@ -461,8 +461,8 @@ void LLFloaterReporter::onClickObjPicker(void *userdata)  	gToolObjPicker->setExitCallback(LLFloaterReporter::closePickTool, self);  	gToolMgr->setTransientTool(gToolObjPicker);  	self->mPicking = TRUE; -	self->childSetText("object_name", ""); -	self->childSetText("owner_name", ""); +	self->childSetText("object_name", LLString::null); +	self->childSetText("owner_name", LLString::null);  	LLButton* pick_btn = LLUICtrlFactory::getButtonByName(self, "pick_btn");  	if (pick_btn) pick_btn->setToggleState(TRUE);  } @@ -581,7 +581,7 @@ LLFloaterReporter* LLFloaterReporter::createNewBugReporter() -void LLFloaterReporter::setPickedObjectProperties(const char *object_name, const char *owner_name, const LLUUID owner_id) +void LLFloaterReporter::setPickedObjectProperties(const LLString& object_name, const LLString& owner_name, const LLUUID owner_id)  {  	childSetText("object_name", object_name);  	childSetText("owner_name", owner_name); diff --git a/indra/newview/llfloaterreporter.h b/indra/newview/llfloaterreporter.h index a824135efe..771a6a385d 100644 --- a/indra/newview/llfloaterreporter.h +++ b/indra/newview/llfloaterreporter.h @@ -109,7 +109,7 @@ public:  	// static  	static void processRegionInfo(LLMessageSystem* msg); -	void setPickedObjectProperties(const char *object_name, const char *owner_name, const LLUUID owner_id); +	void setPickedObjectProperties(const LLString& object_name, const LLString& owner_name, const LLUUID owner_id);  private:  	void takeScreenshot(); diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index 96d53ffd1f..d0a21d2da6 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -1348,16 +1348,15 @@ void LLFloaterSnapshot::draw()  				childSetEnabled("send_btn", previewp->getSnapshotUpToDate());  			} -			//XUI:translate  			if (previewp->getSnapshotUpToDate())  			{  				LLString bytes_string;  				gResMgr->getIntegerString(bytes_string, previewp->getDataSize()); -				childSetTextArg("file_size_label", "[SIZE]", llformat("%s bytes", bytes_string.c_str())); +				childSetTextArg("file_size_label", "[SIZE]", bytes_string);  			}  			else  			{ -				childSetTextArg("file_size_label", "[SIZE]", "unknown"); +				childSetTextArg("file_size_label", "[SIZE]", childGetText("unknwon"));  				childSetColor("file_size_label", gColors.getColor( "LabelTextColor" ));  			}  			childSetEnabled("upload_btn", previewp->getSnapshotUpToDate()); @@ -1366,7 +1365,7 @@ void LLFloaterSnapshot::draw()  		}  		else  		{ -			childSetTextArg("file_size_label", "[SIZE]", "unknown"); +			childSetTextArg("file_size_label", "[SIZE]", LLString("???"));  			childSetEnabled("upload_btn", FALSE);  			childSetEnabled("send_btn", FALSE);  			childSetEnabled("save_btn", FALSE); diff --git a/indra/newview/llfloatertelehub.cpp b/indra/newview/llfloatertelehub.cpp index b0158aaaff..95a47bb2ac 100644 --- a/indra/newview/llfloatertelehub.cpp +++ b/indra/newview/llfloatertelehub.cpp @@ -129,11 +129,8 @@ void LLFloaterTelehub::draw()  // Per-frame updates, because we don't have a selection manager observer.  void LLFloaterTelehub::refresh()  { -	LLViewerObject* object = mObjectSelection->getFirstRootObject(); -	if(!object) -	{ -		object = mObjectSelection->getFirstObject(); -	} +	const BOOL children_ok = TRUE; +	LLViewerObject* object = mObjectSelection->getFirstRootObject(children_ok);  	BOOL have_selection = (object != NULL);  	BOOL all_volume = gSelectMgr->selectionAllPCode( LL_PCODE_VOLUME ); diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp index 2c0cb4164d..4f8ed08a69 100644 --- a/indra/newview/llfloatertools.cpp +++ b/indra/newview/llfloatertools.cpp @@ -317,6 +317,16 @@ BOOL	LLFloaterTools::postBuild()  		mTab->setBorderVisible(FALSE);  		mTab->selectFirstTab();  	} + +	mStatusText["rotate"] = childGetText("status_rotate"); +	mStatusText["scale"] = childGetText("status_scale"); +	mStatusText["move"] = childGetText("status_move"); +	mStatusText["modifyland"] = childGetText("status_modifyland"); +	mStatusText["camera"] = childGetText("status_camera"); +	mStatusText["grab"] = childGetText("status_grab"); +	mStatusText["place"] = childGetText("status_place"); +	mStatusText["selectland"] = childGetText("status_selectland"); +	  	return TRUE;  } @@ -418,9 +428,17 @@ LLFloaterTools::~LLFloaterTools()  	// children automatically deleted  } -void LLFloaterTools::setStatusText(const LLString& text) +void LLFloaterTools::setStatusText(const std::string& text)  { -	mTextStatus->setText(text); +	std::map<std::string, std::string>::iterator iter = mStatusText.find(text); +	if (iter != mStatusText.end()) +	{ +		mTextStatus->setText(iter->second); +	} +	else +	{ +		mTextStatus->setText(text); +	}  }  void LLFloaterTools::refresh() @@ -587,27 +605,27 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)  	if (mComboGridMode)   	{ -		mComboGridMode		->setVisible( edit_visible ); +		mComboGridMode->setVisible( edit_visible );  		S32 index = mComboGridMode->getCurrentIndex();  		mComboGridMode->removeall();  		switch (mObjectSelection->getSelectType())  		{  		case SELECT_TYPE_HUD: -			mComboGridMode->add("Screen"); -			mComboGridMode->add("Local"); -			//mComboGridMode->add("Reference"); -			break; +		  mComboGridMode->add(childGetText("grid_screen_text")); +		  mComboGridMode->add(childGetText("grid_local_text")); +		  //mComboGridMode->add(childGetText("grid_reference_text")); +		  break;  		case SELECT_TYPE_WORLD: -			mComboGridMode->add("World"); -			mComboGridMode->add("Local"); -			mComboGridMode->add("Reference"); -			break; +		  mComboGridMode->add(childGetText("grid_world_text")); +		  mComboGridMode->add(childGetText("grid_local_text")); +		  mComboGridMode->add(childGetText("grid_reference_text")); +		  break;  		case SELECT_TYPE_ATTACHMENT: -			mComboGridMode->add("Attachment"); -			mComboGridMode->add("Local"); -			mComboGridMode->add("Reference"); -			break; +		  mComboGridMode->add(childGetText("grid_attachment_text")); +		  mComboGridMode->add(childGetText("grid_local_text")); +		  mComboGridMode->add(childGetText("grid_reference_text")); +		  break;  		}  		mComboGridMode->setCurrentByIndex(index); diff --git a/indra/newview/llfloatertools.h b/indra/newview/llfloatertools.h index e710947992..f56cdbecb5 100644 --- a/indra/newview/llfloatertools.h +++ b/indra/newview/llfloatertools.h @@ -97,7 +97,7 @@ public:  	void showMore(BOOL show_more);  	void showPanel(EInfoPanel panel); -	void setStatusText(const LLString& text); +	void setStatusText(const std::string& text);  	virtual void onFocusReceived();  	static void setEditTool(void* data);  	void saveLastTool(); @@ -191,6 +191,8 @@ private:  	BOOL					mDirty;  	S32						mSmallHeight;  	S32						mLargeHeight; + +	std::map<std::string, std::string> mStatusText;  };  extern LLFloaterTools *gFloaterTools; diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index ac63fddff1..23d01a963b 100644 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -262,7 +262,7 @@ BOOL LLFloaterWorldMap::postBuild()  	mCurZoomVal = log(gMapScale)/log(2.f);  	childSetValue("zoom slider", gMapScale); -	setDefaultBtn(""); +	setDefaultBtn(NULL);  	if ( gAgent.mAccess <= SIM_ACCESS_PG )  	{ @@ -1226,7 +1226,7 @@ void LLFloaterWorldMap::updateSearchEnabled( LLUICtrl* ctrl, void* userdata )  	}  	else  	{ -		self->setDefaultBtn(""); +		self->setDefaultBtn(NULL);  	}  } diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index cc8e80bee6..38f2249329 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -3193,18 +3193,18 @@ void LLFolderView::draw()  	if (hasVisibleChildren() || getShowFolderState() == LLInventoryFilter::SHOW_ALL_FOLDERS)  	{ -		setStatusText(""); +		mStatusText.clear();  	}  	else  	{  		if (gInventory.backgroundFetchActive() || mCompletedFilterGeneration < mFilter.getMinRequiredGeneration())  		{ -			setStatusText("Searching..."); +			mStatusText = "Searching..."; // *TODO:translate  			sFont->renderUTF8(mStatusText, 0, 2, 1, LLColor4::white, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::NORMAL, S32_MAX, S32_MAX, NULL, FALSE );  		}  		else  		{ -			setStatusText("No matching items found in inventory."); +			mStatusText = "No matching items found in inventory."; // *TODO:translate  			sFont->renderUTF8(mStatusText, 0, 2, 1, LLColor4::white, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::NORMAL, S32_MAX, S32_MAX, NULL, FALSE );  		}  	} diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h index 602b19328f..dd0dd21705 100644 --- a/indra/newview/llfolderview.h +++ b/indra/newview/llfolderview.h @@ -484,8 +484,6 @@ public:  	BOOL			isDescendantOf( const LLFolderViewFolder* potential_ancestor );  	S32				getIndentation() { return mIndentation; } -	virtual void setStatusText(const LLString& text) { mStatusText = text; } -  	virtual BOOL	potentiallyVisible(); // do we know for a fact that this item has been filtered out?  	virtual BOOL	getFiltered(); diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp index ca387ac3c8..da3f7aad46 100644 --- a/indra/newview/llglsandbox.cpp +++ b/indra/newview/llglsandbox.cpp @@ -251,35 +251,35 @@ void LLToolSelectRect::handleRectangleSelection(S32 x, S32 y, MASK mask)  	if (shrink_selection)  	{ -		LLObjectSelectionHandle highlighted_objects = gSelectMgr->getHighlightedObjects(); - -		for (LLViewerObject* vobjp = highlighted_objects->getFirstObject(); -			vobjp; -			vobjp = highlighted_objects->getNextObject()) +		struct f : public LLSelectedObjectFunctor +		{ +			virtual bool apply(LLViewerObject* vobjp)  			{  				LLDrawable* drawable = vobjp->mDrawable;  				if (!drawable || vobjp->getPCode() != LL_PCODE_VOLUME || vobjp->isAttachment())  				{ -					continue; +					return true;  				} -  				S32 result = gCamera->sphereInFrustum(drawable->getPositionAgent(), drawable->getRadius());  				switch (result)  				{ -				case 0: +				  case 0:  					gSelectMgr->unhighlightObjectOnly(vobjp);  					break; -				case 1: +				  case 1:  					// check vertices  					if (!gCamera->areVertsVisible(vobjp, LLSelectMgr::sRectSelectInclusive))  					{  						gSelectMgr->unhighlightObjectOnly(vobjp);  					}  					break; -				default: +				  default:  					break;  				} +				return true;  			} +		} func; +		gSelectMgr->getHighlightedObjects()->applyToObjects(&func);  	}  	if (grow_selection) diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp index 016c4920cc..7d7a5b9a3a 100644 --- a/indra/newview/llgroupmgr.cpp +++ b/indra/newview/llgroupmgr.cpp @@ -1277,7 +1277,7 @@ void LLGroupMgr::processCreateGroupReply(LLMessageSystem* msg, void ** data)  	}  	else  	{ -		// XUI:translate +		// *TODO:translate  		LLString::format_map_t args;  		args["[MESSAGE]"] = message;  		gViewerWindow->alertXml("UnableToCreateGroup", args); @@ -1853,3 +1853,4 @@ void LLGroupMgr::debugClearAllGroups(void*)  	LLGroupMgr::parseRoleActions("role_actions.xml");  } + diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp index a18bf793d8..3a947bcbff 100644 --- a/indra/newview/llimpanel.cpp +++ b/indra/newview/llimpanel.cpp @@ -1637,7 +1637,7 @@ void LLFloaterIMPanel::sendMsg()  		gViewerStats->incStat(LLViewerStats::ST_IM_COUNT);  	} -	mInputEditor->setText(""); +	mInputEditor->setText(LLString::null);  	// Don't need to actually send the typing stop message, the other  	// client will infer it from receiving the message. diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 47ab36959d..dee1ed2bfd 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -167,7 +167,8 @@ BOOL LLFloaterIM::postBuild()  	sErrorStringsMap["no_user_911"] =  		getFormattedUIString("user_no_help"); -	sEventStringsMap["add"] = childGetText("add_session_event"); +	sEventStringsMap["add"] = +		getFormattedUIString("add_session_event");  	sEventStringsMap["message"] =  		getFormattedUIString("message_session_event"); @@ -388,7 +389,7 @@ void LLIMMgr::addMessage(  		// when answering questions.  		if(gAgent.isGodlike())  		{ -			// XUI:translate +			// *TODO:translate (low priority, god ability)  			std::ostringstream bonus_info;  			bonus_info << "*** parent estate: "  				<< parent_estate_id diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 204ec57f46..4e9c399f3e 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -112,13 +112,6 @@ void remove_inventory_category_from_avatar_step2( BOOL proceed, void* userdata);  void move_task_inventory_callback(S32 option, void* user_data);  void confirm_replace_attachment_rez(S32 option, void* user_data); -// TomY XUI: translate -const char* FIND_HINT = "Start typing to select an item by name"; -const char* NAME_SEARCH_DESC = "Find items whose name contains (leave blank for all):"; -const char* NEW_LSL_NAME = "New Script"; -const char* NEW_NOTECARD_NAME = "New Note"; -const char* NEW_GESTURE_NAME = "New Gesture"; -  const char* ICON_NAME[ICON_NAME_COUNT] =  {  	"inv_item_texture.tga", diff --git a/indra/newview/llmanip.cpp b/indra/newview/llmanip.cpp index 14f86d12e3..953befcd30 100644 --- a/indra/newview/llmanip.cpp +++ b/indra/newview/llmanip.cpp @@ -94,9 +94,10 @@ void LLManip::rebuild(LLViewerObject* vobj)  LLManip::LLManip( const LLString& name, LLToolComposite* composite )  	:  	LLTool( name, composite ), -	mInSnapRegime(FALSE) -{} - +	mInSnapRegime(FALSE), +	mHighlightedPart(LL_NO_PART) +{ +}  void LLManip::getManipNormal(LLViewerObject* object, EManipPart manip, LLVector3 &normal)  { @@ -360,14 +361,11 @@ void LLManip::renderGuidelines(BOOL draw_x, BOOL draw_y, BOOL draw_z)  	LLVector3 grid_scale;  	gSelectMgr->getGrid(grid_origin, grid_rot, grid_scale); -	LLViewerObject* object = mObjectSelection->getFirstRootObject(); +	const BOOL children_ok = TRUE; +	LLViewerObject* object = mObjectSelection->getFirstRootObject(children_ok);  	if (!object)  	{ -		object = mObjectSelection->getFirstObject(); -		if (!object) -		{ -			return; -		} +		return;  	}  	//LLVector3  center_agent  = gSelectMgr->getBBoxOfSelection().getCenterAgent(); diff --git a/indra/newview/llmanip.h b/indra/newview/llmanip.h index aaae5e8f25..8c51746d1c 100644 --- a/indra/newview/llmanip.h +++ b/indra/newview/llmanip.h @@ -128,11 +128,13 @@ public:      /*virtual*/ BOOL	handleMouseUp(S32 x, S32 y, MASK mask);      /*virtual*/ BOOL	handleHover(S32 x, S32 y, MASK mask); -	virtual EManipPart	getHighlightedPart() { return LL_NO_PART; } -	virtual void		highlightManipulators(S32 x, S32 y) {}; +	virtual void		highlightManipulators(S32 x, S32 y) = 0;  	virtual void		handleSelect();  	virtual void		handleDeselect(); +	virtual BOOL		canAffectSelection() = 0; +	EManipPart			getHighlightedPart() { return mHighlightedPart; } +	  	LLHandle<LLObjectSelection> getSelection();  protected: @@ -152,6 +154,7 @@ protected:  	LLFrameTimer		mHelpTextTimer;  	BOOL				mInSnapRegime;  	LLHandle<LLObjectSelection> mObjectSelection; +	EManipPart			mHighlightedPart;  	static F32			sHelpTextVisibleTime;  	static F32			sHelpTextFadeTime; diff --git a/indra/newview/llmaniprotate.cpp b/indra/newview/llmaniprotate.cpp index 093b3a24ee..15559bc1db 100644 --- a/indra/newview/llmaniprotate.cpp +++ b/indra/newview/llmaniprotate.cpp @@ -110,7 +110,7 @@ void LLManipRotate::handleSelect()  {  	// *FIX: put this in mouseDown?  	gSelectMgr->saveSelectedObjectTransform(SELECT_ACTION_TYPE_PICK); -	gFloaterTools->setStatusText("Drag colored bands to rotate object"); +	gFloaterTools->setStatusText("rotate");  	LLManip::handleSelect();  } @@ -118,8 +118,6 @@ void LLManipRotate::handleDeselect()  {  	mHighlightedPart = LL_NO_PART;  	mManipPart = LL_NO_PART; - -	gFloaterTools->setStatusText("");  	LLManip::handleDeselect();  } @@ -379,14 +377,7 @@ BOOL LLManipRotate::handleMouseDown(S32 x, S32 y, MASK mask)  // Assumes that one of the parts of the manipulator was hit.  BOOL LLManipRotate::handleMouseDownOnPart( S32 x, S32 y, MASK mask )  { -	BOOL can_rotate = mObjectSelection->getObjectCount() != 0; -	for (LLViewerObject* objectp = mObjectSelection->getFirstObject(); -		objectp; -		objectp = mObjectSelection->getNextObject()) -	{ -		can_rotate = can_rotate && objectp->permMove() && (objectp->permModify() || !gSavedSettings.getBOOL("EditLinkedParts")); -	} - +	BOOL can_rotate = canAffectSelection();  	if (!can_rotate)  	{  		return FALSE; @@ -541,12 +532,11 @@ void LLManipRotate::drag( S32 x, S32 y )  	BOOL damped = mSmoothRotate;  	mSmoothRotate = FALSE; -	LLViewerObject* object; -	LLSelectNode* selectNode; - -	for( selectNode = mObjectSelection->getFirstNode(); selectNode != NULL; selectNode = mObjectSelection->getNextNode() ) +	for (LLObjectSelection::iterator iter = mObjectSelection->begin(); +		 iter != mObjectSelection->end(); iter++)  	{ -		object = selectNode->getObject(); +		LLSelectNode* selectNode = *iter; +		LLViewerObject* object = selectNode->getObject();  		// have permission to move and object is root of selection or individually selected  		if (object->permMove() && (object->isRootEdit() || selectNode->mIndividualSelection)) @@ -610,10 +600,12 @@ void LLManipRotate::drag( S32 x, S32 y )  	}  	// update positions -	for( selectNode = mObjectSelection->getFirstNode(); selectNode != NULL; selectNode = mObjectSelection->getNextNode() ) +	for (LLObjectSelection::iterator iter = mObjectSelection->begin(); +		 iter != mObjectSelection->end(); iter++)  	{ -		object = selectNode->getObject(); -		 +		LLSelectNode* selectNode = *iter; +		LLViewerObject* object = selectNode->getObject(); +  		// to avoid cumulative position changes we calculate the objects new position using its saved position  		if (object && object->permMove())  		{ @@ -711,10 +703,10 @@ void LLManipRotate::drag( S32 x, S32 y )  	}  	// store changes to override updates -	for (LLSelectNode* selectNode = gSelectMgr->getSelection()->getFirstNode(); -		 selectNode != NULL; -		 selectNode = gSelectMgr->getSelection()->getNextNode()) +	for (LLObjectSelection::iterator iter = gSelectMgr->getSelection()->begin(); +		 iter != gSelectMgr->getSelection()->end(); iter++)  	{ +		LLSelectNode* selectNode = *iter;  		LLViewerObject*cur = selectNode->getObject();  		if( cur->permModify() && cur->permMove() && !cur->isAvatar())  		{ @@ -1869,3 +1861,22 @@ S32 LLManipRotate::getObjectAxisClosestToMouse(LLVector3& object_axis)  	return axis_index;  } + +//virtual +BOOL LLManipRotate::canAffectSelection() +{ +	BOOL can_rotate = mObjectSelection->getObjectCount() != 0; +	if (can_rotate) +	{ +		struct f : public LLSelectedObjectFunctor +		{ +			virtual bool apply(LLViewerObject* objectp) +			{ +				return objectp->permMove() && (objectp->permModify() || !gSavedSettings.getBOOL("EditLinkedParts")); +			} +		} func; +		can_rotate = mObjectSelection->applyToObjects(&func); +	} +	return can_rotate; +} + diff --git a/indra/newview/llmaniprotate.h b/indra/newview/llmaniprotate.h index 62eddb3120..460bd3fcba 100644 --- a/indra/newview/llmaniprotate.h +++ b/indra/newview/llmaniprotate.h @@ -66,9 +66,10 @@ public:  	virtual void	handleSelect();  	virtual void	handleDeselect(); -	BOOL			handleMouseDownOnPart(S32 x, S32 y, MASK mask); +	virtual BOOL	handleMouseDownOnPart(S32 x, S32 y, MASK mask);  	virtual void	highlightManipulators(S32 x, S32 y); -	EManipPart		getHighlightedPart() { return mHighlightedPart; } +	virtual BOOL	canAffectSelection(); +	  private:  	void			updateHoverView(); @@ -111,7 +112,6 @@ private:  	EManipPart			mManipPart;  	BOOL				mSendUpdateOnMouseUp; -	EManipPart			mHighlightedPart;  	BOOL				mSmoothRotate;  	BOOL				mCamEdgeOn; diff --git a/indra/newview/llmanipscale.cpp b/indra/newview/llmanipscale.cpp index 9ff802770b..7df5311aa4 100644 --- a/indra/newview/llmanipscale.cpp +++ b/indra/newview/llmanipscale.cpp @@ -162,7 +162,7 @@ void LLManipScale::handleSelect()  	LLBBox bbox = gSelectMgr->getBBoxOfSelection();  	updateSnapGuides(bbox);  	gSelectMgr->saveSelectedObjectTransform(SELECT_ACTION_TYPE_PICK); -	gFloaterTools->setStatusText("Click and drag to stretch selected side"); +	gFloaterTools->setStatusText("scale");  	LLManip::handleSelect();  } @@ -170,7 +170,6 @@ void LLManipScale::handleDeselect()  {  	mHighlightedPart = LL_NO_PART;  	mManipPart = LL_NO_PART; -	gFloaterTools->setStatusText("");  	LLManip::handleDeselect();  } @@ -185,7 +184,6 @@ LLManipScale::LLManipScale( LLToolComposite* composite )  	mBoxHandleSize( 1.f ),  	mScaledBoxHandleSize( 1.f ),  	mManipPart( LL_NO_PART ), -	mHighlightedPart( LL_NO_PART ),  	mLastMouseX( -1 ),  	mLastMouseY( -1 ),  	mSendUpdateOnMouseUp( FALSE ), @@ -217,7 +215,7 @@ void LLManipScale::render()  	LLGLEnable gl_blend(GL_BLEND);  	LLGLEnable gls_alpha_test(GL_ALPHA_TEST); -	if( isSelectionScalable() ) +	if( canAffectSelection() )  	{  		glMatrixMode(GL_MODELVIEW);  		glPushMatrix(); @@ -336,14 +334,7 @@ BOOL LLManipScale::handleMouseDown(S32 x, S32 y, MASK mask)  // Assumes that one of the arrows on an object was hit.  BOOL LLManipScale::handleMouseDownOnPart( S32 x, S32 y, MASK mask )  { -	BOOL can_scale = mObjectSelection->getObjectCount() != 0; -	for (LLViewerObject* objectp = mObjectSelection->getFirstObject(); -		objectp; -		objectp = mObjectSelection->getNextObject()) -	{ -		can_scale = can_scale && objectp->permModify() && objectp->permMove() && !objectp->isSeat(); -	} - +	BOOL can_scale = canAffectSelection();  	if (!can_scale)  	{  		return FALSE; @@ -447,7 +438,7 @@ void LLManipScale::highlightManipulators(S32 x, S32 y)  	// Don't do this with nothing selected, as it kills the framerate.  	LLBBox bbox = gSelectMgr->getBBoxOfSelection(); -	if( isSelectionScalable() ) +	if( canAffectSelection() )  	{  		LLMatrix4 transform;  		if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) @@ -827,10 +818,10 @@ void LLManipScale::drag( S32 x, S32 y )  	}  	// store changes to override updates -	for (LLSelectNode* selectNode = gSelectMgr->getSelection()->getFirstNode(); -		 selectNode != NULL; -		 selectNode = gSelectMgr->getSelection()->getNextNode()) +	for (LLObjectSelection::iterator iter = gSelectMgr->getSelection()->begin(); +		 iter != gSelectMgr->getSelection()->end(); iter++)  	{ +		LLSelectNode* selectNode = *iter;  		LLViewerObject*cur = selectNode->getObject();  		if( cur->permModify() && cur->permMove() && !cur->isAvatar())  		{ @@ -974,9 +965,10 @@ void LLManipScale::dragCorner( S32 x, S32 y )  	F32 min_scale_factor = MIN_OBJECT_SCALE / MAX_OBJECT_SCALE;  	// find max and min scale factors that will make biggest object hit max absolute scale and smallest object hit min absolute scale -	LLSelectNode* selectNode; -	for( selectNode = mObjectSelection->getFirstNode(); selectNode; selectNode = mObjectSelection->getNextNode() ) +	for (LLObjectSelection::iterator iter = mObjectSelection->begin(); +		 iter != mObjectSelection->end(); iter++)  	{ +		LLSelectNode* selectNode = *iter;  		LLViewerObject* cur = selectNode->getObject();  		if(  cur->permModify() && cur->permMove() && !cur->isAvatar() )  		{ @@ -995,8 +987,10 @@ void LLManipScale::dragCorner( S32 x, S32 y )  	LLVector3d drag_global = uniform ? mDragStartCenterGlobal : mDragFarHitGlobal;  	// do the root objects i.e. (TRUE == cur->isRootEdit()) -	for( selectNode = mObjectSelection->getFirstNode(); selectNode; selectNode = mObjectSelection->getNextNode() ) +	for (LLObjectSelection::iterator iter = mObjectSelection->begin(); +		 iter != mObjectSelection->end(); iter++)  	{ +		LLSelectNode* selectNode = *iter;  		LLViewerObject* cur = selectNode->getObject();  		if( cur->permModify() && cur->permMove() && !cur->isAvatar() && cur->isRootEdit() )  		{ @@ -1039,8 +1033,10 @@ void LLManipScale::dragCorner( S32 x, S32 y )  		}  	}  	// do the child objects i.e. (FALSE == cur->isRootEdit()) -	for( selectNode = mObjectSelection->getFirstNode(); selectNode; selectNode = mObjectSelection->getNextNode() ) +	for (LLObjectSelection::iterator iter = mObjectSelection->begin(); +		 iter != mObjectSelection->end(); iter++)  	{ +		LLSelectNode* selectNode = *iter;  		LLViewerObject*cur = selectNode->getObject();  		if( cur->permModify() && cur->permMove() && !cur->isAvatar() && !cur->isRootEdit() )  		{ @@ -1245,9 +1241,10 @@ void LLManipScale::stretchFace( const LLVector3& drag_start_agent, const LLVecto  {  	LLVector3 drag_start_center_agent = gAgent.getPosAgentFromGlobal(mDragStartCenterGlobal); -	LLSelectNode *selectNode; -	for( selectNode = mObjectSelection->getFirstNode(); selectNode; selectNode = mObjectSelection->getNextNode() ) +	for (LLObjectSelection::iterator iter = mObjectSelection->begin(); +		 iter != mObjectSelection->end(); iter++)  	{ +		LLSelectNode* selectNode = *iter;  		LLViewerObject*cur = selectNode->getObject();  		if( cur->permModify() && cur->permMove() && !cur->isAvatar() )  		{ @@ -2040,23 +2037,22 @@ LLVector3 LLManipScale::nearestAxis( const LLVector3& v ) const  	return LLVector3( coords[greatest_index] );  } -//FIXME: make this const once we switch to iterator interface  -//(making object traversal a const-able operation) -BOOL LLManipScale::isSelectionScalable() +// virtual +BOOL LLManipScale::canAffectSelection()  {  	// An selection is scalable if you are allowed to both edit and move   	// everything in it, and it does not have any sitting agents -	BOOL scalable = mObjectSelection->getFirstObject() ? TRUE : FALSE; -	for(LLViewerObject* cur = mObjectSelection->getFirstObject();  -		cur;  -		cur = mObjectSelection->getNextObject() ) +	BOOL can_scale = mObjectSelection->getObjectCount() != 0; +	if (can_scale)  	{ -		if( !(cur->permModify() && cur->permMove()) -			|| cur->isSeat()) +		struct f : public LLSelectedObjectFunctor  		{ -			scalable = FALSE; -			break; -		} -	}	 -	return scalable; +			virtual bool apply(LLViewerObject* objectp) +			{ +				return objectp->permModify() && objectp->permMove() && !objectp->isSeat(); +			} +		} func; +		can_scale = mObjectSelection->applyToObjects(&func); +	} +	return can_scale;  } diff --git a/indra/newview/llmanipscale.h b/indra/newview/llmanipscale.h index 13686fa38d..3ea5ee7d7a 100644 --- a/indra/newview/llmanipscale.h +++ b/indra/newview/llmanipscale.h @@ -78,9 +78,9 @@ public:  	virtual void	handleSelect();  	virtual void	handleDeselect(); -	BOOL			handleMouseDownOnPart(S32 x, S32 y, MASK mask); -	EManipPart		getHighlightedPart() { return mHighlightedPart; } +	virtual BOOL	handleMouseDownOnPart(S32 x, S32 y, MASK mask);  	virtual void	highlightManipulators(S32 x, S32 y);	// decided which manipulator, if any, should be highlighted by mouse hover +	virtual BOOL	canAffectSelection();  	static void		setUniform( BOOL b );  	static BOOL		getUniform(); @@ -117,8 +117,6 @@ private:  	F32				partToMinScale( S32 part, const LLBBox& bbox ) const;  	LLVector3		nearestAxis( const LLVector3& v ) const; -	BOOL			isSelectionScalable(); -  	void			stretchFace( const LLVector3& drag_start_agent, const LLVector3& drag_delta_agent);  	void			adjustTextureRepeats();		// Adjusts texture coords based on mSavedScale and current scale, only works for boxes @@ -133,7 +131,6 @@ private:  	LLVector3d		mDragStartCenterGlobal;	// The center of the bounding box of all selected objects at time of drag start  	LLVector3d		mDragPointGlobal;  	LLVector3d 		mDragFarHitGlobal; -	EManipPart		mHighlightedPart;  	S32				mLastMouseX;  	S32				mLastMouseY;  	BOOL			mSendUpdateOnMouseUp; diff --git a/indra/newview/llmaniptranslate.cpp b/indra/newview/llmaniptranslate.cpp index c43ef73090..1f52f30c88 100644 --- a/indra/newview/llmaniptranslate.cpp +++ b/indra/newview/llmaniptranslate.cpp @@ -261,7 +261,7 @@ LLManipTranslate::~LLManipTranslate()  void LLManipTranslate::handleSelect()  {  	gSelectMgr->saveSelectedObjectTransform(SELECT_ACTION_TYPE_PICK); -	gFloaterTools->setStatusText("Drag to move, shift-drag to copy"); +	gFloaterTools->setStatusText("move");  	LLManip::handleSelect();  } @@ -269,7 +269,6 @@ void LLManipTranslate::handleDeselect()  {  	mHighlightedPart = LL_NO_PART;  	mManipPart = LL_NO_PART; -	gFloaterTools->setStatusText("");  	LLManip::handleDeselect();  } @@ -296,14 +295,7 @@ BOOL LLManipTranslate::handleMouseDown(S32 x, S32 y, MASK mask)  // Assumes that one of the arrows on an object was hit.  BOOL LLManipTranslate::handleMouseDownOnPart( S32 x, S32 y, MASK mask )  { -	BOOL can_move = mObjectSelection->getObjectCount() != 0; -	for (LLViewerObject* objectp = mObjectSelection->getFirstObject(); -		objectp; -		objectp = mObjectSelection->getNextObject()) -	{ -		can_move = can_move && objectp->permMove() && (objectp->permModify() || !gSavedSettings.getBOOL("EditLinkedParts")); -	} - +	BOOL can_move = canAffectSelection();  	if (!can_move)  	{  		return FALSE; @@ -431,8 +423,6 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask)  		}  	} -	LLViewerObject	*object; -  	// Suppress processing if mouse hasn't actually moved.  	// This may cause problems if the camera moves outside of the  	// rotation above. @@ -491,7 +481,7 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask)  		return TRUE;  	} -	object = selectNode->getObject(); +	LLViewerObject* object = selectNode->getObject();  	if (!object)  	{  		// somehow we lost the object! @@ -654,11 +644,11 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask)  	LLVector3d clamped_relative_move = axis_magnitude * axis_d;	// scalar multiply  	LLVector3 clamped_relative_move_f = (F32)axis_magnitude * axis_f; // scalar multiply -	for(selectNode = mObjectSelection->getFirstNode();  -		selectNode;  -		selectNode = mObjectSelection->getNextNode() ) +	for (LLObjectSelection::iterator iter = mObjectSelection->begin(); +		 iter != mObjectSelection->end(); iter++)  	{ -		object = selectNode->getObject(); +		LLSelectNode* selectNode = *iter; +		LLViewerObject* object = selectNode->getObject();  		// Only apply motion to root objects and objects selected  		// as "individual". @@ -1739,12 +1729,8 @@ void LLManipTranslate::renderText()  	}  	else  	{ -		LLViewerObject* objectp = mObjectSelection->getFirstRootObject(); -		if(!objectp) -		{ -			objectp = mObjectSelection->getFirstObject(); -		} - +		const BOOL children_ok = TRUE; +		LLViewerObject* objectp = mObjectSelection->getFirstRootObject(children_ok);  		if (objectp)  		{  			renderXYZ(objectp->getPositionEdit()); @@ -2264,3 +2250,21 @@ void LLManipTranslate::renderGridVert(F32 x_trans, F32 y_trans, F32 r, F32 g, F3  	}  } + +// virtual +BOOL LLManipTranslate::canAffectSelection() +{ +	BOOL can_move = mObjectSelection->getObjectCount() != 0; +	if (can_move) +	{ +		struct f : public LLSelectedObjectFunctor +		{ +			virtual bool apply(LLViewerObject* objectp) +			{ +				return objectp->permMove() && (objectp->permModify() || !gSavedSettings.getBOOL("EditLinkedParts")); +			} +		} func; +		can_move = mObjectSelection->applyToObjects(&func); +	} +	return can_move; +} diff --git a/indra/newview/llmaniptranslate.h b/indra/newview/llmaniptranslate.h index b1f211d355..8821b64c90 100644 --- a/indra/newview/llmaniptranslate.h +++ b/indra/newview/llmaniptranslate.h @@ -64,9 +64,9 @@ public:  	virtual void	handleSelect();  	virtual void	handleDeselect(); -	EManipPart		getHighlightedPart() { return mHighlightedPart; }  	virtual void	highlightManipulators(S32 x, S32 y); -	/*virtual*/ BOOL	handleMouseDownOnPart(S32 x, S32 y, MASK mask); +	virtual BOOL	handleMouseDownOnPart(S32 x, S32 y, MASK mask); +	virtual BOOL	canAffectSelection();  protected:  	enum EHandleType { @@ -107,7 +107,6 @@ private:  	LLTimer		mUpdateTimer;  	LLLinkedList<ManipulatorHandle>		mProjectedManipulators;  	LLVector4	mManipulatorVertices[18]; -	EManipPart	mHighlightedPart;  	F32			mSnapOffsetMeters;  	LLVector3	mSnapOffsetAxis;  	LLQuaternion mGridRotation; diff --git a/indra/newview/llmutelist.h b/indra/newview/llmutelist.h index ed675ec1b4..23e0620ade 100644 --- a/indra/newview/llmutelist.h +++ b/indra/newview/llmutelist.h @@ -60,7 +60,7 @@ public:  		flagAll				= 0x0000000F		// Mask of all currently defined flags  	}; -	LLMute(const LLUUID& id, const LLString& name = "", EType type = BY_NAME, U32 flags = 0)  +	LLMute(const LLUUID& id, const LLString& name = LLString(), EType type = BY_NAME, U32 flags = 0)   	: mID(id), mName(name), mType(type),mFlags(flags) { }  	// Returns name + suffix based on type diff --git a/indra/newview/llnamebox.cpp b/indra/newview/llnamebox.cpp index f5a9045f2b..b5021eff9c 100644 --- a/indra/newview/llnamebox.cpp +++ b/indra/newview/llnamebox.cpp @@ -57,7 +57,7 @@ LLNameBox::LLNameBox(const std::string& name, const LLRect& rect, const LLUUID&  	}  	else  	{ -		setText(""); +		setText(LLString::null);  	}  } diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp index 8f66035f2e..adcc141bb1 100644 --- a/indra/newview/llnamelistctrl.cpp +++ b/indra/newview/llnamelistctrl.cpp @@ -157,7 +157,7 @@ void LLNameListCtrl::addGroupNameItem(LLScrollListItem* item, EAddPosition pos)  	gCacheName->getGroupName(item->getUUID(), group_name);  	LLScrollListCell* cell = (LLScrollListCell*)item->getColumn(mNameColumnIndex); -	((LLScrollListText*)cell)->setText( group_name ); +	((LLScrollListText*)cell)->setText( LLString(group_name) );  	addItem(item, pos);  } @@ -461,3 +461,4 @@ LLView* LLNameListCtrl::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFacto  } + diff --git a/indra/newview/lloverlaybar.cpp b/indra/newview/lloverlaybar.cpp index c941ce3bb5..d8131c27d7 100644 --- a/indra/newview/lloverlaybar.cpp +++ b/indra/newview/lloverlaybar.cpp @@ -360,8 +360,7 @@ void LLOverlayBar::refresh()  	{  		LLParcel* parcel = gParcelMgr->getAgentParcel();  		if (!parcel  -			|| !parcel->getMusicURL() -			|| !parcel->getMusicURL()[0] +			|| parcel->getMusicURL().empty()  			|| !gSavedSettings.getBOOL("AudioStreamingMusic"))  		{  			mMusicRemote->setVisible(FALSE); @@ -509,7 +508,7 @@ void LLOverlayBar::musicPlay(void*)  			// stream is stopped, it doesn't return the right thing - commenting out for now.  // 			if ( gAudiop->isInternetStreamPlaying() == 0 )  			{ -				gAudiop->startInternetStream(parcel->getMusicURL()); +				gAudiop->startInternetStream(parcel->getMusicURL().c_str());  			}  		}  	} diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp index 4fbdeb46f6..dc2f14fcef 100644 --- a/indra/newview/llpanelavatar.cpp +++ b/indra/newview/llpanelavatar.cpp @@ -87,36 +87,6 @@  std::list<LLPanelAvatar*> LLPanelAvatar::sAllPanels;  BOOL LLPanelAvatar::sAllowFirstLife = FALSE; -//----------------------------------------------------------------------------- -// Constants -//----------------------------------------------------------------------------- - -// RN: move these to lldbstrings.h -static const S32 DB_USER_FAVORITES_STR_LEN = 254; - -const char LOADING_MSG[] = "Loading..."; -static const char IM_DISABLED_TOOLTIP[] = "Instant Message (IM).\nDisabled because you do not have their card."; -static const char IM_ENABLED_TOOLTIP[] = "Instant Message (IM)"; -static const S32 LEFT = HPAD; - -static const S32 RULER0 = 65; -static const S32 RULER1 = RULER0 + 5; -static const S32 RULER2 = RULER1 + 90; -static const S32 RULER3 = RULER2 + 90; -static const S32 RULER4 = RULER3 + 10; - -static const S32 PICT_WIDTH  = 180; -static const S32 PICT_HEIGHT = 135; - -static const S32 RULER5  = RULER4 + 140; -static const S32 WIDTH = RULER5 + 16; - -static const S32 MAX_CHARS = 254; - -static const LLColor4 WHITE(1,1,1,1); -static const LLColor4 BLACK(0,0,0,1); -static const LLColor4 CLEAR(0,0,0,0); -  extern void handle_lure(const LLUUID& invitee);  extern void handle_pay_by_id(const LLUUID& payee); @@ -317,8 +287,8 @@ void LLPanelAvatarSecondLife::updatePartnerName()  		BOOL found = gCacheName->getName(mPartnerID, first, last);  		if (found)  		{ -			childSetTextArg("partner_edit", "[FIRST]", first); -			childSetTextArg("partner_edit", "[LAST]", last); +			childSetTextArg("partner_edit", "[FIRST]", LLString(first)); +			childSetTextArg("partner_edit", "[LAST]", LLString(last));  		}  	}  } @@ -339,8 +309,8 @@ void LLPanelAvatarSecondLife::clearControls()  	childSetValue("born", "");  	childSetValue("acct", ""); -	childSetTextArg("partner_edit", "[FIRST]", ""); -	childSetTextArg("partner_edit", "[LAST]", ""); +	childSetTextArg("partner_edit", "[FIRST]", LLString::null); +	childSetTextArg("partner_edit", "[LAST]", LLString::null);  	mPartnerID = LLUUID::null; @@ -376,7 +346,7 @@ void LLPanelAvatarSecondLife::enableControls(BOOL self)  		// appears to reset the read only background color when  		// setEnable is called, for some reason  		LLTextEditor* about = LLUICtrlFactory::getTextEditorByName(this,"about"); -		if (about) about->setReadOnlyBgColor(CLEAR); +		if (about) about->setReadOnlyBgColor(LLColor4::transparent);  	}  } @@ -756,10 +726,10 @@ void LLPanelAvatarAdvanced::enableControls(BOOL self)  		// This is because the LLTextEditor  		// appears to reset the read only background color when  		// setEnable is called, for some reason -		if (mWantToEdit) mWantToEdit->setReadOnlyBgColor(CLEAR); -		if (mSkillsEdit) mSkillsEdit->setReadOnlyBgColor(CLEAR); +		if (mWantToEdit) mWantToEdit->setReadOnlyBgColor(LLColor4::transparent); +		if (mSkillsEdit) mSkillsEdit->setReadOnlyBgColor(LLColor4::transparent);  		LLLineEditor* languages_edit = (LLLineEditor*)getChildByName("languages_edit"); -		languages_edit->setReadOnlyBgColor(CLEAR); +		languages_edit->setReadOnlyBgColor(LLColor4::transparent);  	}  } @@ -834,7 +804,7 @@ void LLPanelAvatarNotes::refresh()  void LLPanelAvatarNotes::clearControls()  { -	childSetText("notes edit", LOADING_MSG); +	childSetText("notes edit", childGetText("Loading"));  	childSetEnabled("notes edit", false);  } @@ -1515,7 +1485,6 @@ void LLPanelAvatar::setAvatarID(const LLUUID &avatar_id, const LLString &name,  			childSetVisible("Instant Message...",TRUE);  			childSetEnabled("Instant Message...",FALSE); -			childSetToolTip("Instant Message...",IM_ENABLED_TOOLTIP);  			childSetVisible("Mute",TRUE);  			childSetEnabled("Mute",FALSE); @@ -1778,7 +1747,7 @@ void LLPanelAvatar::sendAvatarNotesUpdate()  	std::string notes = mPanelNotes->childGetValue("notes edit").asString();  	if (!mHaveNotes -		&& (notes.empty() || notes == LOADING_MSG)) +		&& (notes.empty() || notes == childGetText("Loading")))  	{  		// no notes from server and no user updates  		return; diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp index 95d2541fc5..0c3edf1242 100644 --- a/indra/newview/llpanelclassified.cpp +++ b/indra/newview/llpanelclassified.cpp @@ -355,8 +355,7 @@ void LLPanelClassified::initNewClassified()  	// delay commit until user hits save  	// sendClassifiedInfoUpdate(); -	mUpdateBtn->setLabelSelected("Publish..."); -	mUpdateBtn->setLabelUnselected("Publish..."); +	mUpdateBtn->setLabel(childGetText("publish_txt"));  } @@ -575,8 +574,8 @@ void LLPanelClassified::processClassifiedInfoReply(LLMessageSystem *msg, void **  		self->mPosGlobal = pos_global;  		// Update UI controls -        self->mNameEditor->setText(name); -        self->mDescEditor->setText(desc); +        self->mNameEditor->setText(LLString(name)); +        self->mDescEditor->setText(LLString(desc));          self->mSnapshotCtrl->setImageAssetID(snapshot_id);          self->mLocationEditor->setText(location_text);  		self->mLocationChanged = false; @@ -596,8 +595,7 @@ void LLPanelClassified::processClassifiedInfoReply(LLMessageSystem *msg, void **  		// If we got data from the database, we know the listing is paid for.  		self->mPaidFor = TRUE; -		self->mUpdateBtn->setLabelSelected("Update"); -		self->mUpdateBtn->setLabelUnselected("Update"); +		self->mUpdateBtn->setLabel(self->childGetText("update_txt"));      }  } diff --git a/indra/newview/llpanelcontents.cpp b/indra/newview/llpanelcontents.cpp index ec966d2fc5..50ff7bd9eb 100644 --- a/indra/newview/llpanelcontents.cpp +++ b/indra/newview/llpanelcontents.cpp @@ -138,11 +138,8 @@ void LLPanelContents::getState(LLViewerObject *objectp )  void LLPanelContents::refresh()  { -	LLViewerObject* object = gSelectMgr->getSelection()->getFirstRootObject(); -	if(!object) -	{ -		object = gSelectMgr->getSelection()->getFirstObject(); -	} +	const BOOL children_ok = TRUE; +	LLViewerObject* object = gSelectMgr->getSelection()->getFirstRootObject(children_ok);  	getState(object);  	if (mPanelInventory) @@ -160,11 +157,8 @@ void LLPanelContents::refresh()  // static  void LLPanelContents::onClickNewScript(void *userdata)  { -	LLViewerObject* object = gSelectMgr->getSelection()->getFirstRootObject(); -	if(!object) -	{ -		object = gSelectMgr->getSelection()->getFirstObject(); -	} +	const BOOL children_ok = TRUE; +	LLViewerObject* object = gSelectMgr->getSelection()->getFirstRootObject(children_ok);  	if(object)  	{  		LLPermissions perm; diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp index 57d1a57a70..63e25d9f2d 100644 --- a/indra/newview/llpanelface.cpp +++ b/indra/newview/llpanelface.cpp @@ -255,35 +255,32 @@ void LLPanelFace::sendAlpha()  } - -void LLPanelFace::sendTextureInfo() +struct LLPanelFaceSetTEFunctor : public LLSelectedTEFunctor  { -	S32 te; -	LLViewerObject* object; -	LLObjectSelectionHandle selection = gSelectMgr->getSelection(); -	for ( selection->getFirstTE(&object, &te); object; selection->getNextTE(&object, &te) ) +	LLPanelFaceSetTEFunctor(LLPanelFace* panel) : mPanel(panel) {} +	virtual bool apply(LLViewerObject* object, S32 te)  	{  		BOOL valid;  		F32 value; -		LLSpinCtrl*	mCtrlTexScaleS = LLViewerUICtrlFactory::getSpinnerByName(this,"TexScaleU"); -		LLSpinCtrl*	mCtrlTexScaleT = LLViewerUICtrlFactory::getSpinnerByName(this,"TexScaleV"); -		LLSpinCtrl*	mCtrlTexOffsetS = LLViewerUICtrlFactory::getSpinnerByName(this,"TexOffsetU"); -		LLSpinCtrl*	mCtrlTexOffsetT = LLViewerUICtrlFactory::getSpinnerByName(this,"TexOffsetV"); -		LLSpinCtrl*	mCtrlTexRotation = LLViewerUICtrlFactory::getSpinnerByName(this,"TexRot"); -		LLCheckBoxCtrl*	mCheckFlipScaleS = LLViewerUICtrlFactory::getCheckBoxByName(this,"checkbox flip s"); -		LLCheckBoxCtrl*	mCheckFlipScaleT = LLViewerUICtrlFactory::getCheckBoxByName(this,"checkbox flip t"); -		LLComboBox*		mComboTexGen = LLViewerUICtrlFactory::getComboBoxByName(this,"combobox texgen"); -		if (mCtrlTexScaleS) +		LLSpinCtrl*	ctrlTexScaleS = LLViewerUICtrlFactory::getSpinnerByName(mPanel,"TexScaleU"); +		LLSpinCtrl*	ctrlTexScaleT = LLViewerUICtrlFactory::getSpinnerByName(mPanel,"TexScaleV"); +		LLSpinCtrl*	ctrlTexOffsetS = LLViewerUICtrlFactory::getSpinnerByName(mPanel,"TexOffsetU"); +		LLSpinCtrl*	ctrlTexOffsetT = LLViewerUICtrlFactory::getSpinnerByName(mPanel,"TexOffsetV"); +		LLSpinCtrl*	ctrlTexRotation = LLViewerUICtrlFactory::getSpinnerByName(mPanel,"TexRot"); +		LLCheckBoxCtrl*	checkFlipScaleS = LLViewerUICtrlFactory::getCheckBoxByName(mPanel,"checkbox flip s"); +		LLCheckBoxCtrl*	checkFlipScaleT = LLViewerUICtrlFactory::getCheckBoxByName(mPanel,"checkbox flip t"); +		LLComboBox*		comboTexGen = LLViewerUICtrlFactory::getComboBoxByName(mPanel,"combobox texgen"); +		if (ctrlTexScaleS)  		{ -			valid = !mCtrlTexScaleS->getTentative() || !mCheckFlipScaleS->getTentative(); +			valid = !ctrlTexScaleS->getTentative() || !checkFlipScaleS->getTentative();  			if (valid)  			{ -				value = mCtrlTexScaleS->get(); -				if( mCheckFlipScaleS->get() ) +				value = ctrlTexScaleS->get(); +				if( checkFlipScaleS->get() )  				{  					value = -value;  				} -				if (mComboTexGen->getCurrentIndex() == 1) +				if (comboTexGen->getCurrentIndex() == 1)  				{  					value *= 0.5f;  				} @@ -291,17 +288,17 @@ void LLPanelFace::sendTextureInfo()  			}  		} -		if (mCtrlTexScaleT) +		if (ctrlTexScaleT)  		{ -			valid = !mCtrlTexScaleT->getTentative() || !mCheckFlipScaleT->getTentative(); +			valid = !ctrlTexScaleT->getTentative() || !checkFlipScaleT->getTentative();  			if (valid)  			{ -				value = mCtrlTexScaleT->get(); -				if( mCheckFlipScaleT->get() ) +				value = ctrlTexScaleT->get(); +				if( checkFlipScaleT->get() )  				{  					value = -value;  				} -				if (mComboTexGen->getCurrentIndex() == 1) +				if (comboTexGen->getCurrentIndex() == 1)  				{  					value *= 0.5f;  				} @@ -309,41 +306,57 @@ void LLPanelFace::sendTextureInfo()  			}  		} -		if (mCtrlTexOffsetS) +		if (ctrlTexOffsetS)  		{ -			valid = !mCtrlTexOffsetS->getTentative(); +			valid = !ctrlTexOffsetS->getTentative();  			if (valid)  			{ -				value = mCtrlTexOffsetS->get(); +				value = ctrlTexOffsetS->get();  				object->setTEOffsetS( te, value );  			}  		} -		if (mCtrlTexOffsetT) +		if (ctrlTexOffsetT)  		{ -			valid = !mCtrlTexOffsetT->getTentative(); +			valid = !ctrlTexOffsetT->getTentative();  			if (valid)  			{ -				value = mCtrlTexOffsetT->get(); +				value = ctrlTexOffsetT->get();  				object->setTEOffsetT( te, value );  			}  		} -		if (mCtrlTexRotation) +		if (ctrlTexRotation)  		{ -			valid = !mCtrlTexRotation->getTentative(); +			valid = !ctrlTexRotation->getTentative();  			if (valid)  			{ -				value = mCtrlTexRotation->get() * DEG_TO_RAD; +				value = ctrlTexRotation->get() * DEG_TO_RAD;  				object->setTERotation( te, value );  			}  		} +		return true;  	} +private: +	LLPanelFace* mPanel; +}; -	for ( object = gSelectMgr->getSelection()->getFirstObject(); object; object = gSelectMgr->getSelection()->getNextObject() ) +struct LLPanelFaceSendFunctor : public LLSelectedObjectFunctor +{ +	virtual bool apply(LLViewerObject* object)  	{  		object->sendTEUpdate(); +		return true;  	} +}; + +void LLPanelFace::sendTextureInfo() +{ +	LLPanelFaceSetTEFunctor setfunc(this); +	gSelectMgr->getSelection()->applyToTEs(&setfunc); + +	LLPanelFaceSendFunctor sendfunc; +	gSelectMgr->getSelection()->applyToObjects(&sendfunc);  }  void LLPanelFace::getState() @@ -371,43 +384,58 @@ void LLPanelFace::getState()  			}  		childSetEnabled("button apply",editable); +		bool identical; +		LLTextureCtrl*	texture_ctrl = LLViewerUICtrlFactory::getTexturePickerByName(this,"texture control"); +		  		// Texture -		LLUUID id; -		BOOL identical = gSelectMgr->selectionGetTexUUID(id); -		LLTextureCtrl*	mTextureCtrl = LLViewerUICtrlFactory::getTexturePickerByName(this,"texture control"); -		if (identical)  		{ -			// All selected have the same texture -			if(mTextureCtrl){ -				mTextureCtrl->setTentative( FALSE ); -				mTextureCtrl->setEnabled( editable ); -				mTextureCtrl->setImageAssetID( id ); -			} -		} -		else -		{ -			if(mTextureCtrl){ -				if( id.isNull() ) +			LLUUID id; +			struct f1 : public LLSelectedTEGetFunctor<LLUUID> +			{ +				LLUUID get(LLViewerObject* object, S32 te) +				{ +					LLViewerImage* image = object->getTEImage(te); +					return image ? image->getID() : LLUUID::null; +				} +			} func; +			identical = gSelectMgr->getSelection()->getSelectedTEValue( &func, id ); +			 +			if (identical) +			{ +				// All selected have the same texture +				if(texture_ctrl)  				{ -					// None selected -					mTextureCtrl->setTentative( FALSE ); -					mTextureCtrl->setEnabled( FALSE ); -					mTextureCtrl->setImageAssetID( LLUUID::null ); +					texture_ctrl->setTentative( FALSE ); +					texture_ctrl->setEnabled( editable ); +					texture_ctrl->setImageAssetID( id );  				} -				else +			} +			else +			{ +				if(texture_ctrl)  				{ -					// Tentative: multiple selected with different textures -					mTextureCtrl->setTentative( TRUE ); -					mTextureCtrl->setEnabled( editable ); -					mTextureCtrl->setImageAssetID( id ); +					if( id.isNull() ) +					{ +						// None selected +						texture_ctrl->setTentative( FALSE ); +						texture_ctrl->setEnabled( FALSE ); +						texture_ctrl->setImageAssetID( LLUUID::null ); +					} +					else +					{ +						// Tentative: multiple selected with different textures +						texture_ctrl->setTentative( TRUE ); +						texture_ctrl->setEnabled( editable ); +						texture_ctrl->setImageAssetID( id ); +					}  				}  			}  		} - +		  		LLAggregatePermissions texture_perms; -		if(mTextureCtrl) +		if(texture_ctrl)  		{ -// 			mTextureCtrl->setValid( editable ); +// 			texture_ctrl->setValid( editable );  			if (gSelectMgr->selectGetAggregateTexturePermissions(texture_perms))  			{ @@ -417,11 +445,11 @@ void LLPanelFace::getState()  				BOOL can_transfer =   					texture_perms.getValue(PERM_TRANSFER) == LLAggregatePermissions::AP_EMPTY ||   					texture_perms.getValue(PERM_TRANSFER) == LLAggregatePermissions::AP_ALL; -				mTextureCtrl->setCanApplyImmediately(can_copy && can_transfer); +				texture_ctrl->setCanApplyImmediately(can_copy && can_transfer);  			}  			else  			{ -				mTextureCtrl->setCanApplyImmediately(FALSE); +				texture_ctrl->setCanApplyImmediately(FALSE);  			}  		} @@ -430,7 +458,14 @@ void LLPanelFace::getState()  			childSetEnabled("tex scale",editable);  			//mLabelTexScale->setEnabled( editable );  			F32 scale_s = 1.f; -			identical = allFacesSameValue( &LLPanelFace::valueScaleS, &scale_s ); +			struct f2 : public LLSelectedTEGetFunctor<F32> +			{ +				F32 get(LLViewerObject* object, S32 face) +				{ +					return object->getTE(face)->mScaleS; +				} +			} func; +			identical = gSelectMgr->getSelection()->getSelectedTEValue( &func, scale_s );  			childSetValue("TexScaleU",editable ? llabs(scale_s) : 0);  			childSetTentative("TexScaleU",LLSD((BOOL)(!identical)));  			childSetEnabled("TexScaleU",editable); @@ -441,7 +476,14 @@ void LLPanelFace::getState()  		{  			F32 scale_t = 1.f; -			identical = allFacesSameValue( &LLPanelFace::valueScaleT, &scale_t ); +			struct f3 : public LLSelectedTEGetFunctor<F32> +			{ +				F32 get(LLViewerObject* object, S32 face) +				{ +					return object->getTE(face)->mScaleS; +				} +			} func; +			identical = gSelectMgr->getSelection()->getSelectedTEValue( &func, scale_t );  			childSetValue("TexScaleV",llabs(editable ? llabs(scale_t) : 0));  			childSetTentative("TexScaleV",LLSD((BOOL)(!identical))); @@ -455,7 +497,14 @@ void LLPanelFace::getState()  		{  			childSetEnabled("tex offset",editable);  			F32 offset_s = 0.f; -			identical = allFacesSameValue( &LLPanelFace::valueOffsetS, &offset_s ); +			struct f4 : public LLSelectedTEGetFunctor<F32> +			{ +				F32 get(LLViewerObject* object, S32 face) +				{ +					return object->getTE(face)->mOffsetS; +				} +			} func; +			identical = gSelectMgr->getSelection()->getSelectedTEValue( &func, offset_s );  			childSetValue("TexOffsetU", editable ? offset_s : 0);  			childSetTentative("TexOffsetU",!identical);  			childSetEnabled("TexOffsetU",editable); @@ -463,7 +512,14 @@ void LLPanelFace::getState()  		{  			F32 offset_t = 0.f; -			identical = allFacesSameValue( &LLPanelFace::valueOffsetT, &offset_t ); +			struct f5 : public LLSelectedTEGetFunctor<F32> +			{ +				F32 get(LLViewerObject* object, S32 face) +				{ +					return object->getTE(face)->mOffsetT; +				} +			} func; +			identical = gSelectMgr->getSelection()->getSelectedTEValue( &func, offset_t );  			childSetValue("TexOffsetV", editable ? offset_t : 0);  			childSetTentative("TexOffsetV",!identical);  			childSetEnabled("TexOffsetV",editable); @@ -473,7 +529,14 @@ void LLPanelFace::getState()  		{  			childSetEnabled("tex rotate",editable);  			F32 rotation = 0.f; -			identical = allFacesSameValue( &LLPanelFace::valueTexRotation, &rotation ); +			struct f6 : public LLSelectedTEGetFunctor<F32> +			{ +				F32 get(LLViewerObject* object, S32 face) +				{ +					return object->getTE(face)->mRotation; +				} +			} func; +			identical = gSelectMgr->getSelection()->getSelectedTEValue( &func, rotation );  			childSetValue("TexRot", editable ? rotation * RAD_TO_DEG : 0);  			childSetTentative("TexRot",!identical);  			childSetEnabled("TexRot",editable); @@ -484,7 +547,15 @@ void LLPanelFace::getState()  		LLColor4 color = LLColor4::white;  		if(mColorSwatch)  		{ -			identical = gSelectMgr->selectionGetColor(color); +			struct f7 : public LLSelectedTEGetFunctor<LLColor4> +			{ +				LLColor4 get(LLViewerObject* object, S32 face) +				{ +					return object->getTE(face)->getColor(); +				} +			} func; +			identical = gSelectMgr->getSelection()->getSelectedTEValue( &func, color ); +			  			mColorSwatch->setOriginal(color);  			mColorSwatch->set(color, TRUE); @@ -506,7 +577,14 @@ void LLPanelFace::getState()  		// Bump  		{  			F32 shinyf = 0.f; -			identical = allFacesSameValue( &LLPanelFace::valueShiny, &shinyf ); +			struct f8 : public LLSelectedTEGetFunctor<F32> +			{ +				F32 get(LLViewerObject* object, S32 face) +				{ +					return (F32)(object->getTE(face)->getShiny()); +				} +			} func; +			identical = gSelectMgr->getSelection()->getSelectedTEValue( &func, shinyf );  			LLCtrlSelectionInterface* combobox_shininess =  			      childGetSelectionInterface("combobox shininess");  			if (combobox_shininess) @@ -524,7 +602,14 @@ void LLPanelFace::getState()  		{  			F32 bumpf = 0.f; -			identical = allFacesSameValue( &LLPanelFace::valueBump, &bumpf ); +			struct f9 : public LLSelectedTEGetFunctor<F32> +			{ +				F32 get(LLViewerObject* object, S32 face) +				{ +					return (F32)(object->getTE(face)->getBumpmap()); +				} +			} func; +			identical = gSelectMgr->getSelection()->getSelectedTEValue( &func, bumpf );  			LLCtrlSelectionInterface* combobox_bumpiness =  			      childGetSelectionInterface("combobox bumpiness");  			if (combobox_bumpiness) @@ -542,7 +627,14 @@ void LLPanelFace::getState()  		{  			F32 genf = 0.f; -			identical = allFacesSameValue( &LLPanelFace::valueTexGen, &genf); +			struct f10 : public LLSelectedTEGetFunctor<F32> +			{ +				F32 get(LLViewerObject* object, S32 face) +				{ +					return (F32)(object->getTE(face)->getTexGen()); +				} +			} func; +			identical = gSelectMgr->getSelection()->getSelectedTEValue( &func, genf );  			S32 selected_texgen = ((S32) genf) >> TEM_TEX_GEN_SHIFT;  			LLCtrlSelectionInterface* combobox_texgen =  			      childGetSelectionInterface("combobox texgen"); @@ -573,7 +665,14 @@ void LLPanelFace::getState()  		{  			F32 fullbrightf = 0.f; -			identical = allFacesSameValue( &LLPanelFace::valueFullbright, &fullbrightf ); +			struct f11 : public LLSelectedTEGetFunctor<F32> +			{ +				F32 get(LLViewerObject* object, S32 face) +				{ +					return (F32)(object->getTE(face)->getFullbright()); +				} +			} func; +			identical = gSelectMgr->getSelection()->getSelectedTEValue( &func, fullbrightf );  			childSetValue("checkbox fullbright",(S32)fullbrightf);  			childSetEnabled("checkbox fullbright",editable); @@ -586,9 +685,22 @@ void LLPanelFace::getState()  		}  		// Repeats per meter -		F32 repeats = 1.f; -		identical = allFacesSameValue( &LLPanelFace::valueRepeatsPerMeter, &repeats );  		{ +			F32 repeats = 1.f; +			struct f12 : public LLSelectedTEGetFunctor<F32> +			{ +				F32 get(LLViewerObject* object, S32 face) +				{ +					U32 s_axis = VX; +					U32 t_axis = VY; +					// BUG: Only repeats along S axis +					// BUG: Only works for boxes. +					LLPrimitive::getTESTAxes(face, &s_axis, &t_axis); +					return object->getTE(face)->mScaleS / object->getScale().mV[s_axis]; +				} +			} func;			 +			identical = gSelectMgr->getSelection()->getSelectedTEValue( &func, repeats ); +			  			childSetValue("rptctrl", editable ? repeats : 0);  			childSetTentative("rptctrl",!identical);  			LLComboBox*	mComboTexGen = LLViewerUICtrlFactory::getComboBoxByName(this,"combobox texgen"); @@ -606,12 +718,12 @@ void LLPanelFace::getState()  		clearCtrls();  		// Disable non-UICtrls -		LLTextureCtrl*	mTextureCtrl = LLUICtrlFactory::getTexturePickerByName(this,"texture control");  -		if(mTextureCtrl) +		LLTextureCtrl*	texture_ctrl = LLUICtrlFactory::getTexturePickerByName(this,"texture control");  +		if(texture_ctrl)  		{ -			mTextureCtrl->setImageAssetID( LLUUID::null ); -			mTextureCtrl->setEnabled( FALSE );  // this is a LLUICtrl, but we don't want it to have keyboard focus so we add it as a child, not a ctrl. -// 			mTextureCtrl->setValid(FALSE); +			texture_ctrl->setImageAssetID( LLUUID::null ); +			texture_ctrl->setEnabled( FALSE );  // this is a LLUICtrl, but we don't want it to have keyboard focus so we add it as a child, not a ctrl. +// 			texture_ctrl->setValid(FALSE);  		}  		LLColorSwatchCtrl* mColorSwatch = LLUICtrlFactory::getColorSwatchByName(this,"colorswatch");  		if(mColorSwatch) @@ -641,115 +753,10 @@ void LLPanelFace::refresh()  	getState();  } - -BOOL LLPanelFace::allFacesSameValue( F32 (get_face_value(LLViewerObject*, S32)), F32 *value) -{ -	LLViewerObject* object; -	S32 te; - -	// Get the value from the primary selected TE -	F32 first_value = *value; -	BOOL got_first = FALSE; -	gSelectMgr->getSelection()->getPrimaryTE(&object, &te); -	if (object) -	{ -		first_value = get_face_value(object, te); -		got_first = true; -	} - -	// Now iterate through all TEs to test for sameness -	BOOL identical = TRUE; -	LLObjectSelectionHandle selection = gSelectMgr->getSelection(); -	for ( selection->getFirstTE(&object, &te); object; selection->getNextTE(&object, &te) ) -	{ -		if (!got_first) -		{ -			first_value = get_face_value(object, te); -			got_first = true; -		} -		if ( get_face_value(object, te) != first_value ) -		{ -			identical = FALSE; -			break; -		} -	} - -	*value = first_value; -	return identical; -} - -  //  // Static functions  // -// static -F32 LLPanelFace::valueRepeatsPerMeter(LLViewerObject* object, S32 face) -{ -	U32 s_axis = VX; -	U32 t_axis = VY; - -	// BUG: Only repeats along S axis -	// BUG: Only works for boxes. -	gSelectMgr->getTESTAxes(object, face, &s_axis, &t_axis); -	return object->getTE(face)->mScaleS / object->getScale().mV[s_axis]; -} - -// static -F32 LLPanelFace::valueScaleS(LLViewerObject* object, S32 face) -{ -	return object->getTE(face)->mScaleS; -} - - -// static -F32 LLPanelFace::valueScaleT(LLViewerObject* object, S32 face) -{ -	return object->getTE(face)->mScaleT; -} - -// static -F32 LLPanelFace::valueOffsetS(LLViewerObject* object, S32 face) -{ -	return object->getTE(face)->mOffsetS; -} - -// static -F32 LLPanelFace::valueOffsetT(LLViewerObject* object, S32 face) -{ -	return object->getTE(face)->mOffsetT; -} - -// static -F32 LLPanelFace::valueTexRotation(LLViewerObject* object, S32 face) -{ -	return object->getTE(face)->mRotation; -} - -// static -F32 LLPanelFace::valueBump(LLViewerObject* object, S32 face) -{ -	return (F32)(object->getTE(face)->getBumpmap()); -} - -// static -F32 LLPanelFace::valueTexGen(LLViewerObject* object, S32 face) -{ -	return (F32)(object->getTE(face)->getTexGen()); -} - -// static -F32 LLPanelFace::valueShiny(LLViewerObject* object, S32 face) -{ -	return (F32)(object->getTE(face)->getShiny()); -} - -// static -F32 LLPanelFace::valueFullbright(LLViewerObject* object, S32 face) -{ -	return (F32)(object->getTE(face)->getFullbright()); -} -  // static  void LLPanelFace::onCommitColor(LLUICtrl* ctrl, void* userdata) @@ -811,13 +818,16 @@ void LLPanelFace::onCommitFullbright(LLUICtrl* ctrl, void* userdata)  BOOL LLPanelFace::onDragTexture(LLUICtrl*, LLInventoryItem* item, void*)  {  	BOOL accept = TRUE; -	LLViewerObject* obj = gSelectMgr->getSelection()->getFirstRootObject(); -	while(accept && obj) +	for (LLObjectSelection::root_iterator iter = gSelectMgr->getSelection()->root_begin(); +		 iter != gSelectMgr->getSelection()->root_end(); iter++)  	{ +		LLSelectNode* node = *iter; +		LLViewerObject* obj = node->getObject();  		if(!LLToolDragAndDrop::isInventoryDropAcceptable(obj, item)) +		{  			accept = FALSE; -		else -			obj = gSelectMgr->getSelection()->getNextRootObject(); +			break; +		}  	}  	return accept;  } @@ -868,14 +878,10 @@ void LLPanelFace::onClickApply(void* userdata)  }  // commit the fit media texture to prim button -void LLPanelFace::onClickAutoFix(void* userdata) -{ -	S32 te; -	LLViewerObject* object; -	// for all selected objects -	LLObjectSelectionHandle selection = gSelectMgr->getSelection(); -	for ( selection->getFirstTE(&object, &te); object; selection->getNextTE(&object, &te) ) +struct LLPanelFaceSetMediaFunctor : public LLSelectedTEFunctor +{ +	virtual bool apply(LLViewerObject* object, S32 te)  	{  		// only do this if it's a media texture  		if ( object->getTE ( te )->getID() ==  LLMediaEngine::getInstance()->getImageUUID () ) @@ -895,13 +901,17 @@ void LLPanelFace::onClickAutoFix(void* userdata)  				object->setTEScaleT( te, scaleT );	// don't need to flip Y anymore since QT does this for us now.  				object->setTEOffsetS( te, -( 1.0f - scaleS ) / 2.0f );  				object->setTEOffsetT( te, -( 1.0f - scaleT ) / 2.0f ); -			}; -		}; -	}; +			} +		} +		return true; +	} +}; -	// not clear why this is in a separate loop but i followed the patter from further up this file just in case. -	for ( object = gSelectMgr->getSelection()->getFirstObject(); object; object = gSelectMgr->getSelection()->getNextObject() ) -	{ -		object->sendTEUpdate(); -	}; +void LLPanelFace::onClickAutoFix(void* userdata) +{ +	LLPanelFaceSetMediaFunctor setfunc; +	gSelectMgr->getSelection()->applyToTEs(&setfunc); + +	LLPanelFaceSendFunctor sendfunc; +	gSelectMgr->getSelection()->applyToObjects(&sendfunc);  } diff --git a/indra/newview/llpanelface.h b/indra/newview/llpanelface.h index ff6ca24599..d680129989 100644 --- a/indra/newview/llpanelface.h +++ b/indra/newview/llpanelface.h @@ -57,11 +57,6 @@ public:  	void			refresh();  protected: -	// Given a callback function that returns an F32, figures out -	// if that F32 is the same for all selected faces.  "value" -	// contains the identical value, or the first object's value. -	BOOL			allFacesSameValue( F32 (get_face_value(LLViewerObject*, S32)), F32 *value); -  	void			getState();  	void			sendTexture();			// applies and sends texture @@ -91,17 +86,6 @@ protected:  	static void		onClickApply(void*);  	static void		onClickAutoFix(void*); - -	static F32		valueScaleS(LLViewerObject* object, S32 face); -	static F32		valueScaleT(LLViewerObject* object, S32 face); -	static F32		valueOffsetS(LLViewerObject* object, S32 face); -	static F32		valueOffsetT(LLViewerObject* object, S32 face); -	static F32		valueTexRotation(LLViewerObject* object, S32 face); -	static F32		valueRepeatsPerMeter(LLViewerObject* object, S32 face); -	static F32		valueBump(LLViewerObject* object, S32 face); -	static F32		valueTexGen(LLViewerObject* object, S32 face); -	static F32		valueShiny(LLViewerObject* object, S32 face); -	static F32		valueFullbright(LLViewerObject* object, S32 face);  };  #endif diff --git a/indra/newview/llpanelgroup.h b/indra/newview/llpanelgroup.h index 982b8cc3b7..19f43ecb88 100644 --- a/indra/newview/llpanelgroup.h +++ b/indra/newview/llpanelgroup.h @@ -60,7 +60,7 @@ public:  	LLPanelGroup(const std::string& filename,  				 const std::string& name,  				 const LLUUID& group_id, -				 const std::string& initial_tab_selected = ""); +				 const std::string& initial_tab_selected = std::string());  	virtual ~LLPanelGroup();  	virtual BOOL postBuild(); diff --git a/indra/newview/llpanelgroupinvite.cpp b/indra/newview/llpanelgroupinvite.cpp index 14ca3c2bff..9bab774a46 100644 --- a/indra/newview/llpanelgroupinvite.cpp +++ b/indra/newview/llpanelgroupinvite.cpp @@ -69,6 +69,7 @@ public:  public:  	LLUUID mGroupID; +	LLString		mLoadingText;  	LLNameListCtrl	*mInvitees;  	LLComboBox      *mRoleNames;  	LLButton		*mOKButton; @@ -395,14 +396,14 @@ void LLPanelGroupInvite::update()  	mPendingUpdate = FALSE;  	if (mImplementation->mGroupName)   	{ -		mImplementation->mGroupName->setText("(loading...)"); +		mImplementation->mGroupName->setText(mImplementation->mLoadingText);  	}  	if ( mImplementation->mRoleNames )   	{  		mStoreSelected = mImplementation->mRoleNames->getCurrentID();  		mImplementation->mRoleNames->clear();  		mImplementation->mRoleNames->removeall(); -		mImplementation->mRoleNames->add("(loading...)", LLUUID::null, ADD_BOTTOM); +		mImplementation->mRoleNames->add(mImplementation->mLoadingText, LLUUID::null, ADD_BOTTOM);  		mImplementation->mRoleNames->setCurrentByID(LLUUID::null);  	} @@ -473,6 +474,7 @@ BOOL LLPanelGroupInvite::postBuild()  {  	BOOL recurse = TRUE; +	mImplementation->mLoadingText = childGetText("loading");  	mImplementation->mRoleNames = (LLComboBox*) getChildByName("role_name",  															   recurse);  	mImplementation->mGroupName = (LLTextBox*) getChildByName("group_name_text", recurse); diff --git a/indra/newview/llpanelgrouplandmoney.cpp b/indra/newview/llpanelgrouplandmoney.cpp index dd5966f823..a6ffe4f922 100644 --- a/indra/newview/llpanelgrouplandmoney.cpp +++ b/indra/newview/llpanelgrouplandmoney.cpp @@ -52,12 +52,93 @@  #include "llfloaterworldmap.h"  #include "llviewermessage.h" -const char LOADING_STRING[]  = "Computing..."; +//////////////////////////////////////////////////////////////////////////// + +class LLGroupMoneyTabEventHandler +{ +public: +	LLGroupMoneyTabEventHandler(LLButton* earlier_button, +								LLButton* later_button, +								LLTextEditor* text_editor, +								LLTabContainerCommon* tab_containerp, +								LLPanel* panelp, +								const LLString& loading_text, +								const LLUUID& group_id, +								S32 interval_length_days, +								S32 max_interval_days); +	virtual ~LLGroupMoneyTabEventHandler(); + +	virtual void requestData(LLMessageSystem* msg); +	virtual void processReply(LLMessageSystem* msg, void** data); + +	virtual void onClickEarlier(); +	virtual void onClickLater(); +	virtual void onClickTab(); + +	static void clickEarlierCallback(void* data); +	static void clickLaterCallback(void* data); +	static void clickTabCallback(void* user_data, bool from_click); + +	static LLMap<LLUUID, LLGroupMoneyTabEventHandler*> sInstanceIDs; +	static std::map<LLPanel*, LLGroupMoneyTabEventHandler*> sTabsToHandlers; +protected: +	class impl; +	impl* mImplementationp; +}; + +class LLGroupMoneyDetailsTabEventHandler : public LLGroupMoneyTabEventHandler +{ +public: +	LLGroupMoneyDetailsTabEventHandler(LLButton* earlier_buttonp, +									   LLButton* later_buttonp, +									   LLTextEditor* text_editorp, +									   LLTabContainerCommon* tab_containerp, +									   LLPanel* panelp, +									   const LLString& loading_text, +									   const LLUUID& group_id); +	virtual ~LLGroupMoneyDetailsTabEventHandler(); + +	virtual void requestData(LLMessageSystem* msg); +	virtual void processReply(LLMessageSystem* msg, void** data); +}; + + +class LLGroupMoneySalesTabEventHandler : public LLGroupMoneyTabEventHandler +{ +public: +	LLGroupMoneySalesTabEventHandler(LLButton* earlier_buttonp, +									 LLButton* later_buttonp, +									 LLTextEditor* text_editorp, +									 LLTabContainerCommon* tab_containerp, +									 LLPanel* panelp, +									 const LLString& loading_text, +									 const LLUUID& group_id); +	virtual ~LLGroupMoneySalesTabEventHandler(); + +	virtual void requestData(LLMessageSystem* msg); +	virtual void processReply(LLMessageSystem* msg, void** data); +}; + +class LLGroupMoneyPlanningTabEventHandler : public LLGroupMoneyTabEventHandler +{ +public: +	LLGroupMoneyPlanningTabEventHandler(LLTextEditor* text_editor, +										LLTabContainerCommon* tab_containerp, +										LLPanel* panelp, +										const LLString& loading_text, +										const LLUUID& group_id); +	virtual ~LLGroupMoneyPlanningTabEventHandler(); + +	virtual void requestData(LLMessageSystem* msg); +	virtual void processReply(LLMessageSystem* msg, void** data); +}; + +////////////////////////////////////////////////////////////////////////////  class LLPanelGroupLandMoney::impl  {  public: -	impl(const LLUUID& group_id); //constructor +	impl(LLPanelGroupLandMoney& panel, const LLUUID& group_id); //constructor  	virtual ~impl();  	void requestGroupLandInfo(); @@ -76,12 +157,10 @@ public:  //member variables  public: -	LLTextBox *mTotalContributedLandp; -	LLTextBox *mTotalLandInUsep; -	LLTextBox *mLandAvailablep; +	LLPanelGroupLandMoney& mPanel; +	  	LLTextBox* mGroupOverLimitTextp;  	LLIconCtrl* mGroupOverLimitIconp; -	LLTextBox* mYourContributionMaxTextp;  	LLLineEditor* mYourContributionEditorp; @@ -107,22 +186,19 @@ public:  //*******************************************  //** LLPanelGroupLandMoney::impl Functions **  //******************************************* -LLPanelGroupLandMoney::impl::impl(const LLUUID& group_id) +LLPanelGroupLandMoney::impl::impl(LLPanelGroupLandMoney& panel, const LLUUID& group_id) +	: mPanel(panel), +	  mGroupID(group_id)  { -	mGroupID = group_id;  	mTransID = LLUUID::null;  	mBeenActivated = false;  	mNeedsSendGroupLandRequest = true;  	mNeedsApply = false; -	mTotalLandInUsep = NULL; -	mTotalContributedLandp = NULL; -	mLandAvailablep = NULL;  	mYourContributionEditorp = NULL;  	mMapButtonp = NULL;  	mGroupParcelsp = NULL; -	mYourContributionMaxTextp = NULL;  	mGroupOverLimitTextp = NULL;  	mGroupOverLimitIconp = NULL; @@ -230,9 +306,7 @@ int LLPanelGroupLandMoney::impl::getStoredContribution()  // Fills in the text field with the contribution, contrib  void LLPanelGroupLandMoney::impl::setYourContributionTextField(int contrib)  { -	char buffer[MAX_STRING];	/* Flawfinder: ignore*/ -	buffer[0] = '\0'; -	snprintf(buffer, sizeof(buffer), "%d", contrib);	/* Flawfinder: ignore*/ +	LLString buffer = llformat("%d", contrib);  	if ( mYourContributionEditorp )  	{ @@ -243,14 +317,7 @@ void LLPanelGroupLandMoney::impl::setYourContributionTextField(int contrib)  void LLPanelGroupLandMoney::impl::setYourMaxContributionTextBox(int max)  { -	char buffer[MAX_STRING];		/*Flawfinder: ignore*/ -	buffer[0] = '\0'; - -	snprintf(buffer, sizeof(buffer), "(%d max)", max);			/* Flawfinder: ignore */ -	if ( mYourContributionMaxTextp ) -	{ -		mYourContributionMaxTextp->setText(buffer); -	} +	mPanel.childSetTextArg("your_contribution_max_value", "[AMOUNT]", llformat("%d", max));  }  //static @@ -309,19 +376,18 @@ void LLPanelGroupLandMoney::impl::processGroupLand(LLMessageSystem* msg)  		{  			// special block which has total contribution  			++first_block; +			  			S32 total_contribution;  			msg->getS32("QueryData", "ActualArea", total_contribution, 0); -			char buffer[MAX_STRING];		/*Flawfinder: ignore*/ -			snprintf(buffer, sizeof(buffer), "%d sq. meters", total_contribution);			/* Flawfinder: ignore */ -			mTotalContributedLandp->setText(buffer); +			mPanel.childSetTextArg("total_contributed_land_value", "[AREA]", llformat("%d", total_contribution)); +  			S32 committed;  			msg->getS32("QueryData", "BillableArea", committed, 0); -			snprintf(buffer, sizeof(buffer), "%d sq. meters", committed);			/* Flawfinder: ignore */ -			mTotalLandInUsep->setText(buffer); +			mPanel.childSetTextArg("total_land_in_use_value", "[AREA]", llformat("%d", committed)); +			  			S32 available = total_contribution - committed; -			snprintf(buffer, sizeof(buffer), "%d sq. meters", available);			/* Flawfinder: ignore */ -			mLandAvailablep->setText(buffer); -			buffer[0] = '\0'; +			mPanel.childSetTextArg("land_available_value", "[AREA]", llformat("%d", available)); +  			if ( mGroupOverLimitTextp && mGroupOverLimitIconp )  			{  				mGroupOverLimitIconp->setVisible(available < 0); @@ -416,7 +482,7 @@ LLPanelGroupLandMoney::LLPanelGroupLandMoney(const std::string& name,  											 const LLUUID& group_id) :  	LLPanelGroupTab(name, group_id)   { -	mImplementationp = new impl(group_id); +	mImplementationp = new impl(*this, group_id);  	//problem what if someone has both the group floater open and the finder  	//open to the same group?  Some maps that map group ids to panels @@ -538,18 +604,10 @@ BOOL LLPanelGroupLandMoney::postBuild()  	bool can_view = gAgent.isInGroup(mGroupID); -	mImplementationp->mTotalLandInUsep =  -		(LLTextBox*) getChildByName("total_land_in_use_value"); -	mImplementationp->mTotalContributedLandp =  -		(LLTextBox*) getChildByName("total_contributed_land_value"); -	mImplementationp->mLandAvailablep =  -		(LLTextBox*) getChildByName("land_available_value");  	mImplementationp->mGroupOverLimitIconp =   		(LLIconCtrl*) getChildByName("group_over_limit_icon");  	mImplementationp->mGroupOverLimitTextp =   		(LLTextBox*) getChildByName("group_over_limit_text"); -	mImplementationp->mYourContributionMaxTextp =  -		(LLTextBox*) getChildByName("your_contribution_max_value");  	mImplementationp->mYourContributionEditorp   		= (LLLineEditor*) getChildByName("your_contribution_line_editor"); @@ -636,7 +694,8 @@ BOOL LLPanelGroupLandMoney::postBuild()  		}  	} - +	LLString loading_text = childGetText("loading_txt"); +	  	//pull out the widgets for the L$ details tab  	earlierp = (LLButton*) getChildByName("earlier_details_button", true);  	laterp = (LLButton*) getChildByName("later_details_button", true); @@ -655,6 +714,7 @@ BOOL LLPanelGroupLandMoney::postBuild()  												   textp,  												   tabcp,  												   panelp, +												   loading_text,  												   mGroupID);  	} @@ -671,6 +731,7 @@ BOOL LLPanelGroupLandMoney::postBuild()  			new LLGroupMoneyPlanningTabEventHandler(textp,  													tabcp,  													panelp, +													loading_text,  													mGroupID);  	} @@ -692,6 +753,7 @@ BOOL LLPanelGroupLandMoney::postBuild()  												 textp,  												 tabcp,  												 panelp, +												 loading_text,  												 mGroupID);  	} @@ -729,7 +791,8 @@ public:  	impl(LLButton* earlier_buttonp,  		 LLButton* later_buttonp,  		 LLTextEditor* text_editorp, -		 LLPanel* panelp, +		 LLPanel* tabpanelp, +		 const LLString& loading_text,  		 const LLUUID& group_id,  		 S32 interval_length_days,  		 S32 max_interval_days); @@ -745,7 +808,7 @@ public:  	LLUUID mGroupID;  	LLUUID mPanelID; -	LLPanel* mPanelp; +	LLPanel* mTabPanelp;  	int mIntervalLength;  	int mMaxInterval; @@ -754,12 +817,15 @@ public:  	LLTextEditor* mTextEditorp;  	LLButton*     mEarlierButtonp;  	LLButton*     mLaterButtonp; + +	LLString mLoadingText;  };  LLGroupMoneyTabEventHandler::impl::impl(LLButton* earlier_buttonp,  										LLButton* later_buttonp,  										LLTextEditor* text_editorp, -										LLPanel* panelp, +										LLPanel* tabpanelp, +										const LLString& loading_text,  										const LLUUID& group_id,  										S32 interval_length_days,  										S32 max_interval_days) @@ -774,7 +840,9 @@ LLGroupMoneyTabEventHandler::impl::impl(LLButton* earlier_buttonp,  	mTextEditorp = text_editorp;  	mEarlierButtonp = earlier_buttonp;  	mLaterButtonp = later_buttonp; -	mPanelp = panelp; +	mTabPanelp = tabpanelp; + +	mLoadingText = loading_text;  }  LLGroupMoneyTabEventHandler::impl::~impl() @@ -806,6 +874,7 @@ void LLGroupMoneyTabEventHandler::impl::updateButtons()  //*******************************************  //** LLGroupMoneyTabEventHandler Functions **  //******************************************* +  LLMap<LLUUID, LLGroupMoneyTabEventHandler*> LLGroupMoneyTabEventHandler::sInstanceIDs;  std::map<LLPanel*, LLGroupMoneyTabEventHandler*> LLGroupMoneyTabEventHandler::sTabsToHandlers; @@ -814,6 +883,7 @@ LLGroupMoneyTabEventHandler::LLGroupMoneyTabEventHandler(LLButton* earlier_butto  														 LLTextEditor* text_editorp,  														 LLTabContainerCommon* tab_containerp,  														 LLPanel* panelp, +														 const LLString& loading_text,  														 const LLUUID& group_id,  														 S32 interval_length_days,  														 S32 max_interval_days) @@ -822,28 +892,26 @@ LLGroupMoneyTabEventHandler::LLGroupMoneyTabEventHandler(LLButton* earlier_butto  								later_buttonp,  								text_editorp,  								panelp, +								loading_text,  								group_id,  								interval_length_days,  								max_interval_days);  	if ( earlier_buttonp )  	{ -		earlier_buttonp->setClickedCallback(LLGroupMoneyTabEventHandler::clickEarlierCallback, -											this); +		earlier_buttonp->setClickedCallback(clickEarlierCallback, this);  	}  	if ( later_buttonp )  	{ -		later_buttonp->setClickedCallback(LLGroupMoneyTabEventHandler::clickLaterCallback, -										  this); +		later_buttonp->setClickedCallback(clickLaterCallback, this);  	}  	mImplementationp->updateButtons();  	if ( tab_containerp && panelp )  	{ -		tab_containerp->setTabChangeCallback(panelp,  -											LLGroupMoneyTabEventHandler::clickTabCallback); +		tab_containerp->setTabChangeCallback(panelp, clickTabCallback);  		tab_containerp->setTabUserData(panelp, this);  	} @@ -854,7 +922,7 @@ LLGroupMoneyTabEventHandler::LLGroupMoneyTabEventHandler(LLButton* earlier_butto  LLGroupMoneyTabEventHandler::~LLGroupMoneyTabEventHandler()  {  	sInstanceIDs.removeData(mImplementationp->mPanelID); -	sTabsToHandlers.erase(mImplementationp->mPanelp); +	sTabsToHandlers.erase(mImplementationp->mTabPanelp);  	delete mImplementationp;  } @@ -879,7 +947,7 @@ void LLGroupMoneyTabEventHandler::onClickEarlier()  {  	if ( mImplementationp->mTextEditorp)   	{ -		mImplementationp->mTextEditorp->setText(LOADING_STRING); +		mImplementationp->mTextEditorp->setText(mImplementationp->mLoadingText);  	}  	mImplementationp->mCurrentInterval++; @@ -892,7 +960,7 @@ void LLGroupMoneyTabEventHandler::onClickLater()  {  	if ( mImplementationp->mTextEditorp )  	{ -		mImplementationp->mTextEditorp->setText(LOADING_STRING); +		mImplementationp->mTextEditorp->setText(mImplementationp->mLoadingText);  	}  	mImplementationp->mCurrentInterval--; @@ -932,12 +1000,14 @@ LLGroupMoneyDetailsTabEventHandler::LLGroupMoneyDetailsTabEventHandler(LLButton*  																	   LLTextEditor* text_editorp,  																	   LLTabContainerCommon* tab_containerp,  																	   LLPanel* panelp, +																	   const LLString& loading_text,  																	   const LLUUID& group_id)  	: LLGroupMoneyTabEventHandler(earlier_buttonp,  								  later_buttonp,  								  text_editorp,  								  tab_containerp,  								  panelp, +								  loading_text,  								  group_id,  								  SUMMARY_INTERVAL,  								  SUMMARY_MAX) @@ -964,7 +1034,7 @@ void LLGroupMoneyDetailsTabEventHandler::requestData(LLMessageSystem* msg)  	if ( mImplementationp->mTextEditorp )  	{ -		mImplementationp->mTextEditorp->setText(LOADING_STRING); +		mImplementationp->mTextEditorp->setText(mImplementationp->mLoadingText);  	}  	LLGroupMoneyTabEventHandler::requestData(msg); @@ -1038,8 +1108,8 @@ void LLGroupMoneyDetailsTabEventHandler::processReply(LLMessageSystem* msg,  }  //static -void LLGroupMoneyDetailsTabEventHandler::processGroupAccountDetailsReply(LLMessageSystem* msg,  -																		 void** data) +void LLPanelGroupLandMoney::processGroupAccountDetailsReply(LLMessageSystem* msg,  +															void** data)  {  	LLUUID agent_id;  	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); @@ -1071,12 +1141,14 @@ LLGroupMoneySalesTabEventHandler::LLGroupMoneySalesTabEventHandler(LLButton* ear  																   LLTextEditor* text_editorp,  																   LLTabContainerCommon* tab_containerp,  																   LLPanel* panelp, +																   const LLString& loading_text,  																   const LLUUID& group_id)  	: LLGroupMoneyTabEventHandler(earlier_buttonp,  								  later_buttonp,  								  text_editorp,  								  tab_containerp,  								  panelp, +								  loading_text,  								  group_id,  								  SUMMARY_INTERVAL,  								  SUMMARY_MAX) @@ -1103,7 +1175,7 @@ void LLGroupMoneySalesTabEventHandler::requestData(LLMessageSystem* msg)  	if ( mImplementationp->mTextEditorp )  	{ -		mImplementationp->mTextEditorp->setText(LOADING_STRING); +		mImplementationp->mTextEditorp->setText(mImplementationp->mLoadingText);  	}  	LLGroupMoneyTabEventHandler::requestData(msg); @@ -1141,7 +1213,7 @@ void LLGroupMoneySalesTabEventHandler::processReply(LLMessageSystem* msg,  	// If this is the first packet, clear the text, don't append.  	// Start with the date. -	if (text == LOADING_STRING) +	if (text == mImplementationp->mLoadingText)  	{  		text.clear(); @@ -1213,8 +1285,8 @@ void LLGroupMoneySalesTabEventHandler::processReply(LLMessageSystem* msg,  }  //static -void LLGroupMoneySalesTabEventHandler::processGroupAccountTransactionsReply(LLMessageSystem* msg,  -																			void** data) +void LLPanelGroupLandMoney::processGroupAccountTransactionsReply(LLMessageSystem* msg,  +																 void** data)  {  	LLUUID agent_id;  	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); @@ -1247,12 +1319,14 @@ void LLGroupMoneySalesTabEventHandler::processGroupAccountTransactionsReply(LLMe  LLGroupMoneyPlanningTabEventHandler::LLGroupMoneyPlanningTabEventHandler(LLTextEditor* text_editorp,  																		 LLTabContainerCommon* tab_containerp,  																		 LLPanel* panelp, +																		 const LLString& loading_text,  																		 const LLUUID& group_id)  	: LLGroupMoneyTabEventHandler(NULL,  								  NULL,  								  text_editorp,  								  tab_containerp,  								  panelp, +								  loading_text,  								  group_id,  								  SUMMARY_INTERVAL,  								  SUMMARY_MAX) @@ -1279,7 +1353,7 @@ void LLGroupMoneyPlanningTabEventHandler::requestData(LLMessageSystem* msg)  	if ( mImplementationp->mTextEditorp )  	{ -		mImplementationp->mTextEditorp->setText(LOADING_STRING); +		mImplementationp->mTextEditorp->setText(mImplementationp->mLoadingText);  	}  	LLGroupMoneyTabEventHandler::requestData(msg); @@ -1382,8 +1456,8 @@ void LLGroupMoneyPlanningTabEventHandler::processReply(LLMessageSystem* msg,  }  //static -void LLGroupMoneyPlanningTabEventHandler::processGroupAccountSummaryReply(LLMessageSystem* msg,  -																		  void** data) +void LLPanelGroupLandMoney::processGroupAccountSummaryReply(LLMessageSystem* msg,  +															void** data)  {  	LLUUID agent_id;  	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); diff --git a/indra/newview/llpanelgrouplandmoney.h b/indra/newview/llpanelgrouplandmoney.h index 319d13a54f..83126f9906 100644 --- a/indra/newview/llpanelgrouplandmoney.h +++ b/indra/newview/llpanelgrouplandmoney.h @@ -59,92 +59,14 @@ public:  	static void processPlacesReply(LLMessageSystem* msg, void**);  	static LLMap<LLUUID, LLPanelGroupLandMoney*> sGroupIDs; -protected: -	class impl; -	impl* mImplementationp; -}; - -class LLGroupMoneyTabEventHandler -{ -public: -	LLGroupMoneyTabEventHandler(LLButton* earlier_button, -								LLButton* later_button, -								LLTextEditor* text_editor, -								LLTabContainerCommon* tab_containerp, -								LLPanel* panelp, -								const LLUUID& group_id, -								S32 interval_length_days, -								S32 max_interval_days); -	virtual ~LLGroupMoneyTabEventHandler(); -	virtual void requestData(LLMessageSystem* msg); -	virtual void processReply(LLMessageSystem* msg, void** data); - -	virtual void onClickEarlier(); -	virtual void onClickLater(); -	virtual void onClickTab(); - -	static void clickEarlierCallback(void* data); -	static void clickLaterCallback(void* data); -	static void clickTabCallback(void* user_data, bool from_click); - -	static LLMap<LLUUID, LLGroupMoneyTabEventHandler*> sInstanceIDs; -	static std::map<LLPanel*, LLGroupMoneyTabEventHandler*> sTabsToHandlers; +	static void processGroupAccountDetailsReply(LLMessageSystem* msg,  void** data); +	static void processGroupAccountTransactionsReply(LLMessageSystem* msg, void** data); +	static void processGroupAccountSummaryReply(LLMessageSystem* msg, void** data); +	  protected:  	class impl;  	impl* mImplementationp;  }; -class LLGroupMoneyDetailsTabEventHandler : public LLGroupMoneyTabEventHandler -{ -public: -	LLGroupMoneyDetailsTabEventHandler(LLButton* earlier_buttonp, -									   LLButton* later_buttonp, -									   LLTextEditor* text_editorp, -									   LLTabContainerCommon* tab_containerp, -									   LLPanel* panelp, -									   const LLUUID& group_id); -	virtual ~LLGroupMoneyDetailsTabEventHandler(); - -	virtual void requestData(LLMessageSystem* msg); -	virtual void processReply(LLMessageSystem* msg, void** data); - -	static void processGroupAccountDetailsReply(LLMessageSystem* msg,  -												void** data); -}; - -class LLGroupMoneySalesTabEventHandler : public LLGroupMoneyTabEventHandler -{ -public: -	LLGroupMoneySalesTabEventHandler(LLButton* earlier_buttonp, -									 LLButton* later_buttonp, -									 LLTextEditor* text_editorp, -									 LLTabContainerCommon* tab_containerp, -									 LLPanel* panelp, -									 const LLUUID& group_id); -	virtual ~LLGroupMoneySalesTabEventHandler(); - -	virtual void requestData(LLMessageSystem* msg); -	virtual void processReply(LLMessageSystem* msg, void** data); - -	static void processGroupAccountTransactionsReply(LLMessageSystem* msg,  -													 void** data); -}; - -class LLGroupMoneyPlanningTabEventHandler : public LLGroupMoneyTabEventHandler -{ -public: -	LLGroupMoneyPlanningTabEventHandler(LLTextEditor* text_editor, -										LLTabContainerCommon* tab_containerp, -										LLPanel* panelp, -										const LLUUID& group_id); -	virtual ~LLGroupMoneyPlanningTabEventHandler(); - -	virtual void requestData(LLMessageSystem* msg); -	virtual void processReply(LLMessageSystem* msg, void** data); - -	static void processGroupAccountSummaryReply(LLMessageSystem* msg, -												void** data); -}; -  #endif // LL_PANEL_GROUP_LAND_MONEY_H diff --git a/indra/newview/llpanelgroupnotices.cpp b/indra/newview/llpanelgroupnotices.cpp index 15aa1ede5c..c7c7912bf2 100644 --- a/indra/newview/llpanelgroupnotices.cpp +++ b/indra/newview/llpanelgroupnotices.cpp @@ -545,8 +545,8 @@ void LLPanelGroupNotices::showNotice(const char* subject,  {  	arrangeNoticeView(VIEW_PAST_NOTICE); -	if(mViewSubject) mViewSubject->setText(subject); -	if(mViewMessage) mViewMessage->setText(message); +	if(mViewSubject) mViewSubject->setText(LLString(subject)); +	if(mViewMessage) mViewMessage->setText(LLString(message));  	if (mInventoryOffer)  	{ diff --git a/indra/newview/llpanelland.cpp b/indra/newview/llpanelland.cpp index a5fc9665ec..d86f81d21d 100644 --- a/indra/newview/llpanelland.cpp +++ b/indra/newview/llpanelland.cpp @@ -120,8 +120,8 @@ void LLPanelLandInfo::refresh()  		childSetVisible("label_area_price",false);  		childSetVisible("label_area",false); -		//mTextPrice->setText(""); -		childSetText("textbox price",""); +		//mTextPrice->setText(LLString::null); +		childSetText("textbox price",LLString::null);  		childSetEnabled("button buy land",FALSE);  		childSetEnabled("button abandon land",FALSE); diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index dda8efd126..292f5c36f8 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -132,8 +132,6 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,  	mHtmlAvailable( TRUE )  {  	mIsFocusRoot = TRUE; -	mMungedPassword[0] = '\0'; -	mIncomingPassword[0] = '\0';  	setBackgroundVisible(FALSE);  	setBackgroundOpaque(TRUE); @@ -346,7 +344,9 @@ void LLPanelLogin::mungePassword(LLUICtrl* caller, void* user_data)  	if (password != self->mIncomingPassword)  	{  		LLMD5 pass((unsigned char *)password.c_str()); -		pass.hex_digest(self->mMungedPassword); +		char munged_password[MD5HEX_STR_SIZE]; +		pass.hex_digest(munged_password); +		self->mMungedPassword = munged_password;  	}  } @@ -559,19 +559,20 @@ void LLPanelLogin::setFields(const std::string& firstname, const std::string& la  		// We don't actually use the password input field,   		// fill it with MAX_PASSWORD characters so we get a   		// nice row of asterixes. -		const char* filler = "123456789!123456"; +		const std::string filler("123456789!123456");  		sInstance->childSetText("password_edit", filler); -		strcpy(sInstance->mIncomingPassword, filler); 		/*Flawfinder: ignore*/ -		strcpy(sInstance->mMungedPassword, password.c_str());	/*Flawfinder: ignore*/ +		sInstance->mIncomingPassword = filler; +		sInstance->mMungedPassword = password;  	}  	else  	{  		// this is a normal text password  		sInstance->childSetText("password_edit", password); -		strncpy(sInstance->mIncomingPassword, password.c_str(), sizeof(sInstance->mIncomingPassword) -1);    /*Flawfinder: ignore*/ -                sInstance->mIncomingPassword[sizeof(sInstance->mIncomingPassword) -1] = '\0'; +		sInstance->mIncomingPassword = password;  		LLMD5 pass((unsigned char *)password.c_str()); -		pass.hex_digest(sInstance->mMungedPassword); +		char munged_password[MD5HEX_STR_SIZE]; +		pass.hex_digest(munged_password); +		sInstance->mMungedPassword = munged_password;  	}  	sInstance->childSetValue("remember_check", remember); @@ -611,7 +612,7 @@ void LLPanelLogin::getFields(LLString &firstname, LLString &lastname, LLString &  	lastname = sInstance->childGetText("last_name_edit");  	LLString::trim(lastname); -	password.assign(  sInstance->mMungedPassword ); +	password = sInstance->mMungedPassword;  	remember = sInstance->childGetValue("remember_check");  } diff --git a/indra/newview/llpanellogin.h b/indra/newview/llpanellogin.h index 4d1908df4c..94e746eb69 100644 --- a/indra/newview/llpanellogin.h +++ b/indra/newview/llpanellogin.h @@ -96,8 +96,8 @@ private:  	void			(*mCallback)(S32 option, void *userdata);  	void*			mCallbackData; -	char mIncomingPassword[DB_USER_PASSWORD_BUF_SIZE];		/*Flawfinder: ignore*/ -	char mMungedPassword[MD5HEX_STR_SIZE];		/*Flawfinder: ignore*/ +	std::string mIncomingPassword; +	std::string mMungedPassword;  	static LLPanelLogin* sInstance;  	static BOOL		sCapslockDidNotification; diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp index 412ca3b53d..cf507098f7 100644 --- a/indra/newview/llpanelobject.cpp +++ b/indra/newview/llpanelobject.cpp @@ -98,7 +98,7 @@ enum {  	MI_HOLE_COUNT  }; -//XUI:translate (depricated, so very low priority) +//*TODO:translate (depricated, so very low priority)  static const LLString LEGACY_FULLBRIGHT_DESC("Fullbright (Legacy)");  BOOL	LLPanelObject::postBuild() @@ -163,7 +163,7 @@ BOOL	LLPanelObject::postBuild()  	mComboMaterial = gUICtrlFactory->getComboBoxByName(this,"material");  	childSetCommitCallback("material",onCommitMaterial,this);  	mComboMaterial->removeall(); -	// XUI:translate +	// *TODO:translate  	LLMaterialInfo *minfop;  	for (minfop = LLMaterialTable::basic.mMaterialInfoList.getFirstData();   		 minfop != NULL;  @@ -509,8 +509,17 @@ void LLPanelObject::getState( )  #endif  	// Update material part -	U8 material_code; -	BOOL material_same = gSelectMgr->selectionGetMaterial(&material_code); +	// slightly inefficient - materials are unique per object, not per TE +	U8 material_code = 0; +	struct f : public LLSelectedTEGetFunctor<U8> +	{ +		U8 get(LLViewerObject* object, S32 te) +		{ +			return object->getMaterial(); +		} +	} func; +	bool material_same = gSelectMgr->getSelection()->getSelectedTEValue( &func, material_code ); +	  	if (editable && single_volume && material_same)  	{  		mComboMaterial->setEnabled( TRUE ); @@ -529,7 +538,8 @@ void LLPanelObject::getState( )  			{  				mComboMaterial->remove(LEGACY_FULLBRIGHT_DESC);  			} -			mComboMaterial->setSimple(LLMaterialTable::basic.getName(material_code)); +			// *TODO:Translate +			mComboMaterial->setSimple(LLString(LLMaterialTable::basic.getName(material_code)));  		}  	}  	else diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp index 5fd80ce80a..3d5723ed7d 100644 --- a/indra/newview/llpanelpermissions.cpp +++ b/indra/newview/llpanelpermissions.cpp @@ -165,33 +165,33 @@ void LLPanelPermissions::refresh()  	{  		// ...nothing selected  		childSetEnabled("perm_modify",false); -		childSetText("perm_modify",""); +		childSetText("perm_modify",LLString::null);  		childSetEnabled("Creator:",false); -		childSetText("Creator Name",""); +		childSetText("Creator Name",LLString::null);  		childSetEnabled("Creator Name",false);  		childSetEnabled("button creator profile",false);  		childSetEnabled("Owner:",false); -		childSetText("Owner Name",""); +		childSetText("Owner Name",LLString::null);  		childSetEnabled("Owner Name",false);  		childSetEnabled("button owner profile",false);  		childSetEnabled("Group:",false); -		childSetText("Group Name",""); +		childSetText("Group Name",LLString::null);  		childSetEnabled("Group Name",false);  		childSetEnabled("button set group",false); -		childSetText("Object Name",""); +		childSetText("Object Name",LLString::null);  		childSetEnabled("Object Name",false);  		childSetEnabled("Name:",false); -		childSetText("Group Name",""); +		childSetText("Group Name",LLString::null);  		childSetEnabled("Group Name",false);  		childSetEnabled("Description:",false); -		childSetText("Object Description",""); +		childSetText("Object Description",LLString::null);  		childSetEnabled("Object Description",false); -		childSetText("prim info",""); +		childSetText("prim info",LLString::null);  		childSetEnabled("prim info",false);  		childSetEnabled("Permissions:",false); @@ -230,7 +230,7 @@ void LLPanelPermissions::refresh()  		}  		childSetEnabled("Price:  L$",false); -		childSetText("EdCost",false); +		childSetText("EdCost",LLString::null);  		childSetEnabled("EdCost",false);  		childSetEnabled("label click action",false); @@ -421,7 +421,7 @@ void LLPanelPermissions::refresh()  	if(!owners_identical)  	{  		childSetEnabled("Price:  L$",false); -		childSetText("EdCost",""); +		childSetText("EdCost",LLString::null);  		childSetEnabled("EdCost",false);  	}  	else if(self_owned || (group_owned && gAgent.hasPowerInGroup(group_id,GP_OBJECT_SET_SALE))) @@ -453,7 +453,7 @@ void LLPanelPermissions::refresh()  	{  		// ...public object  		childSetEnabled("Price:  L$",false); -		childSetText("EdCost",""); +		childSetText("EdCost",LLString::null);  		childSetEnabled("EdCost",false);  	} @@ -501,36 +501,35 @@ void LLPanelPermissions::refresh()  	if( gSavedSettings.getBOOL("DebugPermissions") )  	{ -		char perm_string[10];		/*Flawfinder: ignore*/ +		std::string perm_string;  		if (valid_base_perms)  		{ - -			strcpy(perm_string, "B: ");	/*Flawfinder: ignore*/ -			mask_to_string(base_mask_on, perm_string+3); +			perm_string = "B: "; +			perm_string += mask_to_string(base_mask_on);  			childSetText("B:",perm_string);  			childSetVisible("B:",true); -			strcpy(perm_string, "O: ");	/*Flawfinder: ignore*/ -			mask_to_string(owner_mask_on, perm_string+3); +			perm_string = "O: "; +			perm_string += mask_to_string(owner_mask_on);  			childSetText("O:",perm_string);  			childSetVisible("O:",true); -			strcpy(perm_string, "G: ");	/*Flawfinder: ignore*/ -			mask_to_string(group_mask_on, perm_string+3); +			perm_string = "G: "; +			perm_string += mask_to_string(group_mask_on);  			childSetText("G:",perm_string);  			childSetVisible("G:",true); -			strcpy(perm_string, "E: ");	/*Flawfinder: ignore*/ -			mask_to_string(everyone_mask_on, perm_string+3); +			perm_string = "E: "; +			perm_string += mask_to_string(everyone_mask_on);  			childSetText("E:",perm_string);  			childSetVisible("E:",true); -			strcpy(perm_string, "N: ");	/*Flawfinder: ignore*/ -			mask_to_string(next_owner_mask_on, perm_string+3); +			perm_string = "N: "; +			perm_string += mask_to_string(next_owner_mask_on);  			childSetText("N:",perm_string);  			childSetVisible("N:",true);  		} -		strcpy(perm_string, "F: ");	/*Flawfinder: ignore*/ +		perm_string = "F: ";  		U32 flag_mask = 0x0;  		if (objectp->permMove())  			flag_mask |= PERM_MOVE; @@ -540,7 +539,7 @@ void LLPanelPermissions::refresh()  			flag_mask |= PERM_COPY;  		if (objectp->permTransfer())  			flag_mask |= PERM_TRANSFER; -		mask_to_string(flag_mask, perm_string+3); +		perm_string += mask_to_string(flag_mask);  		childSetText("F:",perm_string);  		childSetVisible("F:",true);  	} @@ -572,9 +571,8 @@ void LLPanelPermissions::refresh()  	if (!has_change_perm_ability && !has_change_sale_ability && !root_selected)  	{ -		// XUI:translate  		// ...must select root to choose permissions -		childSetValue("perm_modify", "Must select entire object to set permissions."); +		childSetValue("perm_modify", childGetText("text modify warning"));  	}  	if (has_change_perm_ability) @@ -1027,9 +1025,8 @@ void LLPanelPermissions::setAllSaleInfo()  	}  } -class LLSelectionPayable : public LLSelectedObjectFunctor +struct LLSelectionPayable : public LLSelectedObjectFunctor  { -public:  	virtual bool apply(LLViewerObject* obj)  	{  		// can pay if you or your parent has money() event in script diff --git a/indra/newview/llpanelpick.cpp b/indra/newview/llpanelpick.cpp index 982056c381..cd251314d3 100644 --- a/indra/newview/llpanelpick.cpp +++ b/indra/newview/llpanelpick.cpp @@ -327,8 +327,7 @@ void LLPanelPick::processPickInfoReply(LLMessageSystem *msg, void **)      S32 region_y = llround((F32)pos_global.mdV[VY]) % REGION_WIDTH_UNITS;  	S32 region_z = llround((F32)pos_global.mdV[VZ]); -    snprintf(buffer, sizeof(buffer), "%s (%d, %d, %d)", sim_name, region_x, region_y, region_z);			/* Flawfinder: ignore */ -    location_text.append(buffer); +    location_text.append(llformat("%s (%d, %d, %d)", sim_name, region_x, region_y, region_z));  	S32 sort_order;      msg->getS32("Data", "SortOrder", sort_order); @@ -356,14 +355,13 @@ void LLPanelPick::processPickInfoReply(LLMessageSystem *msg, void **)  		self->mPosGlobal = pos_global;  		// Update UI controls -        self->mNameEditor->setText(name); -        self->mDescEditor->setText(desc); +        self->mNameEditor->setText(LLString(name)); +        self->mDescEditor->setText(LLString(desc));          self->mSnapshotCtrl->setImageAssetID(snapshot_id);          self->mLocationEditor->setText(location_text);          self->mEnabledCheck->set(enabled); -		snprintf(buffer, sizeof(buffer), "%d", sort_order);			/* Flawfinder: ignore */ -		self->mSortOrderEditor->setText(buffer); +		self->mSortOrderEditor->setText(llformat("%d", sort_order));      }  } diff --git a/indra/newview/llpanelplace.cpp b/indra/newview/llpanelplace.cpp index 696fbe9a4c..2176fdc7c9 100644 --- a/indra/newview/llpanelplace.cpp +++ b/indra/newview/llpanelplace.cpp @@ -156,7 +156,6 @@ void LLPanelPlace::processParcelInfoReply(LLMessageSystem *msg, void **)  	F32		dwell;  	S32		sale_price;  	S32		auction_id; -	char	buffer[256];		/*Flawfinder: ignore*/  	msg->getUUID("AgentData", "AgentID", agent_id );  	msg->getUUID("Data", "ParcelID", parcel_id); @@ -191,29 +190,35 @@ void LLPanelPlace::processParcelInfoReply(LLMessageSystem *msg, void **)  		self->mSnapshotCtrl->setImageAssetID(snapshot_id); -		self->mNameEditor->setText(name); +		self->mNameEditor->setText(LLString(name)); -		self->mDescEditor->setText(desc); +		self->mDescEditor->setText(LLString(desc)); -		LLString info; -		snprintf(buffer, sizeof(buffer), "Traffic: %.0f, Area: %d sq. m.", dwell, actual_area);			/* Flawfinder: ignore */ -		info.append(buffer); +		LLString info_text; +		LLUIString traffic = self->childGetText("traffic_text"); +		traffic.setArg("[TRAFFIC]", llformat("%.0f", dwell)); +		info_text = traffic; +		LLUIString area = self->childGetText("area_text"); +		traffic.setArg("[AREA]", llformat("%d", actual_area)); +		info_text += area;  		if (flags & DFQ_FOR_SALE)  		{ -			snprintf(buffer, sizeof(buffer), ", For Sale for L$%d", sale_price);			/* Flawfinder: ignore */ -			info.append(buffer); +			LLUIString forsale = self->childGetText("forsale_text"); +			traffic.setArg("[PRICE]", llformat("%d", sale_price)); +			info_text += forsale;  		}  		if (auction_id != 0)  		{ -			snprintf(buffer, sizeof(buffer), ", Auction ID %010d", auction_id);			/* Flawfinder: ignore */ -			info.append(buffer); +			LLUIString auction = self->childGetText("auction_text"); +			auction.setArg("[ID]", llformat("%010d", auction_id)); +			info_text += auction;  		} -		self->mInfoEditor->setText(info); +		self->mInfoEditor->setText(info_text);  		S32 region_x = llround(global_x) % REGION_WIDTH_UNITS;  		S32 region_y = llround(global_y) % REGION_WIDTH_UNITS;  		S32 region_z = llround(global_z); -		 +  		// HACK: Flag 0x1 == mature region, otherwise assume PG  		const char* rating = LLViewerRegion::accessToString(SIM_ACCESS_PG);  		if (flags & 0x1) @@ -221,9 +226,9 @@ void LLPanelPlace::processParcelInfoReply(LLMessageSystem *msg, void **)  			rating = LLViewerRegion::accessToString(SIM_ACCESS_MATURE);  		} -		snprintf(buffer, sizeof(buffer), "%s %d, %d, %d (%s)", 			/* Flawfinder: ignore */ -			sim_name, region_x, region_y, region_z, rating); -		self->mLocationEditor->setText(buffer); +		LLString location = llformat("%s %d, %d, %d (%s)",  +									 sim_name, region_x, region_y, region_z, rating); +		self->mLocationEditor->setText(location);  		BOOL show_auction = (auction_id > 0);  		self->mAuctionBtn->setVisible(show_auction); diff --git a/indra/newview/llpreviewgesture.cpp b/indra/newview/llpreviewgesture.cpp index 1f6d62c85c..a9205998e6 100644 --- a/indra/newview/llpreviewgesture.cpp +++ b/indra/newview/llpreviewgesture.cpp @@ -69,6 +69,7 @@  #include "llresmgr.h" +// *TODO: Translate?  const char NONE_LABEL[] = "---";  const char SHIFT_LABEL[] = "Shift";  const char CTRL_LABEL[] = "Ctrl"; @@ -761,17 +762,20 @@ void LLPreviewGesture::refresh()  	mWaitTimeCheck->setVisible(FALSE);  	mWaitTimeEditor->setVisible(FALSE); +	LLString optionstext; +	  	if (have_step)  	{  		// figure out the type, show proper options, update text  		LLGestureStep* step = (LLGestureStep*)step_item->getUserdata();  		EStepType type = step->getType(); +  		switch(type)  		{  		case STEP_ANIMATION:  			{  				LLGestureStepAnimation* anim_step = (LLGestureStepAnimation*)step; -				mOptionsText->setText("Animation to play:"); +				optionstext = childGetText("step_anim");  				mAnimationCombo->setVisible(TRUE);  				mAnimationRadio->setVisible(TRUE);  				mAnimationRadio->setSelectedIndex((anim_step->mFlags & ANIM_FLAG_STOP) ? 1 : 0); @@ -781,7 +785,7 @@ void LLPreviewGesture::refresh()  		case STEP_SOUND:  			{  				LLGestureStepSound* sound_step = (LLGestureStepSound*)step; -				mOptionsText->setText("Sound to play:"); +				optionstext = childGetText("step_sound");  				mSoundCombo->setVisible(TRUE);  				mSoundCombo->setCurrentByID(sound_step->mSoundAssetID);  				break; @@ -789,7 +793,7 @@ void LLPreviewGesture::refresh()  		case STEP_CHAT:  			{  				LLGestureStepChat* chat_step = (LLGestureStepChat*)step; -				mOptionsText->setText("Chat to say:"); +				optionstext = childGetText("step_chat");  				mChatEditor->setVisible(TRUE);  				mChatEditor->setText(chat_step->mChatText);  				break; @@ -797,14 +801,13 @@ void LLPreviewGesture::refresh()  		case STEP_WAIT:  			{  				LLGestureStepWait* wait_step = (LLGestureStepWait*)step; -				mOptionsText->setText("Wait:"); +				optionstext = childGetText("step_wait");  				mWaitAnimCheck->setVisible(TRUE);  				mWaitAnimCheck->set(wait_step->mFlags & WAIT_FLAG_ALL_ANIM);  				mWaitTimeCheck->setVisible(TRUE);  				mWaitTimeCheck->set(wait_step->mFlags & WAIT_FLAG_TIME);  				mWaitTimeEditor->setVisible(TRUE); -				char buffer[16];		/*Flawfinder: ignore*/ -				snprintf(buffer, sizeof(buffer),  "%.1f", (double)wait_step->mWaitSeconds);			/* Flawfinder: ignore */ +				std::string buffer = llformat("%.1f", (double)wait_step->mWaitSeconds);  				mWaitTimeEditor->setText(buffer);  				break;  			} @@ -812,11 +815,8 @@ void LLPreviewGesture::refresh()  			break;  		}  	} -	else -	{ -		// no gesture -		mOptionsText->setText(""); -	} +	 +	mOptionsText->setText(optionstext);  	BOOL active = gGestureManager.isGestureActive(mItemUUID);  	mActiveCheck->set(active); @@ -984,14 +984,14 @@ void LLPreviewGesture::loadUIFromGesture(LLMultiGesture* gesture)  	switch (gesture->mMask)  	{  	default: -	case MASK_NONE: -		mModifierCombo->setSimple( NONE_LABEL ); +	  case MASK_NONE: +		mModifierCombo->setSimple( LLString(NONE_LABEL) );  		break; -	case MASK_SHIFT: -		mModifierCombo->setSimple( SHIFT_LABEL ); +	  case MASK_SHIFT: +		mModifierCombo->setSimple( LLString(SHIFT_LABEL) );  		break; -	case MASK_CONTROL: -		mModifierCombo->setSimple( CTRL_LABEL ); +	  case MASK_CONTROL: +		mModifierCombo->setSimple( LLString(CTRL_LABEL) );  		break;  	} @@ -1734,8 +1734,7 @@ void LLPreviewGesture::onClickPreview(void* data)  		self->mPreviewGesture->mCallbackData = self;  		// set the button title -		self->mPreviewBtn->setLabelSelected("Stop"); -		self->mPreviewBtn->setLabelUnselected("Stop"); +		self->mPreviewBtn->setLabel(self->childGetText("stop_txt"));  		// play it, and delete when done  		gGestureManager.playGesture(self->mPreviewGesture); @@ -1757,8 +1756,7 @@ void LLPreviewGesture::onDonePreview(LLMultiGesture* gesture, void* data)  {  	LLPreviewGesture* self = (LLPreviewGesture*)data; -	self->mPreviewBtn->setLabelSelected("Preview"); -	self->mPreviewBtn->setLabelUnselected("Preview"); +	self->mPreviewBtn->setLabel(self->childGetText("preview_txt"));  	delete self->mPreviewGesture;  	self->mPreviewGesture = NULL; diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp index ccd975addc..620be8f8c6 100644 --- a/indra/newview/llpreviewnotecard.cpp +++ b/indra/newview/llpreviewnotecard.cpp @@ -281,7 +281,7 @@ void LLPreviewNotecard::loadAsset()  			mAssetID = item->getAssetUUID();  			if(mAssetID.isNull())  			{ -				editor->setText(""); +				editor->setText(LLString::null);  				editor->makePristine();  				editor->setEnabled(TRUE);  				mAssetStatus = PREVIEW_ASSET_LOADED; @@ -302,7 +302,7 @@ void LLPreviewNotecard::loadAsset()  						// The object that we're trying to look at disappeared, bail.  						llwarns << "Can't find object " << mObjectUUID << " associated with notecard." << llendl;  						mAssetID.setNull(); -						editor->setText("Unable to find object containing this note."); +						editor->setText(childGetText("no_object"));  						editor->makePristine();  						editor->setEnabled(FALSE);  						mAssetStatus = PREVIEW_ASSET_LOADED; @@ -327,7 +327,7 @@ void LLPreviewNotecard::loadAsset()  		else  		{  			mAssetID.setNull(); -			editor->setText("You are not allowed to view this note."); +			editor->setText(childGetText("not_allowed"));  			editor->makePristine();  			editor->setEnabled(FALSE);  			mAssetStatus = PREVIEW_ASSET_LOADED; @@ -341,7 +341,7 @@ void LLPreviewNotecard::loadAsset()  	}  	else  	{ -		editor->setText(""); +		editor->setText(LLString::null);  		editor->makePristine();  		editor->setEnabled(TRUE);  		mAssetStatus = PREVIEW_ASSET_LOADED; @@ -384,7 +384,7 @@ void LLPreviewNotecard::onLoadComplete(LLVFS *vfs,  			else  			{  				// Version 0 (just text, doesn't include version number) -				previewEditor->setText(buffer); +				previewEditor->setText(LLStringExplicit(buffer));  			}  			previewEditor->makePristine(); diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp index acaa666efa..7eac589640 100644 --- a/indra/newview/llpreviewscript.cpp +++ b/indra/newview/llpreviewscript.cpp @@ -103,11 +103,8 @@ const char HELLO_LSL[] =  	"}\n";  const char HELP_LSL[] = "lsl_guide.html"; -const char DEFAULT_SCRIPT_NAME[] = "New Script"; -const char DEFAULT_SCRIPT_DESC[] = "(No Description)"; - -const char ENABLED_RUNNING_CHECKBOX_LABEL[] = "Running"; -const char DISABLED_RUNNING_CHECKBOX_LABEL[] = "Public Objects cannot run scripts"; +const char DEFAULT_SCRIPT_NAME[] = "New Script"; // *TODO:Translate? +const char DEFAULT_SCRIPT_DESC[] = "(No Description)"; // *TODO:Translate?  // Description and header information @@ -321,7 +318,6 @@ LLScriptEdCore::LLScriptEdCore(  	mFunctions = LLUICtrlFactory::getComboBoxByName(this, "Insert...");  	childSetCommitCallback("Insert...", &LLScriptEdCore::onBtnInsertFunction, this); -	mFunctions->setLabel("Insert...");  	mEditor = LLViewerUICtrlFactory::getViewerTextEditorByName(this, "Script Editor");  	mEditor->setReadOnlyBgColor(gColors.getColor( "ScriptBgReadOnlyColor" ) ); @@ -456,13 +452,13 @@ void LLScriptEdCore::draw()  		S32 line = 0;  		S32 column = 0;  		mEditor->getCurrentLineAndColumn( &line, &column, FALSE );  // don't include wordwrap -		char cursor_pos[STD_STRING_BUF_SIZE];		/*Flawfinder: ignore*/ -		snprintf( cursor_pos, STD_STRING_BUF_SIZE, "Line %d, Column %d", line, column );			/* Flawfinder: ignore */ +		std::string cursor_pos; +		cursor_pos = llformat("Line %d, Column %d", line, column );  		childSetText("line_col", cursor_pos);  	}  	else  	{ -		childSetText("line_col", ""); +		childSetText("line_col", LLString::null);  	}  	updateDynamicHelp(); @@ -985,7 +981,7 @@ void LLScriptEdCore::handleReloadFromServerDialog( S32 option, void* userdata )  	case 0: // "Yes"  		if( self->mLoadCallback )  		{ -			self->mEditor->setText( "Loading..." ); +			self->mEditor->setText( self->childGetText("loading") );  			self->mLoadCallback( self->mUserdata );  		}  		break; @@ -1199,7 +1195,7 @@ void LLPreviewLSL::loadAsset()  		}  		else  		{ -			mScriptEd->mEditor->setText("You are not allowed to view this script."); +			mScriptEd->mEditor->setText(mScriptEd->childGetText("can_not_view"));  			mScriptEd->mEditor->makePristine();  			mScriptEd->mEditor->setEnabled(FALSE);  			mScriptEd->mFunctions->setEnabled(FALSE); @@ -1210,7 +1206,7 @@ void LLPreviewLSL::loadAsset()  	}  	else  	{ -		mScriptEd->mEditor->setText(HELLO_LSL); +		mScriptEd->mEditor->setText(LLString(HELLO_LSL));  		mAssetStatus = PREVIEW_ASSET_LOADED;  	}  } @@ -1517,7 +1513,7 @@ void LLPreviewLSL::onLoadComplete( LLVFS *vfs, const LLUUID& asset_uuid, LLAsset  			// put a EOS at the end  			buffer[file_length] = 0; -			preview->mScriptEd->mEditor->setText(buffer); +			preview->mScriptEd->mEditor->setText(LLStringExplicit(buffer));  			preview->mScriptEd->mEditor->makePristine();  			delete [] buffer;  			LLInventoryItem* item = gInventory.getItem(*item_uuid); @@ -1731,7 +1727,7 @@ void LLLiveLSLEditor::loadAsset(BOOL is_new)  					   || !gAgent.allowOperation(PERM_MODIFY, item->getPermissions(), GP_OBJECT_MANIPULATE))))  			{  				mItem = new LLViewerInventoryItem(item); -				mScriptEd->mEditor->setText("You are not allowed to view this script."); +				mScriptEd->mEditor->setText(childGetText("not_allowed"));  				mScriptEd->mEditor->makePristine();  				mScriptEd->mEditor->setEnabled(FALSE);  				mAssetStatus = PREVIEW_ASSET_LOADED; @@ -1762,7 +1758,7 @@ void LLLiveLSLEditor::loadAsset(BOOL is_new)  			}  			else  			{ -				mScriptEd->mEditor->setText(""); +				mScriptEd->mEditor->setText(LLString::null);  				mScriptEd->mEditor->makePristine();  				mAssetStatus = PREVIEW_ASSET_LOADED;  			} @@ -1797,7 +1793,7 @@ void LLLiveLSLEditor::loadAsset(BOOL is_new)  			// This may be better than having a accessible null pointer around,  			// though this newly allocated object will most likely be replaced.  			mItem = new LLViewerInventoryItem(); -			mScriptEd->mEditor->setText(""); +			mScriptEd->mEditor->setText(LLString::null);  			mScriptEd->mEditor->makePristine();  			mScriptEd->mEditor->setEnabled(FALSE);  			mAssetStatus = PREVIEW_ASSET_LOADED; @@ -1805,8 +1801,8 @@ void LLLiveLSLEditor::loadAsset(BOOL is_new)  	}  	else  	{ -		mScriptEd->mEditor->setText(HELLO_LSL); -		//mScriptEd->mEditor->setText(""); +		mScriptEd->mEditor->setText(LLString(HELLO_LSL)); +		//mScriptEd->mEditor->setText(LLString::null);  		//mScriptEd->mEditor->makePristine();  		LLPermissions perm;  		perm.init(gAgent.getID(), gAgent.getID(), LLUUID::null, gAgent.getGroupID()); @@ -1893,7 +1889,7 @@ void LLLiveLSLEditor::loadScriptText(const char* filename)  		}  		buffer[nread] = '\0';  		fclose(file); -		mScriptEd->mEditor->setText(buffer); +		mScriptEd->mEditor->setText(LLStringExplicit(buffer));  		mScriptEd->mEditor->makePristine();  		delete[] buffer;  	} @@ -1918,7 +1914,7 @@ void LLLiveLSLEditor::loadScriptText(LLVFS *vfs, const LLUUID &uuid, LLAssetType  	buffer[file_length] = '\0'; -	mScriptEd->mEditor->setText(buffer); +	mScriptEd->mEditor->setText(LLStringExplicit(buffer));  	mScriptEd->mEditor->makePristine();  	delete[] buffer; @@ -1985,12 +1981,12 @@ void LLLiveLSLEditor::draw()  		{  			if(object->permAnyOwner())  			{ -				runningCheckbox->setLabel(ENABLED_RUNNING_CHECKBOX_LABEL); +				runningCheckbox->setLabel(childGetText("script_running"));  				runningCheckbox->setEnabled(TRUE);  			}  			else  			{ -				runningCheckbox->setLabel(DISABLED_RUNNING_CHECKBOX_LABEL); +				runningCheckbox->setLabel(childGetText("public_objects_can_not_run"));  				runningCheckbox->setEnabled(FALSE);  				// *FIX: Set it to false so that the ui is correct for  				// a box that is released to public. It could be @@ -2238,7 +2234,7 @@ void LLLiveLSLEditor::uploadAssetLegacy(const std::string& filename,  	// If we successfully saved it, then we should be able to check/uncheck the running box!  	LLCheckBoxCtrl* runningCheckbox = LLUICtrlFactory::getCheckBoxByName(this, "running"); -	runningCheckbox->setLabel(ENABLED_RUNNING_CHECKBOX_LABEL); +	runningCheckbox->setLabel(childGetText("script_running"));  	runningCheckbox->setEnabled(TRUE);  } diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index b7bde1cc8a..af16a4d3fa 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -213,6 +213,11 @@ LLSelectMgr::LLSelectMgr()  //-----------------------------------------------------------------------------  LLSelectMgr::~LLSelectMgr()  { +	clearSelections(); +} + +void LLSelectMgr::clearSelections() +{  	mHoverObjects->deleteAllNodes();  	mSelectedObjects->deleteAllNodes();  	mHighlightedObjects->deleteAllNodes(); @@ -220,21 +225,27 @@ LLSelectMgr::~LLSelectMgr()  	mGridObjects.deleteAllNodes();  } -void LLSelectMgr::updateEffects() +void LLSelectMgr::update()  { +	mSelectedObjects->cleanupNodes(); +} +void LLSelectMgr::updateEffects() +{  	//keep reference grid objects active -	for (LLSelectNode* grid_nodep = mGridObjects.getFirstNode(); -		grid_nodep; -		grid_nodep = mGridObjects.getNextNode()) +	struct f : public LLSelectedObjectFunctor  	{ -		LLViewerObject* grid_object = grid_nodep->getObject(); -		LLDrawable* drawable = grid_object->mDrawable; -		if (drawable) +		virtual bool apply(LLViewerObject* object)  		{ -			gPipeline.markMoved(drawable); +			LLDrawable* drawable = object->mDrawable; +			if (drawable) +			{ +				gPipeline.markMoved(drawable); +			} +			return true;  		} -	} +	} func; +	mGridObjects.applyToObjects(&func);  	if (mEffectsTimer.getElapsedTimeF32() > 1.f)  	{ @@ -246,29 +257,30 @@ void LLSelectMgr::updateEffects()  void LLSelectMgr::overrideObjectUpdates()  {  	//override any position updates from simulator on objects being edited -	LLSelectNode* selectNode; -	for (selectNode = gSelectMgr->getSelection()->getFirstNode(); -		 selectNode != NULL; -		 selectNode = gSelectMgr->getSelection()->getNextNode()) +	struct f : public LLSelectedNodeFunctor  	{ -		LLViewerObject* object = selectNode->getObject(); -		 -		if (object->permMove()) +		virtual bool apply(LLSelectNode* selectNode)  		{ -			if (!selectNode->mLastPositionLocal.isExactlyZero()) +			LLViewerObject* object = selectNode->getObject(); +			if (object->permMove())  			{ -				object->setPosition(selectNode->mLastPositionLocal); -			} -			if (selectNode->mLastRotation != LLQuaternion()) -			{ -				object->setRotation(selectNode->mLastRotation); -			} -			if (!selectNode->mLastScale.isExactlyZero()) -			{ -				object->setScale(selectNode->mLastScale); +				if (!selectNode->mLastPositionLocal.isExactlyZero()) +				{ +					object->setPosition(selectNode->mLastPositionLocal); +				} +				if (selectNode->mLastRotation != LLQuaternion()) +				{ +					object->setRotation(selectNode->mLastRotation); +				} +				if (!selectNode->mLastScale.isExactlyZero()) +				{ +					object->setScale(selectNode->mLastScale); +				}  			} +			return true;  		} -	} +	} func; +	getSelection()->applyToNodes(&func);  }  //----------------------------------------------------------------------------- @@ -417,24 +429,26 @@ LLObjectSelectionHandle LLSelectMgr::selectObjectAndFamily(LLViewerObject* obj,  //-----------------------------------------------------------------------------  // Select the object, parents and children.  //----------------------------------------------------------------------------- -LLObjectSelectionHandle LLSelectMgr::selectObjectAndFamily(const LLDynamicArray<LLViewerObject*>& object_list, -										BOOL send_to_sim) +LLObjectSelectionHandle LLSelectMgr::selectObjectAndFamily(const std::vector<LLViewerObject*>& object_list, +														   BOOL send_to_sim)  {  	// Collect all of the objects, children included  	LLDynamicArray<LLViewerObject*> objects; -	LLViewerObject *object; -	S32 i;  	//clear primary object (no primary object)  	mSelectedObjects->mPrimaryObject = NULL; -	if (object_list.count() < 1) return NULL; - +	if (object_list.size() < 1) +	{ +		return NULL; +	} +	  	// NOTE -- we add the objects in REVERSE ORDER   	// to preserve the order in the mSelectedObjects list -	for (i = object_list.count() - 1; i >= 0; i--) +	for (std::vector<LLViewerObject*>::const_reverse_iterator riter = object_list.rbegin(); +		 riter != object_list.rend(); ++riter)  	{ -		object = object_list.get(i); +		LLViewerObject *object = *riter;  		llassert( object ); @@ -506,44 +520,30 @@ BOOL LLSelectMgr::removeObjectFromSelections(const LLUUID &id)  	// Iterate through selected objects list and kill the object  	if( !object_found )  	{ -		LLViewerObject* prevobjp = NULL; -		for( LLViewerObject* tobjp = mSelectedObjects->getFirstObject(); tobjp != NULL; tobjp = mSelectedObjects->getNextObject() ) +		for (LLObjectSelection::iterator iter = getSelection()->begin(); +			 iter != getSelection()->end(); )  		{ -			if (tobjp == prevobjp) +			LLObjectSelection::iterator curiter = iter++; +			LLViewerObject* object = (*curiter)->getObject(); +			if (object->mID == id)  			{ -				// Somehow we got stuck in an infinite loop... (DaveP) -				//  this logic is kind of twisted, not sure how this is happening, so... -				llwarns << "Detected infinite loop #1 in LLSelectMgr::removeObjectFromSelections:|" << llendl; -				//MikeS. adding warning and comment... -				//These infinite loops happen because the LLSelectMgr iteration routines are non-reentrant. -				//deselectObjectAndFamily uses getFirstObject and getNextObject to mess with the array, -				//resetting the arrays internal iterator state. This needs fixing BAD. -				continue; -			} -			// It's possible the item being removed has an avatar sitting on it -			// So remove the avatar that is sitting on the object. -			if (tobjp->mID == id || tobjp->isAvatar()) -			{ -				if (!gNoRender) +				if (tool)  				{  					tool->stopEditing();  				}  				// lose the selection, don't tell simulator, it knows -				deselectObjectAndFamily(tobjp, FALSE); - -				if (tobjp->mID == id) -				{ -					if(object_found == TRUE){ -						//MikeS. adding warning... This happens when removing a linked attachment while sitting on an object.. -						//I think the selection manager needs to be rewritten. BAD. -						llwarns << "Detected infinite loop #2 in LLSelectMgr::removeObjectFromSelections:|" << llendl; -						break; -					} -					object_found = TRUE; -				} +				deselectObjectAndFamily(object, FALSE); +				object_found = TRUE; +				break; // must break here, may have removed multiple objects from list +			} +			else if (object->isAvatar()) +			{ +				// It's possible the item being removed has an avatar sitting on it +				// So remove the avatar that is sitting on the object. +				deselectObjectAndFamily(object, FALSE); +				break; // must break here, may have removed multiple objects from list  			} -			prevobjp = tobjp;  		}  	} @@ -596,7 +596,7 @@ void LLSelectMgr::deselectObjectAndFamily(LLViewerObject* object, BOOL send_to_s  	S32 select_count = 0;  	LLMessageSystem* msg = gMessageSystem; -	for (S32 i = 0; i < objects.count(); i++) +	for (U32 i = 0; i < objects.size(); i++)  	{  		if (start_new_message)  		{ @@ -659,15 +659,12 @@ void LLSelectMgr::deselectObjectOnly(LLViewerObject* object, BOOL send_to_sim)  // addAsFamily  //----------------------------------------------------------------------------- -void LLSelectMgr::addAsFamily(LLDynamicArray<LLViewerObject*>& objects, BOOL add_to_end) +void LLSelectMgr::addAsFamily(std::vector<LLViewerObject*>& objects, BOOL add_to_end)  { -	S32 count = objects.count(); -	LLViewerObject *objectp = NULL; - -	LLSelectNode *nodep = NULL; -	for (S32 i = 0; i < count; i++) +	for (std::vector<LLViewerObject*>::iterator iter = objects.begin(); +		 iter != objects.end(); ++iter)  	{ -		objectp = objects.get(i); +		LLViewerObject* objectp = *iter;  		// Can't select yourself  		if (objectp->mID == gAgentID @@ -678,7 +675,7 @@ void LLSelectMgr::addAsFamily(LLDynamicArray<LLViewerObject*>& objects, BOOL add  		if (!objectp->isSelected())  		{ -			nodep = new LLSelectNode(objectp, TRUE); +			LLSelectNode *nodep = new LLSelectNode(objectp, TRUE);  			if (add_to_end)  			{  				mSelectedObjects->addNodeAtEnd(nodep); @@ -725,14 +722,14 @@ void LLSelectMgr::addAsIndividual(LLViewerObject *objectp, S32 face, BOOL undoab  	{  		nodep = new LLSelectNode(objectp, TRUE);  		mSelectedObjects->addNode(nodep); +		llassert_always(nodep->getObject());  	}  	else  	{  		// make this a full-fledged selection  		nodep->setTransient(FALSE);  		// Move it to the front of the list -		mSelectedObjects->removeNode(nodep); -		mSelectedObjects->addNode(nodep); +		mSelectedObjects->moveNodeToFront(nodep);  	}  	// Make sure the object is tagged as selected @@ -793,14 +790,11 @@ LLObjectSelectionHandle LLSelectMgr::setHoverObject(LLViewerObject *objectp)  	objectp = objectp->getRootEdit();  	objectp->addThisAndNonJointChildren(objects); - -	S32 count = objects.count(); -	LLViewerObject* cur_objectp = NULL; -	LLSelectNode* nodep = NULL; -	for(S32 i = 0; i < count; i++) +	for (std::vector<LLViewerObject*>::iterator iter = objects.begin(); +		 iter != objects.end(); ++iter)  	{ -		cur_objectp = objects[i]; -		nodep = new LLSelectNode(cur_objectp, FALSE); +		LLViewerObject* cur_objectp = *iter; +		LLSelectNode* nodep = new LLSelectNode(cur_objectp, FALSE);  		mHoverObjects->addNodeAtEnd(nodep);  	} @@ -853,28 +847,30 @@ void LLSelectMgr::highlightObjectAndFamily(LLViewerObject* objectp)  }  // Note that this ignores the "select owned only" flag -// It's also more efficient than calling the single-object version over and -// over. -void LLSelectMgr::highlightObjectAndFamily(const LLDynamicArray<LLViewerObject*>& list) +// It's also more efficient than calling the single-object version over and over. +void LLSelectMgr::highlightObjectAndFamily(const std::vector<LLViewerObject*>& objects)  { -	S32 i; -	S32 count = list.count(); - -	for (i = 0; i < count; i++) +	for (std::vector<LLViewerObject*>::const_iterator iter1 = objects.begin(); +		 iter1 != objects.end(); ++iter1)  	{ -		LLViewerObject* object = list.get(i); +		LLViewerObject* object = *iter1; -		if (!object) continue; -		if (object->getPCode() != LL_PCODE_VOLUME) continue; +		if (!object) +		{ +			continue; +		} +		if (object->getPCode() != LL_PCODE_VOLUME) +		{ +			continue; +		}  		LLViewerObject* root = (LLViewerObject*)object->getRoot();  		mRectSelectedObjects.insert(root); -		S32 j; -		S32 child_count = root->mChildList.size(); -		for (j = 0; j < child_count; j++) +		for (LLViewerObject::child_list_t::const_iterator iter2 = root->mChildList.begin(); +			 iter2 != root->mChildList.end(); ++iter2)  		{ -			LLViewerObject* child = root->mChildList[j]; +			LLViewerObject* child = *iter2;  			mRectSelectedObjects.insert(child);  		}  	} @@ -901,9 +897,11 @@ void LLSelectMgr::unhighlightObjectAndFamily(LLViewerObject* objectp)  	unhighlightObjectOnly(root_obj); -	for(U32 i = 0; i < root_obj->mChildList.size(); i++) +	for (LLViewerObject::child_list_t::iterator iter2 = root_obj->mChildList.begin(); +		 iter2 != root_obj->mChildList.end(); ++iter2)  	{ -		unhighlightObjectOnly(root_obj->mChildList[i]); +		LLViewerObject* child = *iter2; +		unhighlightObjectOnly(child);  	}  } @@ -924,11 +922,12 @@ LLObjectSelectionHandle LLSelectMgr::selectHighlightedObjects()  	//clear primary object  	mSelectedObjects->mPrimaryObject = NULL; -	LLSelectNode *nodep; -	for (nodep = mHighlightedObjects->getFirstNode(); -		nodep; -		nodep = mHighlightedObjects->getNextNode()) +	for (LLObjectSelection::iterator iter = getHighlightedObjects()->begin(); +		 iter != getHighlightedObjects()->end(); )  	{ +		LLObjectSelection::iterator curiter = iter++; +	 +		LLSelectNode *nodep = *curiter;  		LLViewerObject* objectp = nodep->getObject();  		if (!canSelectObject(objectp)) @@ -1000,9 +999,12 @@ void LLSelectMgr::addGridObject(LLViewerObject* objectp)  {  	LLSelectNode* nodep = new LLSelectNode(objectp, FALSE);  	mGridObjects.addNodeAtEnd(nodep); -	for (U32 i = 0; i < objectp->mChildList.size(); i++) + +	for (LLViewerObject::child_list_t::iterator iter2 = objectp->mChildList.begin(); +		 iter2 != objectp->mChildList.end(); ++iter2)  	{ -		nodep = new LLSelectNode(objectp->mChildList[i], FALSE); +		LLViewerObject* child = *iter2; +		nodep = new LLSelectNode(child, FALSE);  		mGridObjects.addNodeAtEnd(nodep);  	}  } @@ -1022,14 +1024,9 @@ void LLSelectMgr::setGridMode(EGridMode mode)  void LLSelectMgr::getGrid(LLVector3& origin, LLQuaternion &rotation, LLVector3 &scale)  { -	LLSelectNode* grid_node = mGridObjects.getFirstNode(); -	LLViewerObject* grid_object = mGridObjects.getFirstObject(); -	// *TODO: get to work with multiple grid objects -	if (grid_node && grid_node->getObject()->isDead()) -	{ -		mGridObjects.removeNode(grid_node); -		grid_object = NULL; -	} +	mGridObjects.cleanupNodes(); +	 +	LLViewerObject* first_grid_object = mGridObjects.getFirstObject();  	if (mGridMode == GRID_MODE_LOCAL && mSelectedObjects->getObjectCount())  	{ @@ -1038,47 +1035,42 @@ void LLSelectMgr::getGrid(LLVector3& origin, LLQuaternion &rotation, LLVector3 &  		mGridRotation = mSavedSelectionBBox.getRotation();  		mGridScale = mSavedSelectionBBox.getExtentLocal() * 0.5f;  	} -	else if (mGridMode == GRID_MODE_REF_OBJECT && grid_object && grid_object->mDrawable.notNull()) +	else if (mGridMode == GRID_MODE_REF_OBJECT && first_grid_object && first_grid_object->mDrawable.notNull())  	{ -		mGridRotation = grid_object->getRenderRotation(); -		LLVector3 first_grid_obj_pos = grid_object->getRenderPosition(); +		mGridRotation = first_grid_object->getRenderRotation(); +		LLVector3 first_grid_obj_pos = first_grid_object->getRenderPosition();  		LLVector3 min_extents(F32_MAX, F32_MAX, F32_MAX); -		LLVector3 max_extents(-min_extents); +		LLVector3 max_extents(-F32_MAX, -F32_MAX, -F32_MAX);  		BOOL grid_changed = FALSE; -		LLSelectNode* grid_nodep; -		for (grid_nodep = mGridObjects.getFirstNode(); -			grid_nodep; -			grid_nodep = mGridObjects.getNextNode()) +		for (LLObjectSelection::iterator iter = mGridObjects.begin(); +			 iter != mGridObjects.end(); ++iter) +		{ +			LLViewerObject* object = (*iter)->getObject(); +			LLDrawable* drawable = object->mDrawable; +			if (drawable)  			{ -				grid_object = grid_nodep->getObject(); -				LLDrawable* drawable = grid_object->mDrawable; -				if (drawable) -				{ -					const LLVector3* ext = drawable->getSpatialExtents(); -					update_min_max(min_extents, max_extents, ext[0]); -					update_min_max(min_extents, max_extents, ext[1]); -					grid_changed = TRUE; -				} +				const LLVector3* ext = drawable->getSpatialExtents(); +				update_min_max(min_extents, max_extents, ext[0]); +				update_min_max(min_extents, max_extents, ext[1]); +				grid_changed = TRUE;  			} +		}  		if (grid_changed)  		{  			mGridOrigin = lerp(min_extents, max_extents, 0.5f); -			LLDrawable* drawable = grid_object->mDrawable; +			LLDrawable* drawable = first_grid_object->mDrawable;  			if (drawable && drawable->isActive())  			{ -				mGridOrigin = mGridOrigin * grid_object->getRenderMatrix(); +				mGridOrigin = mGridOrigin * first_grid_object->getRenderMatrix();  			}  			mGridScale = (max_extents - min_extents) * 0.5f;  		}  	}  	else // GRID_MODE_WORLD or just plain default  	{ -		LLViewerObject* first_object = mSelectedObjects->getFirstRootObject(); -		if (!first_object) -		{ -			first_object = mSelectedObjects->getFirstObject(); -		} +		const BOOL non_root_ok = TRUE; +		LLViewerObject* first_object = mSelectedObjects->getFirstRootObject(non_root_ok);  		mGridOrigin.clearVec();  		mGridRotation.loadIdentity(); @@ -1118,26 +1110,20 @@ void LLSelectMgr::getGrid(LLVector3& origin, LLQuaternion &rotation, LLVector3 &  // remove() - an array of objects  //----------------------------------------------------------------------------- -void LLSelectMgr::remove(LLDynamicArray<LLViewerObject*>& objects) +void LLSelectMgr::remove(std::vector<LLViewerObject*>& objects)  { -	S32 count = objects.count(); -	LLViewerObject *objectp = NULL; -	LLSelectNode *nodep = NULL; -	for(S32 i = 0; i < count; i++) +	for (std::vector<LLViewerObject*>::iterator iter = objects.begin(); +		 iter != objects.end(); ++iter)  	{ -		objectp = objects.get(i); -		for(nodep = mSelectedObjects->getFirstNode(); -			nodep != NULL; -			nodep = mSelectedObjects->getNextNode()) +		LLViewerObject* objectp = *iter; +		LLSelectNode* nodep = mSelectedObjects->findNode(objectp); +		if (nodep)  		{ -			if(nodep->getObject() == objectp) -			{ -				objectp->setSelected(FALSE); -				mSelectedObjects->removeNode(nodep); -				break; -			} +			objectp->setSelected(FALSE); +			mSelectedObjects->removeNode(nodep); +			nodep = NULL;  		} -			} +	}  	updateSelectionCenter();  	dialog_refresh_all();  } @@ -1148,26 +1134,19 @@ void LLSelectMgr::remove(LLDynamicArray<LLViewerObject*>& objects)  //-----------------------------------------------------------------------------  void LLSelectMgr::remove(LLViewerObject *objectp, S32 te, BOOL undoable)  { -	// check if object already in list -	// *FIX: can we just check isSelected()? +	// get object node (and verify it is in the selected list)  	LLSelectNode *nodep = mSelectedObjects->findNode(objectp); -  	if (!nodep)  	{  		return;  	} -  	// if face = all, remove object from list -	if (objectp->getNumTEs() <= 0) -	{ -		// object doesn't have faces, so blow it away -		mSelectedObjects->removeNode(nodep); -		objectp->setSelected( FALSE ); -	} -	else if (te == SELECT_ALL_TES) +	if ((objectp->getNumTEs() <= 0) || (te == SELECT_ALL_TES))  	{ +		// Remove all faces (or the object doesn't have faces) so remove the node  		mSelectedObjects->removeNode(nodep); +		nodep = NULL;  		objectp->setSelected( FALSE );  	}  	else if (0 <= te && te < SELECT_MAX_TES) @@ -1194,9 +1173,9 @@ void LLSelectMgr::remove(LLViewerObject *objectp, S32 te, BOOL undoable)  		if (!found)  		{  			mSelectedObjects->removeNode(nodep); +			nodep = NULL;  			objectp->setSelected( FALSE ); - -			// BUG: Doesn't update simulator that object is gone. +			// *FIXME: Doesn't update simulator that object is no longer selected  		}  	}  	else @@ -1215,14 +1194,15 @@ void LLSelectMgr::remove(LLViewerObject *objectp, S32 te, BOOL undoable)  //-----------------------------------------------------------------------------  void LLSelectMgr::removeAll()  { -	LLViewerObject *objectp; -	for (objectp = mSelectedObjects->getFirstObject(); objectp; objectp = mSelectedObjects->getNextObject() ) +	for (LLObjectSelection::iterator iter = mSelectedObjects->begin(); +		 iter != mSelectedObjects->end(); iter++ )  	{ +		LLViewerObject *objectp = (*iter)->getObject();  		objectp->setSelected( FALSE );  	}  	mSelectedObjects->deleteAllNodes(); - +	  	updateSelectionCenter();  	dialog_refresh_all();  } @@ -1236,19 +1216,19 @@ void LLSelectMgr::promoteSelectionToRoot()  	BOOL selection_changed = FALSE; -	LLSelectNode* nodep; -	LLViewerObject *objectp; -	for (nodep = mSelectedObjects->getFirstNode();  -		 nodep;  -		 nodep = mSelectedObjects->getNextNode() ) +	for (LLObjectSelection::iterator iter = getSelection()->begin(); +		 iter != getSelection()->end(); )  	{ +		LLObjectSelection::iterator curiter = iter++; +		LLSelectNode* nodep = *curiter; +		LLViewerObject* object = nodep->getObject(); +  		if (nodep->mIndividualSelection)  		{  			selection_changed = TRUE;  		} -		objectp = nodep->getObject(); -		LLViewerObject* parentp = objectp; +		LLViewerObject* parentp = object;  		while(parentp->getParent() && !(parentp->isRootEdit() || parentp->isJointChild()))  		{  			parentp = (LLViewerObject*)parentp->getParent(); @@ -1276,19 +1256,21 @@ void LLSelectMgr::demoteSelectionToIndividuals()  {  	LLDynamicArray<LLViewerObject*> objects; -	for (LLViewerObject* root_objectp = mSelectedObjects->getFirstRootObject(); -		root_objectp; -		root_objectp = mSelectedObjects->getNextRootObject()) +	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); +		 iter != getSelection()->root_end(); iter++)  	{ -		root_objectp->addThisAndNonJointChildren(objects); +		LLViewerObject* object = (*iter)->getObject(); +		object->addThisAndNonJointChildren(objects);  	}  	if (objects.getLength())  	{  		deselectAll(); -		for(S32 i = 0; i < objects.count(); i++) +		for (std::vector<LLViewerObject*>::iterator iter = objects.begin(); +			 iter != objects.end(); ++iter)  		{ -			selectObjectOnly(objects[i]); +			LLViewerObject* objectp = *iter; +			selectObjectOnly(objectp);  		}  	}  } @@ -1302,14 +1284,12 @@ void LLSelectMgr::dump()  	llinfos << "TE mode " << mTEMode << llendl; -	S32 i = 0; - -	LLViewerObject *objectp; -	for (objectp = mSelectedObjects->getFirstObject(); -		 objectp; -		 objectp = mSelectedObjects->getNextObject()) +	S32 count = 0; +	for (LLObjectSelection::iterator iter = getSelection()->begin(); +		 iter != getSelection()->end(); iter++ )  	{ -		llinfos << "Object " << i << " type " << LLPrimitive::pCodeToString(objectp->getPCode()) << llendl; +		LLViewerObject* objectp = (*iter)->getObject(); +		llinfos << "Object " << count << " type " << LLPrimitive::pCodeToString(objectp->getPCode()) << llendl;  		llinfos << "  hasLSL " << objectp->flagScripted() << llendl;  		llinfos << "  hasTouch " << objectp->flagHandleTouch() << llendl;  		llinfos << "  hasMoney " << objectp->flagTakesMoney() << llendl; @@ -1320,16 +1300,22 @@ void LLSelectMgr::dump()  		LLDrawable* drawablep = objectp->mDrawable;  		llinfos << "  " << (drawablep&& drawablep->isVisible() ? "visible" : "invisible") << llendl;  		llinfos << "  " << (drawablep&& drawablep->isState(LLDrawable::FORCE_INVISIBLE) ? "force_invisible" : "") << llendl; -		i++; +		count++;  	}  	// Face iterator -	S32 te; -	for (mSelectedObjects->getFirstTE(&objectp, &te); -		 objectp; -		 mSelectedObjects->getNextTE(&objectp, &te)) +	for (LLObjectSelection::iterator iter = getSelection()->begin(); +		 iter != getSelection()->end(); iter++ )  	{ -		llinfos << "Object " << objectp << " te " << te << llendl; +		LLSelectNode* node = *iter; +		LLViewerObject* objectp = node->getObject(); +		for (S32 te = 0; te < objectp->getNumTEs(); ++te ) +		{ +			if (node->isTESelected(te)) +			{ +				llinfos << "Object " << objectp << " te " << te << llendl; +			} +		}  	}  	llinfos << mHighlightedObjects->getNumNodes() << " objects currently highlighted." << llendl; @@ -1350,6 +1336,18 @@ void LLSelectMgr::cleanup()  // Manipulate properties of selected objects  //--------------------------------------------------------------------------- +struct LLSelectMgrSendFunctor : public LLSelectedObjectFunctor +{ +	virtual bool apply(LLViewerObject* object) +	{ +		if (object->permModify()) +		{ +			object->sendTEUpdate(); +		} +		return true; +	} +}; +  //-----------------------------------------------------------------------------  // selectionSetImage()  //----------------------------------------------------------------------------- @@ -1358,7 +1356,6 @@ void LLSelectMgr::selectionSetImage(const LLUUID& imageid)  {  	// First for (no copy) textures and multiple object selection  	LLViewerInventoryItem* item = gInventory.getItem(imageid); -  	if(item   		&& !item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID())  		&& (mSelectedObjects->getNumNodes() > 1) ) @@ -1368,54 +1365,63 @@ void LLSelectMgr::selectionSetImage(const LLUUID& imageid)  		return;  	} -	LLViewerObject* objectp; -	S32 te; - -	for (mSelectedObjects->getFirstTE(&objectp, &te); objectp; mSelectedObjects->getNextTE(&objectp, &te)) +	struct f : public LLSelectedTEFunctor  	{ -		if (item) +		LLViewerInventoryItem* mItem; +		LLUUID mImageID; +		f(LLViewerInventoryItem* item, const LLUUID& id) : mItem(item), mImageID(id) {} +		bool apply(LLViewerObject* objectp, S32 te)  		{ -			if (te == -1) // all faces +			if (mItem)  			{ -				LLToolDragAndDrop::dropTextureAllFaces(objectp, -													   item, -													   LLToolDragAndDrop::SOURCE_AGENT, -													   LLUUID::null); +				if (te == -1) // all faces +				{ +					LLToolDragAndDrop::dropTextureAllFaces(objectp, +														   mItem, +														   LLToolDragAndDrop::SOURCE_AGENT, +														   LLUUID::null); +				} +				else // one face +				{ +					LLToolDragAndDrop::dropTextureOneFace(objectp, +														  te, +														  mItem, +														  LLToolDragAndDrop::SOURCE_AGENT, +														  LLUUID::null); +				}  			} -			else // one face +			else // not an inventory item  			{ -				LLToolDragAndDrop::dropTextureOneFace(objectp, -													  te, -													  item, -													  LLToolDragAndDrop::SOURCE_AGENT, -													  LLUUID::null); +				// Texture picker defaults aren't inventory items +				// * Don't need to worry about permissions for them +				// * Can just apply the texture and be done with it. +				objectp->setTEImage(te, gImageList.getImage(mImageID, TRUE, FALSE));  			} +			return true;  		} -		 -		else // not an inventory item -		{ -			// Texture picker defaults aren't inventory items -			// * Don't need to worry about permissions for them -			// * Can just apply the texture and be done with it. -			objectp->setTEImage(te, gImageList.getImage(imageid)); +	} setfunc(item, imageid); +	getSelection()->applyToTEs(&setfunc); -			objectp->sendTEUpdate(); -		} -	} - - -	// 1 particle effect per object -	if (mSelectedObjects->mSelectType != SELECT_TYPE_HUD) +	struct g : public LLSelectedObjectFunctor  	{ -		for (objectp = mSelectedObjects->getFirstObject(); objectp; objectp = mSelectedObjects->getNextObject()) +		LLViewerInventoryItem* mItem; +		g(LLViewerInventoryItem* item) : mItem(item) {} +		virtual bool apply(LLViewerObject* object)  		{ -			LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)gHUDManager->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE); -			effectp->setSourceObject(gAgent.getAvatarObject());      -			effectp->setTargetObject(objectp);                       -			effectp->setDuration(LL_HUD_DUR_SHORT);                  -			effectp->setColor(LLColor4U(gAgent.getEffectColor()));   +			if (!mItem) +			{ +				object->sendTEUpdate(); +				// 1 particle effect per object				 +				LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)gHUDManager->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE); +				effectp->setSourceObject(gAgent.getAvatarObject()); +				effectp->setTargetObject(object); +				effectp->setDuration(LL_HUD_DUR_SHORT); +				effectp->setColor(LLColor4U(gAgent.getEffectColor())); +			} +			return true;  		} -	} +	} sendfunc(item); +	getSelection()->applyToObjects(&sendfunc);  }  //----------------------------------------------------------------------------- @@ -1423,24 +1429,23 @@ void LLSelectMgr::selectionSetImage(const LLUUID& imageid)  //-----------------------------------------------------------------------------  void LLSelectMgr::selectionSetColor(const LLColor4 &color)  { -	LLViewerObject* object; -	S32 te; -	for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te) ) -	{ -		if (object->permModify()) -		{ -			// update viewer side color in anticipation of update from simulator -			object->setTEColor(te, color); -		} -	} - -	for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() ) +	struct f : public LLSelectedTEFunctor  	{ -		if (object->permModify()) +		LLColor4 mColor; +		f(const LLColor4& c) : mColor(c) {} +		bool apply(LLViewerObject* object, S32 te)  		{ -			object->sendTEUpdate(); +			if (object->permModify()) +			{ +				object->setTEColor(te, mColor); +			} +			return true;  		} -	} +	} setfunc(color); +	getSelection()->applyToTEs(&setfunc); +	 +	LLSelectMgrSendFunctor sendfunc; +	getSelection()->applyToObjects(&sendfunc);  }  //----------------------------------------------------------------------------- @@ -1448,27 +1453,26 @@ void LLSelectMgr::selectionSetColor(const LLColor4 &color)  //-----------------------------------------------------------------------------  void LLSelectMgr::selectionSetColorOnly(const LLColor4 &color)  { -	LLViewerObject* object; -	LLColor4 new_color = color; -	S32 te; -	for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te) ) +	struct f : public LLSelectedTEFunctor  	{ -		if (object->permModify()) +		LLColor4 mColor; +		f(const LLColor4& c) : mColor(c) {} +		bool apply(LLViewerObject* object, S32 te)  		{ -			LLColor4 prev_color = object->getTE(te)->getColor(); -			new_color.mV[VALPHA] = prev_color.mV[VALPHA]; -			// update viewer side color in anticipation of update from simulator -			object->setTEColor(te, new_color); -		} -	} - -	for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() ) -	{ -		if (object->permModify()) -		{ -			object->sendTEUpdate(); +			if (object->permModify()) +			{ +				LLColor4 prev_color = object->getTE(te)->getColor(); +				mColor.mV[VALPHA] = prev_color.mV[VALPHA]; +				// update viewer side color in anticipation of update from simulator +				object->setTEColor(te, mColor); +			} +			return true;  		} -	} +	} setfunc(color); +	getSelection()->applyToTEs(&setfunc); +	 +	LLSelectMgrSendFunctor sendfunc; +	getSelection()->applyToObjects(&sendfunc);  }  //----------------------------------------------------------------------------- @@ -1476,227 +1480,246 @@ void LLSelectMgr::selectionSetColorOnly(const LLColor4 &color)  //-----------------------------------------------------------------------------  void LLSelectMgr::selectionSetAlphaOnly(const F32 alpha)  { -	LLViewerObject* object; -	S32 te; -	for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te) ) +	struct f : public LLSelectedTEFunctor  	{ -		if (object->permModify()) -		{ -			LLColor4 prev_color = object->getTE(te)->getColor(); -			prev_color.mV[VALPHA] = alpha; -			// update viewer side color in anticipation of update from simulator -			object->setTEColor(te, prev_color); -		} -	} - -	for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() ) -	{ -		if (object->permModify()) +		F32 mAlpha; +		f(const F32& a) : mAlpha(a) {} +		bool apply(LLViewerObject* object, S32 te)  		{ -			object->sendTEUpdate(); +			if (object->permModify()) +			{ +				LLColor4 prev_color = object->getTE(te)->getColor(); +				prev_color.mV[VALPHA] = mAlpha; +				// update viewer side color in anticipation of update from simulator +				object->setTEColor(te, prev_color); +			} +			return true;  		} -	} +	} setfunc(alpha); +	getSelection()->applyToTEs(&setfunc); +	 +	LLSelectMgrSendFunctor sendfunc; +	getSelection()->applyToObjects(&sendfunc);  }  void LLSelectMgr::selectionRevertColors()  { -	LLViewerObject* object; -	S32 te; - -	for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te) ) +	struct f : public LLSelectedTEFunctor  	{ -		if (object->permModify()) +		LLObjectSelectionHandle mSelectedObjects; +		f(LLObjectSelectionHandle sel) : mSelectedObjects(sel) {} +		bool apply(LLViewerObject* object, S32 te)  		{ -			LLSelectNode* nodep = mSelectedObjects->findNode(object); -			if (nodep && te < (S32)nodep->mSavedColors.size()) +			if (object->permModify())  			{ -				LLColor4 color = nodep->mSavedColors[te]; -				// update viewer side color in anticipation of update from simulator -				object->setTEColor(te, color); +				LLSelectNode* nodep = mSelectedObjects->findNode(object); +				if (nodep && te < (S32)nodep->mSavedColors.size()) +				{ +					LLColor4 color = nodep->mSavedColors[te]; +					// update viewer side color in anticipation of update from simulator +					object->setTEColor(te, color); +				}  			} +			return true;  		} -	} - -	for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() ) -	{ -		if (object->permModify()) -		{ -			object->sendTEUpdate(); -		} -	} +	} setfunc(mSelectedObjects); +	getSelection()->applyToTEs(&setfunc); +	 +	LLSelectMgrSendFunctor sendfunc; +	getSelection()->applyToObjects(&sendfunc);  }  BOOL LLSelectMgr::selectionRevertTextures()  { -	LLViewerObject* object; -	S32 te; - -	BOOL revert_successful = TRUE; -	for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te) ) +	struct f : public LLSelectedTEFunctor  	{ -		if (object->permModify()) +		LLObjectSelectionHandle mSelectedObjects; +		f(LLObjectSelectionHandle sel) : mSelectedObjects(sel) {} +		bool apply(LLViewerObject* object, S32 te)  		{ -			LLSelectNode* nodep = mSelectedObjects->findNode(object); -			if (nodep && te < (S32)nodep->mSavedTextures.size()) +			if (object->permModify())  			{ -				LLUUID id = nodep->mSavedTextures[te]; -				// update textures on viewer side -				if (id.isNull()) +				LLSelectNode* nodep = mSelectedObjects->findNode(object); +				if (nodep && te < (S32)nodep->mSavedTextures.size())  				{ -					// this was probably a no-copy texture, leave image as-is -					revert_successful = FALSE; -				} -				else -				{ -					object->setTEImage(te, gImageList.getImage(id)); +					LLUUID id = nodep->mSavedTextures[te]; +					// update textures on viewer side +					if (id.isNull()) +					{ +						// this was probably a no-copy texture, leave image as-is +						return FALSE; +					} +					else +					{ +						object->setTEImage(te, gImageList.getImage(id)); +					}  				}  			} +			return true;  		} -	} - -	// propagate texture changes to server -	for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() ) -	{ -		if (object->permModify()) -		{ -			object->sendTEUpdate(); -		} -	} +	} setfunc(mSelectedObjects); +	BOOL revert_successful = getSelection()->applyToTEs(&setfunc); +	 +	LLSelectMgrSendFunctor sendfunc; +	getSelection()->applyToObjects(&sendfunc);  	return revert_successful;  }  void LLSelectMgr::selectionSetBumpmap(U8 bumpmap)  { -	LLViewerObject* object; -	S32 te; -	for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te) ) +	struct f : public LLSelectedTEFunctor  	{ -		if (object->permModify()) +		U8 mBump; +		f(const U8& b) : mBump(b) {} +		bool apply(LLViewerObject* object, S32 te)  		{ -			// update viewer side color in anticipation of update from simulator -			object->setTEBumpmap(te, bumpmap); -		} -	} - -	for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() ) -	{ -		if (object->permModify()) -		{ -			object->sendTEUpdate(); +			if (object->permModify()) +			{ +				// update viewer side color in anticipation of update from simulator +				object->setTEBumpmap(te, mBump); +			} +			return true;  		} -	} +	} setfunc(bumpmap); +	getSelection()->applyToTEs(&setfunc); +	 +	LLSelectMgrSendFunctor sendfunc; +	getSelection()->applyToObjects(&sendfunc);  }  void LLSelectMgr::selectionSetTexGen(U8 texgen)  { -	LLViewerObject* object; -	S32 te; -	for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te) ) +	struct f : public LLSelectedTEFunctor  	{ -		if (object->permModify()) +		U8 mTexgen; +		f(const U8& t) : mTexgen(t) {} +		bool apply(LLViewerObject* object, S32 te)  		{ -			// update viewer side color in anticipation of update from simulator -			object->setTETexGen(te, texgen); +			if (object->permModify()) +			{ +				// update viewer side color in anticipation of update from simulator +				object->setTETexGen(te, mTexgen); +			} +			return true;  		} -	} +	} setfunc(texgen); +	getSelection()->applyToTEs(&setfunc); -	for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() ) -	{ -		if (object->permModify()) -		{ -			object->sendTEUpdate(); -		} -	} +	LLSelectMgrSendFunctor sendfunc; +	getSelection()->applyToObjects(&sendfunc);  }  void LLSelectMgr::selectionSetShiny(U8 shiny)  { -	LLViewerObject* object; -	S32 te; -	for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te) ) +	struct f : public LLSelectedTEFunctor  	{ -		if (object->permModify()) +		U8 mShiny; +		f(const U8& t) : mShiny(t) {} +		bool apply(LLViewerObject* object, S32 te)  		{ -			// update viewer side color in anticipation of update from simulator -			object->setTEShiny(te, shiny); +			if (object->permModify()) +			{ +				// update viewer side color in anticipation of update from simulator +				object->setTEShiny(te, mShiny); +			} +			return true;  		} -	} +	} setfunc(shiny); +	getSelection()->applyToTEs(&setfunc); -	for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() ) -	{ -		if (object->permModify()) -		{ -			object->sendTEUpdate(); -		} -	} +	LLSelectMgrSendFunctor sendfunc; +	getSelection()->applyToObjects(&sendfunc);  }  void LLSelectMgr::selectionSetFullbright(U8 fullbright)  { -	LLViewerObject* object; -	S32 te; -	for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te) ) +	struct f : public LLSelectedTEFunctor  	{ -		if (object->permModify()) +		U8 mFullbright; +		f(const U8& t) : mFullbright(t) {} +		bool apply(LLViewerObject* object, S32 te)  		{ -			// update viewer side color in anticipation of update from simulator -			object->setTEFullbright(te, fullbright); +			if (object->permModify()) +			{ +				// update viewer side color in anticipation of update from simulator +				object->setTEFullbright(te, mFullbright); +			} +			return true;  		} -	} +	} setfunc(fullbright); +	getSelection()->applyToTEs(&setfunc); -	for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() ) +	struct g : public LLSelectedObjectFunctor  	{ -		if (object->permModify()) +		U8 mFullbright; +		g(const U8& t) : mFullbright(t) {} +		virtual bool apply(LLViewerObject* object)  		{ -			object->sendTEUpdate(); -			if (fullbright) +			if (object->permModify())  			{ -				U8 material = object->getMaterial(); -				U8 mcode = material & LL_MCODE_MASK; -				if (mcode == LL_MCODE_LIGHT) +				object->sendTEUpdate(); +				if (mFullbright)  				{ -					mcode = LL_MCODE_GLASS; -					material = (material & ~LL_MCODE_MASK) | mcode; -					object->setMaterial(material); -					object->sendMaterialUpdate(); +					U8 material = object->getMaterial(); +					U8 mcode = material & LL_MCODE_MASK; +					if (mcode == LL_MCODE_LIGHT) +					{ +						mcode = LL_MCODE_GLASS; +						material = (material & ~LL_MCODE_MASK) | mcode; +						object->setMaterial(material); +						object->sendMaterialUpdate(); +					}  				}  			} +			return true;  		} -	} +	} sendfunc(fullbright); +	getSelection()->applyToObjects(&sendfunc);  }  void LLSelectMgr::selectionSetMediaTypeAndURL(U8 media_type, const std::string& media_url)  { -	LLViewerObject* object; -	S32 te;  	U8 media_flags = LLTextureEntry::MF_NONE;  	if (media_type == LLViewerObject::MEDIA_TYPE_WEB_PAGE)  	{  		media_flags = LLTextureEntry::MF_WEB_PAGE;  	} - -	for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te) ) +	 +	struct f : public LLSelectedTEFunctor  	{ -		if (object->permModify()) +		U8 mMediaFlags; +		f(const U8& t) : mMediaFlags(t) {} +		bool apply(LLViewerObject* object, S32 te)  		{ -			// update viewer side color in anticipation of update from simulator -			object->setTEMediaFlags(te, media_flags); +			if (object->permModify()) +			{ +				// update viewer side color in anticipation of update from simulator +				object->setTEMediaFlags(te, mMediaFlags); +			} +			return true;  		} -	} +	} setfunc(media_flags); +	getSelection()->applyToTEs(&setfunc); -	for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() ) +	struct g : public LLSelectedObjectFunctor  	{ -		if (object->permModify()) +		U8 media_type; +		const std::string& media_url ; +		g(U8 a, const std::string& b) : media_type(a), media_url(b) {} +		virtual bool apply(LLViewerObject* object)  		{ -			// JAMESDEBUG TODO set object media type -			object->setMediaType(media_type); -			object->setMediaURL(media_url); - -			object->sendTEUpdate(); +			if (object->permModify()) +			{ +				object->sendTEUpdate(); +				object->setMediaType(media_type); +				object->setMediaURL(media_url); +			} +			return true;  		} -	} +	} sendfunc(media_type, media_url); +	getSelection()->applyToObjects(&sendfunc);  } @@ -1706,11 +1729,11 @@ void LLSelectMgr::selectionSetMediaTypeAndURL(U8 media_type, const std::string&  //-----------------------------------------------------------------------------  LLPermissions* LLSelectMgr::findObjectPermissions(const LLViewerObject* object)  { -	LLSelectNode* nodep; - -	for (nodep = mSelectedObjects->getFirstNode(); nodep; nodep = mSelectedObjects->getNextNode() ) +	for (LLObjectSelection::valid_iterator iter = getSelection()->valid_begin(); +		 iter != getSelection()->valid_end(); iter++ )  	{ -		if((nodep->getObject() == object) && nodep->mValid) +		LLSelectNode* nodep = *iter; +		if (nodep->getObject() == object)  		{  			return nodep->mPermissions;  		} @@ -1721,306 +1744,49 @@ LLPermissions* LLSelectMgr::findObjectPermissions(const LLViewerObject* object)  //----------------------------------------------------------------------------- -// selectionGetTexUUID() -//----------------------------------------------------------------------------- -BOOL LLSelectMgr::selectionGetTexUUID(LLUUID& id) -{ -	LLViewerObject* first_objectp; -	S32 first_te; -	mSelectedObjects->getPrimaryTE(&first_objectp, &first_te); - -	// nothing selected -	if (!first_objectp) -	{ -		return FALSE; -	} -	 -	LLViewerImage* first_imagep = first_objectp->getTEImage(first_te); -	 -	if (!first_imagep) -	{ -		return FALSE; -	} - -	BOOL identical = TRUE; -	LLViewerObject *objectp; -	S32 te; -	for (mSelectedObjects->getFirstTE(&objectp, &te); objectp; mSelectedObjects->getNextTE(&objectp, &te) ) -	{ -		if (objectp->getTEImage(te) != first_imagep) -		{ -			identical = FALSE; -			break; -		} -	} - -	id = first_imagep->getID(); -	return identical; -} - -//----------------------------------------------------------------------------- -// selectionGetColor() -//----------------------------------------------------------------------------- -BOOL LLSelectMgr::selectionGetColor(LLColor4 &color) -{ -	LLViewerObject* first_object; -	S32 first_te; -	mSelectedObjects->getPrimaryTE(&first_object, &first_te); - -	// nothing selected -	if (!first_object) -	{ -		return FALSE; -	} - -	LLColor4 first_color; -	if (!first_object->getTE(first_te)) -	{ -		return FALSE; -	} -	else -	{ -		first_color = first_object->getTE(first_te)->getColor(); -	} - -	BOOL identical = TRUE; -	LLViewerObject* object; -	S32 te; -	for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te)) -	{ -		if (!object->getTE(te) || (object->getTE(te)->getColor() != first_color)) -		{ -			identical = FALSE; -			break; -		} -	} - -	color = first_color; -	return identical; -} - - -//----------------------------------------------------------------------------- -// selectionGetBumpmap() -//----------------------------------------------------------------------------- -BOOL LLSelectMgr::selectionGetBumpmap(U8 *bumpmap) -{ -	LLViewerObject* first_object; -	S32 first_te; -	mSelectedObjects->getPrimaryTE(&first_object, &first_te); - -	// nothing selected -	if (!first_object) -	{ -		return FALSE; -	} - -	U8 first_value; -	if (!first_object->getTE(first_te)) -	{ -		return FALSE; -	} -	else -	{ -		first_value = first_object->getTE(first_te)->getBumpmap(); -	} - -	BOOL identical = TRUE; -	LLViewerObject* object; -	S32 te; -	for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te)) -	{ -		if (!object->getTE(te) || (object->getTE(te)->getBumpmap() != first_value)) -		{ -			identical = FALSE; -			break; -		} -	} - -	*bumpmap = first_value; -	return identical; -} - -//----------------------------------------------------------------------------- -// selectionGetShiny() -//----------------------------------------------------------------------------- -BOOL LLSelectMgr::selectionGetShiny(U8 *shiny) -{ -	LLViewerObject* first_object; -	S32 first_te; -	mSelectedObjects->getPrimaryTE(&first_object, &first_te); - -	// nothing selected -	if (!first_object) -	{ -		return FALSE; -	} - -	U8 first_value; -	if (!first_object->getTE(first_te)) -	{ -		return FALSE; -	} -	else -	{ -		first_value = first_object->getTE(first_te)->getShiny(); -	} - -	BOOL identical = TRUE; -	LLViewerObject* object; -	S32 te; -	for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te)) -	{ -		if (!object->getTE(te) || (object->getTE(te)->getShiny() != first_value)) -		{ -			identical = FALSE; -			break; -		} -	} - -	*shiny = first_value; -	return identical; -} - -//----------------------------------------------------------------------------- -// selectionGetFullbright() -//----------------------------------------------------------------------------- -BOOL LLSelectMgr::selectionGetFullbright(U8 *fullbright) -{ -	LLViewerObject* first_object; -	S32 first_te; -	mSelectedObjects->getPrimaryTE(&first_object, &first_te); - -	// nothing selected -	if (!first_object) -	{ -		return FALSE; -	} - -	U8 first_value; -	if (!first_object->getTE(first_te)) -	{ -		return FALSE; -	} -	else -	{ -		first_value = first_object->getTE(first_te)->getFullbright(); -	} - -	BOOL identical = TRUE; -	LLViewerObject* object; -	S32 te; -	for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te)) -	{ -		if (!object->getTE(te) || (object->getTE(te)->getFullbright() != first_value)) -		{ -			identical = FALSE; -			break; -		} -	} - -	*fullbright = first_value; -	return identical; -} - -// JAMESDEBUG TODO make this return mediatype off viewer object -bool LLSelectMgr::selectionGetMediaType(U8 *media_type) -{ -	LLViewerObject* first_object; -	S32 first_te; -	mSelectedObjects->getPrimaryTE(&first_object, &first_te); - -	// nothing selected -	if (!first_object) -	{ -		return false; -	} - -	U8 first_value; -	if (!first_object->getTE(first_te)) -	{ -		return false; -	} -	else -	{ -		first_value = first_object->getTE(first_te)->getMediaFlags(); -	} - -	bool identical = true; -	LLViewerObject* object; -	S32 te; -	for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te)) -	{ -		if (!object->getTE(te) || (object->getTE(te)->getMediaFlags() != first_value)) -		{ -			identical = false; -			break; -		} -	} - -	*media_type = first_value; -	return identical; -} - - - -//-----------------------------------------------------------------------------  // selectionSetMaterial()  //-----------------------------------------------------------------------------  void LLSelectMgr::selectionSetMaterial(U8 material)  { -	LLViewerObject* object; -	for (object = mSelectedObjects->getFirstObject(); object != NULL; object = mSelectedObjects->getNextObject() ) +	struct f : public LLSelectedObjectFunctor  	{ -		if (object->permModify()) +		U8 mMaterial; +		f(const U8& t) : mMaterial(t) {} +		virtual bool apply(LLViewerObject* object)  		{ -			U8 cur_material = object->getMaterial(); -			material |= (cur_material & ~LL_MCODE_MASK); -			object->setMaterial(material); -			object->sendMaterialUpdate(); +			if (object->permModify()) +			{ +				U8 cur_material = object->getMaterial(); +				U8 material = mMaterial | (cur_material & ~LL_MCODE_MASK); +				object->setMaterial(material); +				object->sendMaterialUpdate(); +			} +			return true;  		} -	} +	} sendfunc(material); +	getSelection()->applyToObjects(&sendfunc);  } -// True if all selected objects have this PCode +// TRUE if all selected objects have this PCode  BOOL LLSelectMgr::selectionAllPCode(LLPCode code)  { -	LLViewerObject *object; -	for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() ) -	{ -		if (object->getPCode() != code) -		{ -			return FALSE; -		} -	} -	return TRUE; -} - -//----------------------------------------------------------------------------- -// selectionGetMaterial() -//----------------------------------------------------------------------------- -BOOL LLSelectMgr::selectionGetMaterial(U8 *out_material) -{ -	LLViewerObject *object = mSelectedObjects->getFirstObject(); -	if (!object) return FALSE; - -	U8 material = object->getMaterial(); - -	BOOL identical = TRUE; -	for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() ) +	struct f : public LLSelectedObjectFunctor  	{ -		if ( material != object->getMaterial()) +		LLPCode mCode; +		f(const LLPCode& t) : mCode(t) {} +		virtual bool apply(LLViewerObject* object)  		{ -			identical = FALSE; -			break; +			if (object->getPCode() != mCode) +			{ +				return FALSE; +			} +			return true;  		} -	} - -	*out_material = material; -	return identical; +	} func(code); +	BOOL res = getSelection()->applyToObjects(&func); +	return res;  } -  bool LLSelectMgr::selectionGetIncludeInSearch(bool* include_in_search_out)  {  	LLViewerObject *object = mSelectedObjects->getFirstRootObject(); @@ -2029,8 +1795,12 @@ bool LLSelectMgr::selectionGetIncludeInSearch(bool* include_in_search_out)  	bool include_in_search = object->getIncludeInSearch();  	bool identical = true; -	for ( object = mSelectedObjects->getFirstRootObject(); object; object = mSelectedObjects->getNextRootObject() ) + +	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); +		 iter != getSelection()->root_end(); iter++)  	{ +		LLViewerObject* object = (*iter)->getObject(); +  		if ( include_in_search != object->getIncludeInSearch())  		{  			identical = false; @@ -2045,8 +1815,10 @@ bool LLSelectMgr::selectionGetIncludeInSearch(bool* include_in_search_out)  void LLSelectMgr::selectionSetIncludeInSearch(bool include_in_search)  {  	LLViewerObject* object = NULL; -	for ( object = mSelectedObjects->getFirstRootObject(); object; object = mSelectedObjects->getNextRootObject() ) +	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); +		 iter != getSelection()->root_end(); iter++)  	{ +		object = (*iter)->getObject();  		object->setIncludeInSearch(include_in_search);  	}  	sendListToRegions( @@ -2060,37 +1832,50 @@ void LLSelectMgr::selectionSetIncludeInSearch(bool include_in_search)  BOOL LLSelectMgr::selectionGetClickAction(U8 *out_action)  {  	LLViewerObject *object = mSelectedObjects->getFirstObject(); -	if (!object) return FALSE; - +	if (!object) +	{ +		return FALSE; +	} +	  	U8 action = object->getClickAction(); +	*out_action = action; -	BOOL identical = TRUE; -	for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() ) +	struct f : public LLSelectedObjectFunctor  	{ -		if ( action != object->getClickAction()) +		U8 mAction; +		f(const U8& t) : mAction(t) {} +		virtual bool apply(LLViewerObject* object)  		{ -			identical = FALSE; -			break; +			if ( mAction != object->getClickAction()) +			{ +				return false; +			} +			return true;  		} -	} - -	*out_action = action; -	return identical; +	} func(action); +	BOOL res = getSelection()->applyToObjects(&func); +	return res;  }  void LLSelectMgr::selectionSetClickAction(U8 action)  { -	LLViewerObject* object = NULL; -	for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() ) +	struct f : public LLSelectedObjectFunctor  	{ -		object->setClickAction(action); -	} -	sendListToRegions( -		"ObjectClickAction", -		packAgentAndSessionID, -		packObjectClickAction,  -		&action, -		SEND_INDIVIDUALS); +		U8 mAction; +		f(const U8& t) : mAction(t) {} +		virtual bool apply(LLViewerObject* object) +		{ +			object->setClickAction(mAction); +			return true; +		} +	} func(action); +	getSelection()->applyToObjects(&func); + +	sendListToRegions("ObjectClickAction", +					  packAgentAndSessionID, +					  packObjectClickAction,  +					  &action, +					  SEND_INDIVIDUALS);  } @@ -2165,34 +1950,42 @@ void LLSelectMgr::packObjectIDAsParam(LLSelectNode* node, void *)  //-----------------------------------------------------------------------------  void LLSelectMgr::selectionResetRotation()  { -	LLQuaternion identity(0.f, 0.f, 0.f, 1.f); - -	LLViewerObject* object; -	for (object = mSelectedObjects->getFirstRootObject(); object; object = mSelectedObjects->getNextRootObject() ) +	struct f : public LLSelectedObjectFunctor  	{ -		object->setRotation(identity); -		if (object->mDrawable.notNull()) +		virtual bool apply(LLViewerObject* object)  		{ -			gPipeline.markMoved(object->mDrawable, TRUE); +			LLQuaternion identity(0.f, 0.f, 0.f, 1.f); +			object->setRotation(identity); +			if (object->mDrawable.notNull()) +			{ +				gPipeline.markMoved(object->mDrawable, TRUE); +			} +			object->sendRotationUpdate(); +			return true;  		} -		object->sendRotationUpdate(); -	} +	} func; +	getSelection()->applyToRootObjects(&func);  }  void LLSelectMgr::selectionRotateAroundZ(F32 degrees)  {  	LLQuaternion rot( degrees * DEG_TO_RAD, LLVector3(0,0,1) ); - -	LLViewerObject* object; -	for (object = mSelectedObjects->getFirstRootObject(); object; object = mSelectedObjects->getNextRootObject() ) +	struct f : public LLSelectedObjectFunctor  	{ -		object->setRotation( object->getRotationEdit() * rot ); -		if (object->mDrawable.notNull()) +		LLQuaternion mRot; +		f(const LLQuaternion& rot) : mRot(rot) {} +		virtual bool apply(LLViewerObject* object)  		{ -			gPipeline.markMoved(object->mDrawable, TRUE); +			object->setRotation( object->getRotationEdit() * mRot ); +			if (object->mDrawable.notNull()) +			{ +				gPipeline.markMoved(object->mDrawable, TRUE); +			} +			object->sendRotationUpdate(); +			return true;  		} -		object->sendRotationUpdate(); -	} +	} func(rot); +	getSelection()->applyToRootObjects(&func);	  } @@ -2201,86 +1994,37 @@ void LLSelectMgr::selectionRotateAroundZ(F32 degrees)  //-----------------------------------------------------------------------------  void LLSelectMgr::selectionTexScaleAutofit(F32 repeats_per_meter)  { -	LLViewerObject* object; -	S32 te; -	for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te)) +	struct f : public LLSelectedTEFunctor  	{ -		if (!object->permModify()) +		F32 mRepeatsPerMeter; +		f(const F32& t) : mRepeatsPerMeter(t) {} +		bool apply(LLViewerObject* object, S32 te)  		{ -			continue; -		} +			 +			if (object->permModify()) +			{ +				// Compute S,T to axis mapping +				U32 s_axis, t_axis; +				if (!LLPrimitive::getTESTAxes(te, &s_axis, &t_axis)) +				{ +					return TRUE; +				} -		if (object->getNumTEs() == 0) -		{ -			continue; -		} +				F32 new_s = object->getScale().mV[s_axis] * mRepeatsPerMeter; +				F32 new_t = object->getScale().mV[t_axis] * mRepeatsPerMeter; -		// Compute S,T to axis mapping -		U32 s_axis, t_axis; -		if (!getTESTAxes(object, te, &s_axis, &t_axis)) -		{ -			continue; +				object->setTEScale(te, new_s, new_t); +			} +			return true;  		} +	} setfunc(repeats_per_meter); +	getSelection()->applyToTEs(&setfunc); -		F32 new_s = object->getScale().mV[s_axis] * repeats_per_meter; -		F32 new_t = object->getScale().mV[t_axis] * repeats_per_meter; - -		object->setTEScale(te, new_s, new_t); -	} - -	for (object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject()) -	{ -		if (object->permModify()) -		{ -			object->sendTEUpdate(); -		} -	} +	LLSelectMgrSendFunctor sendfunc; +	getSelection()->applyToObjects(&sendfunc);  } -// BUG: Only works for boxes. -// Face numbering for flex boxes as of 1.14.2002 -//----------------------------------------------------------------------------- -// getFaceSTAxes() -//----------------------------------------------------------------------------- -BOOL LLSelectMgr::getTESTAxes(const LLViewerObject* object, const U8 face, U32* s_axis, U32* t_axis) -{ -	if (face == 0) -	{ -		*s_axis = VX; *t_axis = VY; -		return TRUE; -	} -	else if (face == 1) -	{ -		*s_axis = VX; *t_axis = VZ; -		return TRUE; -	} -	else if (face == 2) -	{ -		*s_axis = VY; *t_axis = VZ; -		return TRUE; -	} -	else if (face == 3) -	{ -		*s_axis = VX; *t_axis = VZ; -		return TRUE; -	} -	else if (face == 4) -	{ -		*s_axis = VY; *t_axis = VZ; -		return TRUE; -	} -	else if (face == 5) -	{ -		*s_axis = VX; *t_axis = VY; -		return TRUE; -	} -	else -	{ -		// unknown face -		return FALSE; -	} -}  // Called at the end of a scale operation, this adjusts the textures to attempt to  // maintain a constant repeats per meter. @@ -2290,14 +2034,12 @@ BOOL LLSelectMgr::getTESTAxes(const LLViewerObject* object, const U8 face, U32*  //-----------------------------------------------------------------------------  void LLSelectMgr::adjustTexturesByScale(BOOL send_to_sim, BOOL stretch)  { -	LLViewerObject* object; -	LLSelectNode* selectNode; - -	BOOL send = FALSE; -	 -	for (selectNode = mSelectedObjects->getFirstNode(); selectNode; selectNode = mSelectedObjects->getNextNode()) +	for (LLObjectSelection::iterator iter = getSelection()->begin(); +		 iter != getSelection()->end(); iter++)  	{ -		object = selectNode->getObject(); +		LLSelectNode* selectNode = *iter; +		LLViewerObject* object = selectNode->getObject(); +  		if (!object->permModify())  		{  			continue; @@ -2308,6 +2050,8 @@ void LLSelectMgr::adjustTexturesByScale(BOOL send_to_sim, BOOL stretch)  			continue;  		} +		BOOL send = FALSE; +		  		for (U8 te_num = 0; te_num < object->getNumTEs(); te_num++)  		{  			const LLTextureEntry* tep = object->getTE(te_num); @@ -2317,8 +2061,11 @@ void LLSelectMgr::adjustTexturesByScale(BOOL send_to_sim, BOOL stretch)  			{  				// Figure out how S,T changed with scale operation  				U32 s_axis, t_axis; -				if (!getTESTAxes(object, te_num, &s_axis, &t_axis)) continue; - +				if (!LLPrimitive::getTESTAxes(te_num, &s_axis, &t_axis)) +				{ +					continue; +				} +				  				LLVector3 scale_ratio = selectNode->mTextureScaleRatios[te_num];   				LLVector3 object_scale = object->getScale(); @@ -2341,70 +2088,23 @@ void LLSelectMgr::adjustTexturesByScale(BOOL send_to_sim, BOOL stretch)  		{  			object->sendTEUpdate();  		} -	} -} - - -//----------------------------------------------------------------------------- -// selectionResetTexInfo() -//----------------------------------------------------------------------------- -void LLSelectMgr::selectionResetTexInfo(S32 selected_face) -{ -	S32 start_face, end_face; - -	LLViewerObject* object; -	for (object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject()) -	{ -		if (!object->permModify()) -		{ -			continue; -		} -		if (object->getNumTEs() == 0) -		{ -			continue; -		} - -		if (selected_face == -1) -		{ -			start_face = 0; -			end_face = object->getNumTEs() - 1; -		} -		else -		{ -			start_face = selected_face; -			end_face = selected_face; -		} - -		for (S32 face = start_face; face <= end_face; face++) -		{ -			// Actually, each object should reset to its appropriate value. -			object->setTEScale(face, 1.f, 1.f); -			object->setTEOffset(face, 0.f, 0.f); -			object->setTERotation(face, 0.f); -		} - -		object->sendTEUpdate(); -	} +	}		  }  //-----------------------------------------------------------------------------  // selectGetAllRootsValid() -// Returns true if the viewer has information on all selected objects +// Returns TRUE if the viewer has information on all selected objects  //-----------------------------------------------------------------------------  BOOL LLSelectMgr::selectGetAllRootsValid()  { -	for( LLSelectNode* node = mSelectedObjects->getFirstRootNode(); node; node = mSelectedObjects->getNextRootNode() ) +	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); +		 iter != getSelection()->root_end(); ++iter )  	{ -	 +		LLSelectNode* node = *iter;  		if( !node->mValid )  		{  			return FALSE;  		} - -		if( !node->getObject() ) -		{ -			return FALSE; -		}  	}  	return TRUE;  } @@ -2412,63 +2112,62 @@ BOOL LLSelectMgr::selectGetAllRootsValid()  //-----------------------------------------------------------------------------  // selectGetAllValid() -// Returns true if the viewer has information on all selected objects +// Returns TRUE if the viewer has information on all selected objects  //-----------------------------------------------------------------------------  BOOL LLSelectMgr::selectGetAllValid()  { -	for( LLSelectNode* node = mSelectedObjects->getFirstNode(); node; node = mSelectedObjects->getNextNode() ) +	for (LLObjectSelection::iterator iter = getSelection()->begin(); +		 iter != getSelection()->end(); ++iter )  	{ -	 +		LLSelectNode* node = *iter;  		if( !node->mValid )  		{  			return FALSE;  		} - -		if( !node->getObject() ) -		{ -			return FALSE; -		}  	}  	return TRUE;  }  //----------------------------------------------------------------------------- -// selectGetModify() - return true if current agent can modify all +// selectGetModify() - return TRUE if current agent can modify all  // selected objects.  //-----------------------------------------------------------------------------  BOOL LLSelectMgr::selectGetModify()  { -	for( LLSelectNode* node = mSelectedObjects->getFirstNode(); node; node = mSelectedObjects->getNextNode() ) +	for (LLObjectSelection::iterator iter = getSelection()->begin(); +		 iter != getSelection()->end(); iter++ )  	{ +		LLSelectNode* node = *iter; +		LLViewerObject* object = node->getObject();  		if( !node->mValid )  		{  			return FALSE;  		} -		LLViewerObject* object = node->getObject(); -		if( !object || !object->permModify() ) +		if( !object->permModify() )  		{  			return FALSE;  		}  	} -  	return TRUE;  }  //----------------------------------------------------------------------------- -// selectGetRootsModify() - return true if current agent can modify all +// selectGetRootsModify() - return TRUE if current agent can modify all  // selected root objects.  //-----------------------------------------------------------------------------  BOOL LLSelectMgr::selectGetRootsModify()  { -	for( LLSelectNode* node = mSelectedObjects->getFirstRootNode(); node; node = mSelectedObjects->getNextRootNode() ) +	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); +		 iter != getSelection()->root_end(); iter++ )  	{ +		LLSelectNode* node = *iter; +		LLViewerObject* object = node->getObject();  		if( !node->mValid )  		{  			return FALSE;  		} -		LLViewerObject* object = node->getObject(); -		if( !object || !object->permModify() ) +		if( !object->permModify() )  		{  			return FALSE;  		} @@ -2479,19 +2178,21 @@ BOOL LLSelectMgr::selectGetRootsModify()  //----------------------------------------------------------------------------- -// selectGetRootsTransfer() - return true if current agent can transfer all +// selectGetRootsTransfer() - return TRUE if current agent can transfer all  // selected root objects.  //-----------------------------------------------------------------------------  BOOL LLSelectMgr::selectGetRootsTransfer()  { -	for(LLSelectNode* node = mSelectedObjects->getFirstRootNode(); node; node = mSelectedObjects->getNextRootNode()) +	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); +		 iter != getSelection()->root_end(); iter++ )  	{ -		if(!node->mValid) +		LLSelectNode* node = *iter; +		LLViewerObject* object = node->getObject(); +		if( !node->mValid )  		{  			return FALSE;  		} -		LLViewerObject* object = node->getObject(); -		if(!object || !object->permTransfer()) +		if(!object->permTransfer())  		{  			return FALSE;  		} @@ -2500,19 +2201,21 @@ BOOL LLSelectMgr::selectGetRootsTransfer()  }  //----------------------------------------------------------------------------- -// selectGetRootsCopy() - return true if current agent can copy all +// selectGetRootsCopy() - return TRUE if current agent can copy all  // selected root objects.  //-----------------------------------------------------------------------------  BOOL LLSelectMgr::selectGetRootsCopy()  { -	for(LLSelectNode* node = mSelectedObjects->getFirstRootNode(); node; node = mSelectedObjects->getNextRootNode()) +	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); +		 iter != getSelection()->root_end(); iter++ )  	{ -		if(!node->mValid) +		LLSelectNode* node = *iter; +		LLViewerObject* object = node->getObject(); +		if( !node->mValid )  		{  			return FALSE;  		} -		LLViewerObject* object = node->getObject(); -		if(!object || !object->permCopy()) +		if(!object->permCopy())  		{  			return FALSE;  		} @@ -2524,39 +2227,42 @@ BOOL LLSelectMgr::selectGetRootsCopy()  // selectGetCreator()  // Creator information only applies to root objects.  //----------------------------------------------------------------------------- -BOOL LLSelectMgr::selectGetCreator(LLUUID& id, LLString& name) +BOOL LLSelectMgr::selectGetCreator(LLUUID& result_id, LLString& name)  { -	LLSelectNode* node = mSelectedObjects->getFirstRootNode(); -	if(!node) node = mSelectedObjects->getFirstNode(); -	if(!node) return FALSE; -	if(!node->mValid) return FALSE; -	LLViewerObject* obj = node->getObject(); -	if(!obj) return FALSE; -	if(!(obj->isRoot() || obj->isJointChild())) return FALSE; - -	id = node->mPermissions->getCreator(); -  	BOOL identical = TRUE; -	for ( node = mSelectedObjects->getNextRootNode(); node; node = mSelectedObjects->getNextRootNode() ) +	BOOL first = TRUE; +	LLUUID first_id; +	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); +		 iter != getSelection()->root_end(); iter++ )  	{ +		LLSelectNode* node = *iter;	  		if (!node->mValid)  		{ -			identical = FALSE; -			break; +			return FALSE;  		} -		if ( !(id == node->mPermissions->getCreator() ) ) +		if (first)  		{ -			identical = FALSE; -			break; +			first_id = node->mPermissions->getCreator(); +			first = FALSE; +		} +		else +		{ +			if ( !(first_id == node->mPermissions->getCreator() ) ) +			{ +				identical = FALSE; +				break; +			}  		}  	} +	result_id = first_id; +	  	if (identical)  	{  		char firstname[DB_FIRST_NAME_BUF_SIZE];		/* Flawfinder: ignore */  		char lastname[DB_LAST_NAME_BUF_SIZE];		/* Flawfinder: ignore */ -		gCacheName->getName(id, firstname, lastname); +		gCacheName->getName(first_id, firstname, lastname);  		name.assign( firstname );  		name.append( " " );  		name.append( lastname ); @@ -2574,44 +2280,45 @@ BOOL LLSelectMgr::selectGetCreator(LLUUID& id, LLString& name)  // selectGetOwner()  // Owner information only applies to roots.  //----------------------------------------------------------------------------- -BOOL LLSelectMgr::selectGetOwner(LLUUID& id, LLString& name) +BOOL LLSelectMgr::selectGetOwner(LLUUID& result_id, LLString& name)  { -	LLSelectNode* node = mSelectedObjects->getFirstRootNode(); -	if(!node) node = mSelectedObjects->getFirstNode(); -	if(!node) return FALSE; -	if(!node->mValid) return FALSE; -	LLViewerObject* obj = node->getObject(); -	if(!obj) return FALSE; -	if(!(obj->isRootEdit() || obj->isRoot() || obj->isJointChild())) return FALSE; - -	BOOL group_owner = FALSE; -	id.setNull(); -	node->mPermissions->getOwnership(id, group_owner); -  	BOOL identical = TRUE; -	for ( node = mSelectedObjects->getNextRootNode(); node; node = mSelectedObjects->getNextRootNode() ) +	BOOL first = TRUE; +	BOOL first_group_owned = FALSE; +	LLUUID first_id; +	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); +		 iter != getSelection()->root_end(); iter++ )  	{ +		LLSelectNode* node = *iter;	  		if (!node->mValid)  		{ -			identical = FALSE; -			break; +			return FALSE;  		} - -		LLUUID owner_id; -		BOOL is_group_owned = FALSE; -		if (!(node->mPermissions->getOwnership(owner_id, is_group_owned)) -			|| owner_id != id ) +		 +		if (first)  		{ -			identical = FALSE; -			break; +			node->mPermissions->getOwnership(first_id, first_group_owned); +			first = FALSE; +		} +		else +		{ +			LLUUID owner_id; +			BOOL is_group_owned = FALSE; +			if (!(node->mPermissions->getOwnership(owner_id, is_group_owned)) +				|| owner_id != first_id || is_group_owned != first_group_owned) +			{ +				identical = FALSE; +				break; +			}  		}  	} -	BOOL public_owner = (id.isNull() && !group_owner); - +	result_id = first_id; +	  	if (identical)  	{ -		if (group_owner) +		BOOL public_owner = (first_id.isNull() && !first_group_owned); +		if (first_group_owned)  		{  			name.assign( "(Group Owned)");  		} @@ -2619,7 +2326,7 @@ BOOL LLSelectMgr::selectGetOwner(LLUUID& id, LLString& name)  		{  			char firstname[DB_FIRST_NAME_BUF_SIZE];		/* Flawfinder: ignore */  			char lastname[DB_LAST_NAME_BUF_SIZE];		/* Flawfinder: ignore */ -			gCacheName->getName(id, firstname, lastname); +			gCacheName->getName(first_id, firstname, lastname);  			name.assign( firstname );  			name.append( " " );  			name.append( lastname ); @@ -2642,43 +2349,45 @@ BOOL LLSelectMgr::selectGetOwner(LLUUID& id, LLString& name)  // selectGetLastOwner()  // Owner information only applies to roots.  //----------------------------------------------------------------------------- -BOOL LLSelectMgr::selectGetLastOwner(LLUUID& id, LLString& name) +BOOL LLSelectMgr::selectGetLastOwner(LLUUID& result_id, LLString& name)  { -	LLSelectNode* node = mSelectedObjects->getFirstRootNode(); -	if(!node) node = mSelectedObjects->getFirstNode(); -	if(!node) return FALSE; -	if(!node->mValid) return FALSE; -	LLViewerObject* obj = node->getObject(); -	if(!obj) return FALSE; -	if(!(obj->isRoot() || obj->isJointChild())) return FALSE; - -	id = node->mPermissions->getLastOwner(); -  	BOOL identical = TRUE; -	for ( node = mSelectedObjects->getNextRootNode(); node; node = mSelectedObjects->getNextRootNode() ) +	BOOL first = TRUE; +	LLUUID first_id; +	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); +		 iter != getSelection()->root_end(); iter++ )  	{ +		LLSelectNode* node = *iter;	  		if (!node->mValid)  		{ -			identical = FALSE; -			break; +			return FALSE;  		} -		if ( !(id == node->mPermissions->getLastOwner() ) ) +		if (first)  		{ -			identical = FALSE; -			break; +			first_id = node->mPermissions->getLastOwner(); +			first = FALSE; +		} +		else +		{ +			if ( !(first_id == node->mPermissions->getLastOwner() ) ) +			{ +				identical = FALSE; +				break; +			}  		}  	} -	BOOL public_owner = (id.isNull()); - +	result_id = first_id; +	  	if (identical)  	{ +		BOOL public_owner = (first_id.isNull());  		if(!public_owner)  		{  			char firstname[DB_FIRST_NAME_BUF_SIZE];		/* Flawfinder: ignore */  			char lastname[DB_LAST_NAME_BUF_SIZE];		/* Flawfinder: ignore */ -			gCacheName->getName(id, firstname, lastname); +			gCacheName->getName(first_id, firstname, lastname);  			name.assign( firstname );  			name.append( " " );  			name.append( lastname ); @@ -2701,33 +2410,36 @@ BOOL LLSelectMgr::selectGetLastOwner(LLUUID& id, LLString& name)  // selectGetGroup()  // Group information only applies to roots.  //----------------------------------------------------------------------------- -BOOL LLSelectMgr::selectGetGroup(LLUUID& id) +BOOL LLSelectMgr::selectGetGroup(LLUUID& result_id)  { -	LLSelectNode* node = mSelectedObjects->getFirstRootNode(); -	if(!node) node = mSelectedObjects->getFirstNode(); -	if(!node) return FALSE; -	if(!node->mValid) return FALSE; -	LLViewerObject* obj = node->getObject(); -	if(!obj) return FALSE; -	if(!(obj->isRoot() || obj->isJointChild())) return FALSE; - -	id = node->mPermissions->getGroup(); -  	BOOL identical = TRUE; -	for ( node = mSelectedObjects->getNextRootNode(); node; node = mSelectedObjects->getNextRootNode() ) +	BOOL first = TRUE; +	LLUUID first_id; +	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); +		 iter != getSelection()->root_end(); iter++ )  	{ +		LLSelectNode* node = *iter;	  		if (!node->mValid)  		{ -			identical = FALSE; -			break; +			return FALSE;  		} -		if ( !(id == node->mPermissions->getGroup() ) ) +		if (first)  		{ -			identical = FALSE; -			break; +			first_id = node->mPermissions->getGroup(); +			first = FALSE; +		} +		else +		{ +			if ( !(first_id == node->mPermissions->getGroup() ) ) +			{ +				identical = FALSE; +				break; +			}  		}  	} +	 +	result_id = first_id;  	return identical;  } @@ -2739,64 +2451,53 @@ BOOL LLSelectMgr::selectGetGroup(LLUUID& id)  //-----------------------------------------------------------------------------  BOOL LLSelectMgr::selectIsGroupOwned()  { -	LLSelectNode* node = mSelectedObjects->getFirstRootNode(); -	if(!node) node = mSelectedObjects->getFirstNode(); -	if(!node) return FALSE; -	if(!node->mValid) return FALSE; -	LLViewerObject* obj = node->getObject(); -	if(!obj) return FALSE; -	if(!(obj->isRoot() || obj->isJointChild())) return FALSE; - -	BOOL is_group_owned = node->mPermissions->isGroupOwned(); - -	if(is_group_owned) +	BOOL found_one = FALSE; +	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); +		 iter != getSelection()->root_end(); iter++ )  	{ -		for ( node = mSelectedObjects->getNextRootNode(); node; node = mSelectedObjects->getNextRootNode() ) +		LLSelectNode* node = *iter;	 +		if (!node->mValid)  		{ -			if (!node->mValid) -			{ -				is_group_owned = FALSE; -				break; -			} - -			if ( !( node->mPermissions->isGroupOwned() ) ) -			{ -				is_group_owned = FALSE; -				break; -			} +			return FALSE;  		} -	} -	return is_group_owned; +		found_one = TRUE; +		if (!node->mPermissions->isGroupOwned()) +		{ +			return FALSE; +		} +	}	 +	return found_one ? TRUE : FALSE;  }  //-----------------------------------------------------------------------------  // selectGetPerm()  // Only operates on root nodes.  // Returns TRUE if all have valid data. -// mask_on has bits set to true where all permissions are true -// mask_off has bits set to true where all permissions are false +// mask_on has bits set to TRUE where all permissions are TRUE +// mask_off has bits set to TRUE where all permissions are FALSE  // if a bit is off both in mask_on and mask_off, the values differ within  // the selection.  //-----------------------------------------------------------------------------  BOOL LLSelectMgr::selectGetPerm(U8 which_perm, U32* mask_on, U32* mask_off)  { -	LLSelectNode* node = mSelectedObjects->getFirstRootNode(); -	if (!node) return FALSE; -	if (!node->mValid)	return FALSE; -  	U32 mask;  	U32 mask_and	= 0xffffffff;  	U32 mask_or		= 0x00000000; -	BOOL all_valid	= TRUE; +	BOOL all_valid	= FALSE; -	for ( node = mSelectedObjects->getFirstRootNode(); node; node = mSelectedObjects->getNextRootNode() ) +	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); +		 iter != getSelection()->root_end(); iter++)  	{ +		LLSelectNode* node = *iter; +  		if (!node->mValid)  		{  			all_valid = FALSE;  			break;  		} +		all_valid = TRUE; +		  		switch( which_perm )  		{  		case PERM_BASE: @@ -2824,10 +2525,10 @@ BOOL LLSelectMgr::selectGetPerm(U8 which_perm, U32* mask_on, U32* mask_off)  	if (all_valid)  	{ -		// ...true through all ANDs means all true +		// ...TRUE through all ANDs means all TRUE  		*mask_on  = mask_and; -		// ...false through all ORs means all false +		// ...FALSE through all ORs means all FALSE  		*mask_off = ~mask_or;  		return TRUE;  	} @@ -2846,23 +2547,33 @@ BOOL LLSelectMgr::selectGetOwnershipCost(S32* out_cost)  	return mSelectedObjects->getOwnershipCost(*out_cost);  } -BOOL LLSelectMgr::selectGetPermissions(LLPermissions& perm) +BOOL LLSelectMgr::selectGetPermissions(LLPermissions& result_perm)  { -	LLSelectNode* node = mSelectedObjects->getFirstRootNode(); -	if (!node) return FALSE; -	if (!node->mValid)	return FALSE; -	BOOL valid = TRUE; -	perm = *(node->mPermissions); -	for(node = mSelectedObjects->getNextRootNode(); node != NULL; node = mSelectedObjects->getNextRootNode()) +	BOOL first = TRUE; +	LLPermissions perm; +	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); +		 iter != getSelection()->root_end(); iter++ )  	{ -		if(!node->mValid) +		LLSelectNode* node = *iter;	 +		if (!node->mValid)  		{ -			valid = FALSE; -			break; +			return FALSE; +		} + +		if (first) +		{ +			perm = *(node->mPermissions); +			first = FALSE; +		} +		else +		{ +			perm.accumulate(*(node->mPermissions));  		} -		perm.accumulate(*(node->mPermissions));  	} -	return valid; + +	result_perm = perm; + +	return TRUE;  } @@ -2873,10 +2584,12 @@ void LLSelectMgr::selectDelete()  	BOOL locked_but_deleteable_object = FALSE;  	BOOL no_copy_but_deleteable_object = FALSE;  	BOOL all_owned_by_you = TRUE; -	for(LLViewerObject* obj = mSelectedObjects->getFirstObject(); -		obj != NULL; -		obj = mSelectedObjects->getNextObject()) + +	for (LLObjectSelection::iterator iter = getSelection()->begin(); +		 iter != getSelection()->end(); iter++)  	{ +		LLViewerObject* obj = (*iter)->getObject(); +  		if( obj->isAttachment() )  		{  			continue; @@ -2998,10 +2711,10 @@ void LLSelectMgr::confirmDelete(S32 option, void* data)  			// attempt to derez into the trash.  			LLDeRezInfo* info = new LLDeRezInfo(DRD_TRASH, trash_id);  			gSelectMgr->sendListToRegions("DeRezObject", -									packDeRezHeader, -									packObjectLocalID, -									(void*)info, -									SEND_ONLY_ROOTS); +										  packDeRezHeader, +										  packObjectLocalID, +										  (void*)info, +										  SEND_ONLY_ROOTS);  			// VEFFECT: Delete Object - one effect for all deletes  			if (gSelectMgr->mSelectedObjects->mSelectType != SELECT_TYPE_HUD)  			{ @@ -3046,9 +2759,10 @@ BOOL LLSelectMgr::selectIsForSale(S32& price)  	BOOL any_for_sale = FALSE;  	price = 0; -	LLSelectNode *node; -	for (node = mSelectedObjects->getFirstRootNode(); node; node = mSelectedObjects->getNextRootNode() ) +	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); +		 iter != getSelection()->root_end(); iter++)  	{ +		LLSelectNode* node = *iter;  		if (node->mSaleInfo.isForSale())  		{  			price += node->mSaleInfo.getSalePrice(); @@ -3062,61 +2776,92 @@ BOOL LLSelectMgr::selectIsForSale(S32& price)  // returns TRUE if all nodes are valid. method also stores an  // accumulated sale info. -BOOL LLSelectMgr::selectGetSaleInfo(LLSaleInfo& sale_info) +BOOL LLSelectMgr::selectGetSaleInfo(LLSaleInfo& result_sale_info)  { -	LLSelectNode* node = mSelectedObjects->getFirstRootNode(); -	if (!node) return FALSE; -	if (!node->mValid)	return FALSE; -	BOOL valid = TRUE; -	sale_info = node->mSaleInfo; -	for(node = mSelectedObjects->getNextRootNode(); node != NULL; node = mSelectedObjects->getNextRootNode()) +	BOOL first = TRUE; +	LLSaleInfo sale_info; +	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); +		 iter != getSelection()->root_end(); iter++ )  	{ -		if(!node->mValid) +		LLSelectNode* node = *iter;	 +		if (!node->mValid)  		{ -			valid = FALSE; -			break; +			return FALSE; +		} + +		if (first) +		{ +			sale_info = node->mSaleInfo; +			first = FALSE; +		} +		else +		{ +			sale_info.accumulate(node->mSaleInfo);  		} -		sale_info.accumulate(node->mSaleInfo);  	} -	return valid; + +	result_sale_info = sale_info; + +	return TRUE;  } -BOOL LLSelectMgr::selectGetAggregatePermissions(LLAggregatePermissions& ag_perm) +BOOL LLSelectMgr::selectGetAggregatePermissions(LLAggregatePermissions& result_perm)  { -	LLSelectNode* node = mSelectedObjects->getFirstNode(); -	if (!node) return FALSE; -	if (!node->mValid)	return FALSE; -	BOOL valid = TRUE; -	ag_perm = node->mAggregatePerm; -	for(node = mSelectedObjects->getNextNode(); node != NULL; node = mSelectedObjects->getNextNode()) +	BOOL first = TRUE; +	LLAggregatePermissions perm; +	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); +		 iter != getSelection()->root_end(); iter++ )  	{ -		if(!node->mValid) +		LLSelectNode* node = *iter;	 +		if (!node->mValid)  		{ -			valid = FALSE; -			break; +			return FALSE; +		} + +		if (first) +		{ +			perm = node->mAggregatePerm; +			first = FALSE; +		} +		else +		{ +			perm.aggregate(node->mAggregatePerm);  		} -		ag_perm.aggregate(node->mAggregatePerm);  	} -	return valid; + +	result_perm = perm; + +	return TRUE;  } -BOOL LLSelectMgr::selectGetAggregateTexturePermissions(LLAggregatePermissions& ag_perm) +BOOL LLSelectMgr::selectGetAggregateTexturePermissions(LLAggregatePermissions& result_perm)  { -	LLSelectNode* node = mSelectedObjects->getFirstNode(); -	if (!node) return FALSE; -	if (!node->mValid)	return FALSE; -	BOOL valid = TRUE; -	ag_perm = node->getObject()->permYouOwner() ? node->mAggregateTexturePermOwner : node->mAggregateTexturePerm; -	for(node = mSelectedObjects->getNextNode(); node != NULL; node = mSelectedObjects->getNextNode()) +	BOOL first = TRUE; +	LLAggregatePermissions perm; +	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); +		 iter != getSelection()->root_end(); iter++ )  	{ -		if(!node->mValid) +		LLSelectNode* node = *iter;	 +		if (!node->mValid)  		{ -			valid = FALSE; -			break; +			return FALSE; +		} + +		LLAggregatePermissions t_perm = node->getObject()->permYouOwner() ? node->mAggregateTexturePermOwner : node->mAggregateTexturePerm; +		if (first) +		{ +			perm = t_perm; +			first = FALSE; +		} +		else +		{ +			perm.aggregate(t_perm);  		} -		ag_perm.aggregate(node->getObject()->permYouOwner() ? node->mAggregateTexturePermOwner : node->mAggregateTexturePerm);  	} -	return valid; + +	result_perm = perm; + +	return TRUE;  } @@ -3155,8 +2900,10 @@ void LLSelectMgr::selectDuplicate(const LLVector3& offset, BOOL select_copy)  	}  	else  	{ -		for (LLSelectNode* node = mSelectedObjects->getFirstRootNode(); node; node = mSelectedObjects->getNextRootNode()) +		for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); +			 iter != getSelection()->root_end(); iter++ )  		{ +			LLSelectNode* node = *iter;  			node->mDuplicated = TRUE;  			node->mDuplicatePos = node->getObject()->getPositionGlobal();  			node->mDuplicateRot = node->getObject()->getRotation(); @@ -3173,21 +2920,24 @@ void LLSelectMgr::repeatDuplicate()  		return;  	} -	LLSelectNode* node; -	LLDynamicArray<LLViewerObject*> non_duplicated_objects; +	std::vector<LLViewerObject*> non_duplicated_objects; -	for (node = mSelectedObjects->getFirstRootNode(); node; node = mSelectedObjects->getNextRootNode()) +	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); +		 iter != getSelection()->root_end(); iter++ )  	{ +		LLSelectNode* node = *iter;	  		if (!node->mDuplicated)  		{ -			non_duplicated_objects.put(node->getObject()); +			non_duplicated_objects.push_back(node->getObject());  		}  	}  	// make sure only previously duplicated objects are selected -	for (S32 i = 0; i < non_duplicated_objects.count(); i++) +	for (std::vector<LLViewerObject*>::iterator iter = non_duplicated_objects.begin(); +		 iter != non_duplicated_objects.end(); ++iter)  	{ -		deselectObjectAndFamily(non_duplicated_objects[i]); +		LLViewerObject* objectp = *iter; +		deselectObjectAndFamily(objectp);  	}  	// duplicate objects in place @@ -3199,8 +2949,10 @@ void LLSelectMgr::repeatDuplicate()  	sendListToRegions("ObjectDuplicate", packDuplicateHeader, packDuplicate, &data, SEND_ONLY_ROOTS);  	// move current selection based on delta from duplication position and update duplication position -	for (node = mSelectedObjects->getFirstRootNode(); node; node = mSelectedObjects->getNextRootNode()) +	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); +		 iter != getSelection()->root_end(); iter++ )  	{ +		LLSelectNode* node = *iter;	  		if (node->mDuplicated)  		{  			LLQuaternion cur_rot = node->getObject()->getRotation(); @@ -3420,7 +3172,7 @@ void LLSelectMgr::sendGroup(const LLUUID& group_id)  struct LLBuyData  { -	LLDynamicArray<LLViewerObject*> mObjectsSent; +	std::vector<LLViewerObject*> mObjectsSent;  	LLUUID mCategoryID;  	LLSaleInfo mSaleInfo;  }; @@ -3443,9 +3195,9 @@ void LLSelectMgr::packBuyObjectIDs(LLSelectNode* node, void* data)  	LLBuyData* buy = (LLBuyData*)data;  	LLViewerObject* object = node->getObject(); -	if(buy->mObjectsSent.find(object) == LLDynamicArray<LLViewerObject*>::FAIL) +	if (std::find(buy->mObjectsSent.begin(), buy->mObjectsSent.end(), object) == buy->mObjectsSent.end())  	{ -		buy->mObjectsSent.put(object); +		buy->mObjectsSent.push_back(object);  		gMessageSystem->nextBlockFast(_PREHASH_ObjectData);  		gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, node->getObject()->getLocalID() );  		gMessageSystem->addU8Fast(_PREHASH_SaleType, buy->mSaleInfo.getSaleType()); @@ -3534,7 +3286,6 @@ void LLSelectMgr::deselectUnused()  void LLSelectMgr::convertTransient()  { -	// use STL-style iteration to avoid recursive iteration problems  	LLObjectSelection::iterator node_it;  	for (node_it = mSelectedObjects->begin(); node_it != mSelectedObjects->end(); ++node_it)  	{ @@ -3812,32 +3563,42 @@ void LLSelectMgr::packHingeHead(void *user_data)  void LLSelectMgr::selectionDump()  { -	LLViewerObject *object; - -	for (object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() ) +	struct f : public LLSelectedObjectFunctor  	{ -		object->dump(); -	} +		virtual bool apply(LLViewerObject* object) +		{ +			object->dump(); +			return true; +		} +	} func; +	getSelection()->applyToObjects(&func);	  }  void LLSelectMgr::saveSelectedObjectColors()  { -	LLSelectNode* selectNode; -	for (selectNode = mSelectedObjects->getFirstNode(); selectNode; selectNode = mSelectedObjects->getNextNode() ) +	struct f : public LLSelectedNodeFunctor  	{ -		selectNode->saveColors(); -	} +		virtual bool apply(LLSelectNode* node) +		{ +			node->saveColors(); +			return true; +		} +	} func; +	getSelection()->applyToNodes(&func);	  }  void LLSelectMgr::saveSelectedObjectTextures()  { -	LLSelectNode*		selectNode; -  	// invalidate current selection so we update saved textures -	for (selectNode = mSelectedObjects->getFirstNode(); selectNode; selectNode = mSelectedObjects->getNextNode() ) +	struct f : public LLSelectedNodeFunctor  	{ -		selectNode->mValid = FALSE; -	} +		virtual bool apply(LLSelectNode* node) +		{ +			node->mValid = FALSE; +			return true; +		} +	} func; +	getSelection()->applyToNodes(&func);	  	// request object properties message to get updated permissions data  	sendSelect(); @@ -3848,113 +3609,95 @@ void LLSelectMgr::saveSelectedObjectTextures()  // also need to know to which simulator to send update message  void LLSelectMgr::saveSelectedObjectTransform(EActionType action_type)  { -	LLSelectNode*		selectNode; -  	if (mSelectedObjects->isEmpty())  	{  		// nothing selected, so nothing to save  		return;  	} -	for (selectNode = mSelectedObjects->getFirstNode(); selectNode; selectNode = mSelectedObjects->getNextNode() ) +	struct f : public LLSelectedNodeFunctor  	{ -		LLViewerObject*		object; -		object = selectNode->getObject(); -		selectNode->mSavedPositionLocal = object->getPosition(); -		if (object->isAttachment()) +		EActionType mActionType; +		f(EActionType a) : mActionType(a) {} +		virtual bool apply(LLSelectNode* selectNode)  		{ -			if (object->isRootEdit()) +			LLViewerObject*	object = selectNode->getObject(); +			selectNode->mSavedPositionLocal = object->getPosition(); +			if (object->isAttachment())  			{ -				LLXform* parent_xform = object->mDrawable->getXform()->getParent(); -				if (parent_xform) +				if (object->isRootEdit()) +				{ +					LLXform* parent_xform = object->mDrawable->getXform()->getParent(); +					if (parent_xform) +					{ +						selectNode->mSavedPositionGlobal = gAgent.getPosGlobalFromAgent((object->getPosition() * parent_xform->getWorldRotation()) + parent_xform->getWorldPosition()); +					} +				} +				else  				{ -					selectNode->mSavedPositionGlobal = gAgent.getPosGlobalFromAgent((object->getPosition() * parent_xform->getWorldRotation()) + parent_xform->getWorldPosition()); +					LLViewerObject* attachment_root = (LLViewerObject*)object->getParent(); +					LLXform* parent_xform = attachment_root->mDrawable->getXform()->getParent(); +					LLVector3 root_pos = (attachment_root->getPosition() * parent_xform->getWorldRotation()) + parent_xform->getWorldPosition(); +					LLQuaternion root_rot = (attachment_root->getRotation() * parent_xform->getWorldRotation()); +					selectNode->mSavedPositionGlobal = gAgent.getPosGlobalFromAgent((object->getPosition() * root_rot) + root_pos);  				} +				selectNode->mSavedRotation = object->getRenderRotation();  			}  			else  			{ -				LLViewerObject* attachment_root = (LLViewerObject*)object->getParent(); -				LLXform* parent_xform = attachment_root->mDrawable->getXform()->getParent(); -				LLVector3 root_pos = (attachment_root->getPosition() * parent_xform->getWorldRotation()) + parent_xform->getWorldPosition(); -				LLQuaternion root_rot = (attachment_root->getRotation() * parent_xform->getWorldRotation()); -				selectNode->mSavedPositionGlobal = gAgent.getPosGlobalFromAgent((object->getPosition() * root_rot) + root_pos); +				selectNode->mSavedPositionGlobal = object->getPositionGlobal(); +				selectNode->mSavedRotation = object->getRotationRegion();  			} -			selectNode->mSavedRotation = object->getRenderRotation(); -		} -		else -		{ -			selectNode->mSavedPositionGlobal = object->getPositionGlobal(); -			selectNode->mSavedRotation = object->getRotationRegion(); -		} -		selectNode->mSavedScale = object->getScale(); -		selectNode->saveTextureScaleRatios(); - -	} +			selectNode->mSavedScale = object->getScale(); +			selectNode->saveTextureScaleRatios(); +			return true; +		} +	} func(action_type); +	getSelection()->applyToNodes(&func);	 +	  	mSavedSelectionBBox = getBBoxOfSelection();  } -void LLSelectMgr::selectionUpdatePhysics(BOOL physics) +struct LLSelectMgrApplyFlags : public LLSelectedObjectFunctor  { -	LLViewerObject *object; - -	for (object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() ) +	LLSelectMgrApplyFlags(U32 flags, BOOL state) : mFlags(flags), mState(state) {} +	U32 mFlags; +	BOOL mState; +	virtual bool apply(LLViewerObject* object)  	{ -		if (   !object->permModify()  		// preemptive permissions check -			|| !(object->isRoot()			// don't send for child objects -			|| object->isJointChild())) +		if ( object->permModify() &&	// preemptive permissions check +			 object->isRoot() &&		// don't send for child objects +			 !object->isJointChild())  		{ -			continue; +			object->setFlags( mFlags, mState);  		} -		object->setFlags( FLAGS_USE_PHYSICS, physics); +		return true;  	} +}; + +void LLSelectMgr::selectionUpdatePhysics(BOOL physics) +{ +	LLSelectMgrApplyFlags func(	FLAGS_USE_PHYSICS, physics); +	getSelection()->applyToObjects(&func);	  }  void LLSelectMgr::selectionUpdateTemporary(BOOL is_temporary)  { -	LLViewerObject *object; - -	for (object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() ) -	{ -		if (   !object->permModify()  		// preemptive permissions check -			|| !(object->isRoot()			// don't send for child objects -			|| object->isJointChild())) -		{ -			continue; -		} -		object->setFlags( FLAGS_TEMPORARY_ON_REZ, is_temporary); -	} +	LLSelectMgrApplyFlags func(	FLAGS_TEMPORARY_ON_REZ, is_temporary); +	getSelection()->applyToObjects(&func);	  }  void LLSelectMgr::selectionUpdatePhantom(BOOL is_phantom)  { -	LLViewerObject *object; - -	for (object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() ) -	{ -		if (   !object->permModify()  		// preemptive permissions check -			|| !(object->isRoot()			// don't send for child objects -			|| object->isJointChild())) -		{ -			continue; -		} -		object->setFlags( FLAGS_PHANTOM, is_phantom); -	} +	LLSelectMgrApplyFlags func(	FLAGS_PHANTOM, is_phantom); +	getSelection()->applyToObjects(&func);	  }  void LLSelectMgr::selectionUpdateCastShadows(BOOL cast_shadows)  { -	LLViewerObject *object; - -	for (object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() ) -	{ -		if (   !object->permModify()  		// preemptive permissions check -			|| object->isJointChild()) -		{ -			continue; -		} -		object->setFlags( FLAGS_CAST_SHADOWS, cast_shadows); -	} +	LLSelectMgrApplyFlags func(	FLAGS_CAST_SHADOWS, cast_shadows); +	getSelection()->applyToObjects(&func);	  } @@ -4177,85 +3920,87 @@ void LLSelectMgr::sendListToRegions(const LLString& message_name,  	S32 packets_sent = 0;  	S32 objects_in_this_packet = 0; -  	//clear update override data (allow next update through) -	for (node = mSelectedObjects->getFirstNode(); -		 node; -		 node = mSelectedObjects->getNextNode()) +	struct f : public LLSelectedNodeFunctor  	{ -		node->mLastPositionLocal.setVec(0,0,0); -		node->mLastRotation = LLQuaternion(); -		node->mLastScale.setVec(0,0,0); -	} +		virtual bool apply(LLSelectNode* node) +		{ +			node->mLastPositionLocal.setVec(0,0,0); +			node->mLastRotation = LLQuaternion(); +			node->mLastScale.setVec(0,0,0); +			return true; +		} +	} func; +	getSelection()->applyToNodes(&func);	  	std::queue<LLSelectNode*> nodes_to_send; -	 -	switch(send_type) -	{ -	case SEND_ONLY_ROOTS: -		{ -			node = mSelectedObjects->getFirstRootNode(); -			while(node) -			{ -				nodes_to_send.push(node); -				node = mSelectedObjects->getNextRootNode(); -			} -		} -		break; -	case SEND_INDIVIDUALS: -		node = mSelectedObjects->getFirstNode(); -		while(node) +	struct push_all : public LLSelectedNodeFunctor +	{ +		std::queue<LLSelectNode*>& nodes_to_send; +		push_all(std::queue<LLSelectNode*>& n) : nodes_to_send(n) {} +		virtual bool apply(LLSelectNode* node)  		{  			nodes_to_send.push(node); -			node = mSelectedObjects->getNextNode(); +			return true;  		} -		break; -	case SEND_ROOTS_FIRST: -		// first roots... -		node = mSelectedObjects->getFirstNode(); -		while(node) +	}; +	struct push_some : public LLSelectedNodeFunctor +	{ +		std::queue<LLSelectNode*>& nodes_to_send; +		bool mRoots; +		push_some(std::queue<LLSelectNode*>& n, bool roots) : nodes_to_send(n), mRoots(roots) {} +		virtual bool apply(LLSelectNode* node)  		{ -			if (node->getObject()->isRootEdit()) +			BOOL is_root = node->getObject()->isRootEdit(); +			if ((mRoots && is_root) || (!mRoots && !is_root))  			{  				nodes_to_send.push(node);  			} -			node = mSelectedObjects->getNextNode(); +			return true;  		} - -		// then children... -		node = mSelectedObjects->getFirstNode(); -		while(node) +	}; +	struct push_editable : public LLSelectedNodeFunctor +	{ +		std::queue<LLSelectNode*>& nodes_to_send; +		push_editable(std::queue<LLSelectNode*>& n) : nodes_to_send(n) {} +		virtual bool apply(LLSelectNode* node)  		{ -			if (!node->getObject()->isRootEdit()) +			// look and see if this object is actually modifiable by the current agent, because if it's not, then there's little +			// point in pushing it up to the server to be updated, since we couldn't change it anyway. +			// That just results in errors on screen when this function gets called by other things, like pulling down a drop down menu +			LLViewerObject* object = node->getObject(); +			if( object && (object->permModify() || gAgent.allowOperation(PERM_MODIFY, *node->mPermissions) || gAgent.allowOperation(PERM_MOVE, *node->mPermissions)))  			{  				nodes_to_send.push(node);  			} -			node = mSelectedObjects->getNextNode(); +			return true;  		} +	}; +	struct push_all  pushall(nodes_to_send); +	struct push_some pushroots(nodes_to_send, TRUE); +	struct push_some pushnonroots(nodes_to_send, FALSE); +	struct push_editable pusheditable(nodes_to_send); +	 +	switch(send_type) +	{ +	  case SEND_ONLY_ROOTS: +		getSelection()->applyToRootNodes(&pusheditable); +		break; +	  case SEND_INDIVIDUALS: +		getSelection()->applyToNodes(&pushall); +		break; +	  case SEND_ROOTS_FIRST: +		// first roots... +		getSelection()->applyToNodes(&pushroots); +		// then children... +		getSelection()->applyToNodes(&pushnonroots);  		break; -	case SEND_CHILDREN_FIRST: +	  case SEND_CHILDREN_FIRST:  		// first children... -		node = mSelectedObjects->getFirstNode(); -		while(node) -		{ -			if (!node->getObject()->isRootEdit()) -			{ -				nodes_to_send.push(node); -			} -			node = mSelectedObjects->getNextNode(); -		} - -		// ...then roots -		node = mSelectedObjects->getFirstNode(); -		while(node) -		{ -			if (node->getObject()->isRootEdit()) -			{ -				nodes_to_send.push(node); -			} -			node = mSelectedObjects->getNextNode(); -		} +		getSelection()->applyToNodes(&pushnonroots); +		// then roots... +		getSelection()->applyToNodes(&pushroots);  		break;  	default: @@ -4263,8 +4008,11 @@ void LLSelectMgr::sendListToRegions(const LLString& message_name,  	}  	// bail if nothing selected -	if (nodes_to_send.empty()) return; - +	if (nodes_to_send.empty()) +	{ +		return; +	} +	  	node = nodes_to_send.front();  	nodes_to_send.pop(); @@ -4426,27 +4174,24 @@ void LLSelectMgr::processObjectProperties(LLMessageSystem* msg, void** user_data  			for (S32 buf_offset = 0; buf_offset < size; buf_offset += UUID_BYTES)  			{ -				LLUUID id; -				memcpy(id.mData, packed_buffer + buf_offset, UUID_BYTES);		/* Flawfinder: ignore */ -				texture_ids.push_back(id); +				LLUUID tid; +				memcpy(tid.mData, packed_buffer + buf_offset, UUID_BYTES);		/* Flawfinder: ignore */ +				texture_ids.push_back(tid);  			}  		}  		// Iterate through nodes at end, since it can be on both the regular AND hover list -		BOOL found = FALSE; -		LLSelectNode* node; -		for (node = gSelectMgr->mSelectedObjects->getFirstNode(); -			 node; -			 node = gSelectMgr->mSelectedObjects->getNextNode()) +		struct f : public LLSelectedNodeFunctor  		{ -			if (node->getObject()->mID == id) +			LLUUID mID; +			f(const LLUUID& id) : mID(id) {} +			virtual bool apply(LLSelectNode* node)  			{ -				found = TRUE; -				break; +				return (node->getObject()->mID == mID);  			} -		} - +		} func(id); +		LLSelectNode* node = gSelectMgr->getSelection()->getFirstNode(&func);  		if (node)  		{ @@ -4579,23 +4324,21 @@ void LLSelectMgr::processObjectPropertiesFamily(LLMessageSystem* msg, void** use  			LLString fullname(first_name);  			fullname.append(" ");  			fullname.append(last_name); -			reporterp->setPickedObjectProperties(name, fullname.c_str(), owner_id); +			reporterp->setPickedObjectProperties(name, fullname, owner_id);  		}  	}  	// Now look through all of the hovered nodes -	BOOL found = FALSE; -	LLSelectNode* node; -	for (node = gSelectMgr->mHoverObjects->getFirstNode(); -		 node; -		 node = gSelectMgr->mHoverObjects->getNextNode()) +	struct f : public LLSelectedNodeFunctor  	{ -		if (node->getObject()->mID == id) +		LLUUID mID; +		f(const LLUUID& id) : mID(id) {} +		virtual bool apply(LLSelectNode* node)  		{ -			found = TRUE; -			break; +			return (node->getObject()->mID == mID);  		} -	} +	} func(id); +	LLSelectNode* node = gSelectMgr->getHoverObjects()->getFirstNode(&func);  	if (node)  	{ @@ -4627,7 +4370,7 @@ void LLSelectMgr::processForceObjectSelect(LLMessageSystem* msg, void**)  	LLUUID full_id;  	S32 local_id;  	LLViewerObject* object; -	LLDynamicArray<LLViewerObject*> objects; +	std::vector<LLViewerObject*> objects;  	S32 i;  	S32 block_count = msg->getNumberOfBlocks("Data"); @@ -4642,7 +4385,7 @@ void LLSelectMgr::processForceObjectSelect(LLMessageSystem* msg, void**)  		object = gObjectList.findObject(full_id);  		if (object)  		{ -			objects.put(object); +			objects.push_back(object);  		}  	} @@ -4655,7 +4398,6 @@ extern LLGLdouble	gGLModelView[16];  void LLSelectMgr::updateSilhouettes()  { -	LLSelectNode *node;  	S32 num_sils_genned = 0;  	LLVector3d	cameraPos = gAgent.getCameraPositionGlobal(); @@ -4668,21 +4410,24 @@ void LLSelectMgr::updateSilhouettes()  		mSilhouetteImagep = gImageList.getImage(id, TRUE, TRUE);  	} +	mHighlightedObjects->cleanupNodes();  	if((cameraPos - mLastCameraPos).magVecSquared() > SILHOUETTE_UPDATE_THRESHOLD_SQUARED * currentCameraZoom * currentCameraZoom)  	{ -		for (node = mSelectedObjects->getFirstNode(); node; node = mSelectedObjects->getNextNode() ) +		struct f : public LLSelectedObjectFunctor  		{ -			if (node->getObject()) +			virtual bool apply(LLViewerObject* object)  			{ -				node->getObject()->setChanged(LLXform::SILHOUETTE); +				object->setChanged(LLXform::SILHOUETTE); +				return true;  			} -		} +		} func; +		getSelection()->applyToObjects(&func);	  		mLastCameraPos = gAgent.getCameraPositionGlobal();  	} -	LLDynamicArray<LLViewerObject*> changed_objects; +	std::vector<LLViewerObject*> changed_objects;  	if (mSelectedObjects->getNumNodes())  	{ @@ -4693,8 +4438,10 @@ void LLSelectMgr::updateSilhouettes()  		for (S32 pass = 0; pass < 2; pass++)  		{ -			for (node = mSelectedObjects->getFirstNode(); node; node = mSelectedObjects->getNextNode() ) +			for (LLObjectSelection::iterator iter = mSelectedObjects->begin(); +				 iter != mSelectedObjects->end(); iter++)  			{ +				LLSelectNode* node = *iter;  				LLViewerObject* objectp = node->getObject();  				// do roots first, then children so that root flags are cleared ASAP @@ -4712,7 +4459,7 @@ void LLSelectMgr::updateSilhouettes()  					if (num_sils_genned++ < MAX_SILS_PER_FRAME)// && objectp->mDrawable->isVisible())  					{  						generateSilhouette(node, gCamera->getOrigin()); -						changed_objects.put(objectp); +						changed_objects.push_back(objectp);  					}  					else if (objectp->isAttachment())  					{ @@ -4761,20 +4508,23 @@ void LLSelectMgr::updateSilhouettes()  		}  		// remove highlight nodes not in roots list -		LLDynamicArray<LLSelectNode*> remove_these_nodes; -		LLDynamicArray<LLViewerObject*> remove_these_roots; -		for (LLSelectNode* nodep = mHighlightedObjects->getFirstNode(); nodep; nodep = mHighlightedObjects->getNextNode()) +		std::vector<LLSelectNode*> remove_these_nodes; +		std::vector<LLViewerObject*> remove_these_roots; + +		for (LLObjectSelection::iterator iter = mHighlightedObjects->begin(); +			 iter != mHighlightedObjects->end(); iter++)  		{ -			LLViewerObject* objectp = nodep->getObject(); +			LLSelectNode* node = *iter; +			LLViewerObject* objectp = node->getObject();  			if (objectp->isRoot() || !select_linked_set)  			{  				if (roots.count(objectp) == 0)  				{ -					remove_these_nodes.put(nodep); +					remove_these_nodes.push_back(node);  				}  				else  				{ -					remove_these_roots.put(objectp); +					remove_these_roots.push_back(objectp);  				}  			}  			else @@ -4783,22 +4533,25 @@ void LLSelectMgr::updateSilhouettes()  				if (roots.count(rootp) == 0)  				{ -					remove_these_nodes.put(nodep); +					remove_these_nodes.push_back(node);  				}  			}  		}  		// remove all highlight nodes no longer in rectangle selection -		S32 i; -		for (i = 0; i < remove_these_nodes.count(); i++) +		for (std::vector<LLSelectNode*>::iterator iter = remove_these_nodes.begin(); +			 iter != remove_these_nodes.end(); ++iter)  		{ -			mHighlightedObjects->removeNode(remove_these_nodes[i]); +			LLSelectNode* nodep = *iter; +			mHighlightedObjects->removeNode(nodep);  		}  		// remove all root objects already being highlighted -		for (i = 0; i < remove_these_roots.count(); i++) +		for (std::vector<LLViewerObject*>::iterator iter = remove_these_roots.begin(); +			 iter != remove_these_roots.end(); ++iter)  		{ -			roots.erase(remove_these_roots[i]); +			LLViewerObject* objectp = *iter; +			roots.erase(objectp);  		}  		// add all new objects in rectangle selection @@ -4820,16 +4573,17 @@ void LLSelectMgr::updateSilhouettes()  			}  			else  			{ -				for (U32 i = 0; i < objectp->mChildList.size(); i++) +				for (LLViewerObject::child_list_t::iterator iter = objectp->mChildList.begin(); +					 iter != objectp->mChildList.end(); ++iter)  				{ -					LLViewerObject* child_objectp = objectp->mChildList[i]; - +					LLViewerObject* child_objectp = *iter; +				  					if (!canSelectObject(child_objectp))  					{  						continue;  					} -					LLSelectNode* rect_select_node = new LLSelectNode(objectp->mChildList[i], TRUE); +					LLSelectNode* rect_select_node = new LLSelectNode(child_objectp, TRUE);  					rect_select_node->selectAllTEs(TRUE);  					mHighlightedObjects->addNodeAtEnd(rect_select_node);  				} @@ -4845,8 +4599,10 @@ void LLSelectMgr::updateSilhouettes()  		//BOOL subtracting_from_selection = (gKeyboard->currentMask(TRUE) == MASK_CONTROL);  		for (S32 pass = 0; pass < 2; pass++)  		{ -			for (node = mHighlightedObjects->getFirstNode(); node; node = mHighlightedObjects->getNextNode() ) +			for (LLObjectSelection::iterator iter = mHighlightedObjects->begin(); +				 iter != mHighlightedObjects->end(); iter++)  			{ +				LLSelectNode* node = *iter;  				LLViewerObject* objectp = node->getObject();  				// do roots first, then children so that root flags are cleared ASAP @@ -4864,7 +4620,7 @@ void LLSelectMgr::updateSilhouettes()  					if (num_sils_genned++ < MAX_SILS_PER_FRAME)  					{  						generateSilhouette(node, gCamera->getOrigin()); -						changed_objects.put(objectp);			 +						changed_objects.push_back(objectp);			  					}  					else if (objectp->isAttachment() && objectp->getRootEdit()->mDrawable.notNull())  					{ @@ -4897,10 +4653,12 @@ void LLSelectMgr::updateSilhouettes()  		mHighlightedObjects->deleteAllNodes();  	} -	for (S32 i = 0; i < changed_objects.count(); i++) +	for (std::vector<LLViewerObject*>::iterator iter = changed_objects.begin(); +		 iter != changed_objects.end(); ++iter)  	{  		// clear flags after traversing node list (as child objects need to refer to parent flags, etc) -		changed_objects[i]->clearChanged(LLXform::MOVED | LLXform::SILHOUETTE); +		LLViewerObject* objectp = *iter; +		objectp->clearChanged(LLXform::MOVED | LLXform::SILHOUETTE);  	}  	//glAlphaFunc(GL_GREATER, 0.01f); @@ -4913,8 +4671,7 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud)  		return;  	} -	LLSelectNode *node; -	LLViewerImage::bindTexture(gSelectMgr->mSilhouetteImagep); +	LLViewerImage::bindTexture(mSilhouetteImagep);  	LLGLSPipelineSelection gls_select;  	glAlphaFunc(GL_GREATER, 0.0f);  	LLGLEnable blend(GL_BLEND); @@ -4946,8 +4703,10 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud)  		LLUUID inspect_item_id = LLFloaterInspect::getSelectedUUID();  		for (S32 pass = 0; pass < 2; pass++)  		{ -			for (node = mSelectedObjects->getFirstNode(); node; node = mSelectedObjects->getNextNode() ) +			for (LLObjectSelection::iterator iter = mSelectedObjects->begin(); +				 iter != mSelectedObjects->end(); iter++)  			{ +				LLSelectNode* node = *iter;  				LLViewerObject* objectp = node->getObject();  				if (objectp->isHUDAttachment() != for_hud)  				{ @@ -4982,8 +4741,10 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud)  		BOOL subtracting_from_selection = (gKeyboard->currentMask(TRUE) == MASK_CONTROL);  		for (S32 pass = 0; pass < 2; pass++)  		{ -			for (node = mHighlightedObjects->getFirstNode(); node; node = mHighlightedObjects->getNextNode() ) +			for (LLObjectSelection::iterator iter = mHighlightedObjects->begin(); +				 iter != mHighlightedObjects->end(); iter++)  			{ +				LLSelectNode* node = *iter;  				LLViewerObject* objectp = node->getObject();  				if (objectp->isHUDAttachment() != for_hud)  				{ @@ -5013,7 +4774,7 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud)  		stop_glerror();  	} -	gSelectMgr->mSilhouetteImagep->unbindTexture(0, GL_TEXTURE_2D); +	mSilhouetteImagep->unbindTexture(0, GL_TEXTURE_2D);  	glAlphaFunc(GL_GREATER, 0.01f);  } @@ -5142,7 +4903,7 @@ S32 LLSelectNode::getLastSelectedTE()  	return mLastTESelected;  } -LLViewerObject *LLSelectNode::getObject() +LLViewerObject* LLSelectNode::getObject()  {  	if (!mObject)  	{ @@ -5155,6 +4916,11 @@ LLViewerObject *LLSelectNode::getObject()  	return mObject;  } +void LLSelectNode::setObject(LLViewerObject* object) +{ +	mObject = object; +} +  void LLSelectNode::saveColors()  {  	if (mObject.notNull()) @@ -5174,8 +4940,8 @@ void LLSelectNode::saveTextures(const std::vector<LLUUID>& textures)  	{  		mSavedTextures.clear(); -		std::vector<LLUUID>::const_iterator texture_it; -		for (texture_it = textures.begin(); texture_it != textures.end(); ++texture_it) +		for (std::vector<LLUUID>::const_iterator texture_it = textures.begin(); +			 texture_it != textures.end(); ++texture_it)  		{  			mSavedTextures.push_back(*texture_it);  		} @@ -5195,7 +4961,7 @@ void LLSelectNode::saveTextureScaleRatios()  			U32 s_axis = 0;  			U32 t_axis = 0; -			gSelectMgr->getTESTAxes(mObject, i, &s_axis, &t_axis); +			LLPrimitive::getTESTAxes(i, &s_axis, &t_axis);  			LLVector3 v;  			LLVector3 scale = mObject->getScale(); @@ -5491,9 +5257,10 @@ S32 get_family_count(LLViewerObject *parent)  		llwarns << "Trying to get_family_count on null parent!" << llendl;  	}  	S32 count = 1;	// for this object -	for (U32 i = 0; i < parent->mChildList.size(); i++) +	for (LLViewerObject::child_list_t::iterator iter = parent->mChildList.begin(); +		 iter != parent->mChildList.end(); ++iter)  	{ -		LLViewerObject* child = parent->mChildList[i]; +		LLViewerObject* child = *iter;  		if (!child)  		{ @@ -5524,7 +5291,7 @@ void LLSelectMgr::updateSelectionCenter()  	//override any object updates received  	//for selected objects -	gSelectMgr->overrideObjectUpdates(); +	overrideObjectUpdates();  	LLViewerObject* object = mSelectedObjects->getFirstObject();  	if (!object) @@ -5568,10 +5335,13 @@ void LLSelectMgr::updateSelectionCenter()  		LLVector3d select_center;  		// keep a list of jointed objects for showing the joint HUDEffects -		LLDynamicArray < LLViewerObject *> jointed_objects; +		std::vector < LLViewerObject *> jointed_objects; -		for (object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() ) +		for (LLObjectSelection::iterator iter = mSelectedObjects->begin(); +			 iter != mSelectedObjects->end(); iter++)  		{ +			LLSelectNode* node = *iter; +			LLViewerObject* object = node->getObject();  			LLViewerObject *myAvatar = gAgent.getAvatarObject();  			LLViewerObject *root = object->getRootEdit();  			if (mSelectedObjects->mSelectType == SELECT_TYPE_WORLD && // not an attachment @@ -5585,9 +5355,9 @@ void LLSelectMgr::updateSelectionCenter()  			if (object->isJointChild())  			{ -				jointed_objects.put(object); +				jointed_objects.push_back(object);  			} -		} // end for +		}  		LLVector3 bbox_center_agent = bbox.getCenterAgent();  		mSelectionCenterGlobal = gAgent.getPosGlobalFromAgent(bbox_center_agent); @@ -5717,6 +5487,7 @@ void LLSelectMgr::redo()  //-----------------------------------------------------------------------------  BOOL LLSelectMgr::canDoDelete()  { +	// Note: Can only delete root objects (see getFirstDeleteableObject() for more info)  	return mSelectedObjects->getFirstDeleteableObject() != NULL;  } @@ -5781,14 +5552,18 @@ ESelectType LLSelectMgr::getSelectTypeForObject(LLViewerObject* object)  void LLSelectMgr::validateSelection()  { -	LLViewerObject* objectp; -	for (objectp = mSelectedObjects->getFirstObject(); objectp; objectp = mSelectedObjects->getNextObject()) +	struct f : public LLSelectedObjectFunctor  	{ -		if (!canSelectObject(objectp)) +		virtual bool apply(LLViewerObject* object)  		{ -			deselectObjectOnly(objectp); +			if (!gSelectMgr->canSelectObject(object)) +			{ +				gSelectMgr->deselectObjectOnly(object); +			} +			return true;  		} -	} +	} func; +	getSelection()->applyToObjects(&func);	  }  BOOL LLSelectMgr::canSelectObject(LLViewerObject* object) @@ -5830,17 +5605,28 @@ BOOL LLSelectMgr::setForceSelection(BOOL force)  }  LLObjectSelection::LLObjectSelection() :  -	std::list<LLSelectNode*>(),   	LLRefCount(), -	mCurrentNode(end()), -	mCurrentTE(-1),  	mSelectType(SELECT_TYPE_WORLD)  {  }  LLObjectSelection::~LLObjectSelection()  { -	std::for_each(begin(), end(), DeletePointer()); +	deleteAllNodes(); +} + +void LLObjectSelection::cleanupNodes() +{ +	for (list_t::iterator iter = mList.begin(); iter != mList.end(); ) +	{ +		list_t::iterator curiter = iter++; +		LLSelectNode* node = *curiter; +		if (node->getObject() == NULL || node->getObject()->isDead()) +		{ +			mList.erase(curiter); +			delete node; +		} +	}  }  void LLObjectSelection::updateEffects() @@ -5849,43 +5635,46 @@ void LLObjectSelection::updateEffects()  S32 LLObjectSelection::getNumNodes()  { -	return size(); +	return mList.size();  }  void LLObjectSelection::addNode(LLSelectNode *nodep)  { -	push_front(nodep); +	llassert_always(nodep->getObject() && !nodep->getObject()->isDead()); +	mList.push_front(nodep);  	mSelectNodeMap[nodep->getObject()] = nodep;  }  void LLObjectSelection::addNodeAtEnd(LLSelectNode *nodep)  { -	push_back(nodep); +	llassert_always(nodep->getObject() && !nodep->getObject()->isDead()); +	mList.push_back(nodep);  	mSelectNodeMap[nodep->getObject()] = nodep;  } +void LLObjectSelection::moveNodeToFront(LLSelectNode *nodep) +{ +	mList.remove(nodep); +	mList.push_front(nodep); +} +  void LLObjectSelection::removeNode(LLSelectNode *nodep)  { -	std::list<LLSelectNode*>::iterator iter = begin(); -	while(iter != end()) +	mSelectNodeMap.erase(nodep->getObject()); +	if (nodep->getObject() == mPrimaryObject)  	{ -		if ((*iter) == nodep) -		{ -			mSelectNodeMap.erase(nodep->getObject()); -			iter = erase(iter); -		} -		else -		{ -			++iter; -		} +		mPrimaryObject = NULL;  	} +	nodep->setObject(NULL); // Will get erased in cleanupNodes() +	mList.remove(nodep);  }  void LLObjectSelection::deleteAllNodes()  { -	std::for_each(begin(), end(), DeletePointer()); -	clear(); +	std::for_each(mList.begin(), mList.end(), DeletePointer()); +	mList.clear();  	mSelectNodeMap.clear(); +	mPrimaryObject = NULL;  }  LLSelectNode* LLObjectSelection::findNode(LLViewerObject* objectp) @@ -5899,357 +5688,11 @@ LLSelectNode* LLObjectSelection::findNode(LLViewerObject* objectp)  }  //----------------------------------------------------------------------------- -// getFirstNode() -//----------------------------------------------------------------------------- -LLSelectNode *LLObjectSelection::getFirstNode() -{ -	mCurrentNode = begin();//getFirstData(); - -	while (mCurrentNode != end() && !(*mCurrentNode)->getObject()) -	{ -		// The object on this was killed at some point, delete it. -		erase(mCurrentNode++); -	} - -	if (mCurrentNode != end()) -	{ -		return *mCurrentNode; -	} -	 -	return NULL; -} - -//----------------------------------------------------------------------------- -// getCurrentNode() -//----------------------------------------------------------------------------- -LLSelectNode *LLObjectSelection::getCurrentNode() -{ -	while (mCurrentNode != end() && !(*mCurrentNode)->getObject()) -	{ -		// The object on this was killed at some point, delete it. -		erase(mCurrentNode++); -	} - -	if (mCurrentNode != end()) -	{ -		return *mCurrentNode; -	} -	return NULL; -} - -//----------------------------------------------------------------------------- -// getNextNode() -//----------------------------------------------------------------------------- -LLSelectNode *LLObjectSelection::getNextNode() -{ -	++mCurrentNode; - -	while (mCurrentNode != end() && !(*mCurrentNode)->getObject()) -	{ -		// The object on this was killed at some point, delete it. -		erase(mCurrentNode++); -	} - -	if (mCurrentNode != end()) -	{ -		return *mCurrentNode; -	} -	return NULL; -} - - - -//----------------------------------------------------------------------------- -// getFirstObject() -//----------------------------------------------------------------------------- -LLViewerObject* LLObjectSelection::getFirstObject() -{ -	mCurrentNode = begin(); - -	while (mCurrentNode != end() && !(*mCurrentNode)->getObject()) -	{ -		// The object on this was killed at some point, delete it. -		erase(mCurrentNode++); -	} - -	if (mCurrentNode != end()) -	{ -		return (*mCurrentNode)->getObject(); -	} - -	return NULL; -} - - -//----------------------------------------------------------------------------- -// getNextObject() -//----------------------------------------------------------------------------- -LLViewerObject* LLObjectSelection::getNextObject() -{ -	++mCurrentNode;// = getNextData(); - -	while (mCurrentNode != end() && !(*mCurrentNode)->getObject()) -	{ -		// The object on this was killed at some point, delete it. -		erase(mCurrentNode++); -	} - -	if (mCurrentNode != end()) -	{ -		return (*mCurrentNode)->getObject(); -	} - -	return NULL; -} - - - -//----------------------------------------------------------------------------- -// getPrimaryTE() -//----------------------------------------------------------------------------- -void LLObjectSelection::getPrimaryTE(LLViewerObject* *object, S32 *te) -{ -	// initialize object and te -	*te = 0; -	*object = NULL; - -	BOOL searching_roots = TRUE; - -	// try for root node first, then first child node -	LLSelectNode *primary_node = getFirstNode(); //getFirstRootNode(); -	if (!primary_node) -	{ -		primary_node = getFirstNode(); -		searching_roots = FALSE; -	} - -	while (primary_node) -	{ -		S32 last_selected_te = primary_node->getLastSelectedTE(); -		if (last_selected_te >= 0) -		{ -			*object = primary_node->getObject(); -			*te = last_selected_te; -			return; -		} -		for(S32 cur_te = 0; cur_te < primary_node->getObject()->getNumTEs(); cur_te++) -		{ -			// if face selected -			if (primary_node->isTESelected(cur_te)) -			{ -				// return this object and face -				*object = primary_node->getObject(); -				*te = cur_te; -				return; -			} -		} -		if (searching_roots) -		{ -			primary_node = getNextRootNode(); -			if (!primary_node) -			{ -				primary_node = getFirstNode(); -				searching_roots = FALSE; -			} -		} -		else -		{ -			primary_node = getNextNode(); -		} -	} -} - -//----------------------------------------------------------------------------- -// getFirstTE() -//----------------------------------------------------------------------------- -void LLObjectSelection::getFirstTE(LLViewerObject* *object, S32 *te) -{ -	// start with first face -	mCurrentTE = 0; - -	LLSelectNode *cur_node = getFirstNode(); - -	// repeat over all selection nodes -	while (cur_node) -	{ -		// skip objects with no faces -		if (cur_node->getObject()->getNumTEs() == 0) -		{ -			mCurrentTE = 0; -			cur_node = getNextNode(); -			continue; -		} - -		// repeat over all faces for this object -		while (mCurrentTE < cur_node->getObject()->getNumTEs()) -		{ -			// if face selected -			if (cur_node->isTESelected(mCurrentTE)) -			{ -				// return this object and face -				*object = cur_node->getObject(); -				*te = mCurrentTE; -				return; -			} - -			mCurrentTE++; -		} - -		// Couldn't find a selected face. -		// This can happen if an object's volume parameters are changed in such a way -		// that texture entries are eliminated. -		// -		// TODO: Consider selecting all faces in this case?  Subscribe the selection -		// list to the volume changing code? - -		mCurrentTE = 0; -		cur_node = getNextNode(); -	} - -	// The list doesn't contain any nodes.  Return NULL. -	*object = NULL; -	*te = -1; -	return; -} - - -//----------------------------------------------------------------------------- -// getNextFace() -//----------------------------------------------------------------------------- -void LLObjectSelection::getNextTE(LLViewerObject* *object, S32 *te) -{ -	// try next face -	mCurrentTE++; - -	LLSelectNode *cur_node = getCurrentNode(); -	// repeat over remaining selection nodes -	while ( cur_node ) -	{ -		// skip objects with no faces -		if (cur_node->getObject()->getNumTEs() == 0) -		{ -			mCurrentTE = 0; -			cur_node = getNextNode(); -			continue; -		} - -		// repeat over all faces for this object -		// CRO: getNumTEs() no longer equals mFaces.count(), so use mFaces.count() instead -		while ( mCurrentTE < cur_node->getObject()->getNumTEs() ) -		{ -			// if face selected -			if (cur_node->isTESelected(mCurrentTE)) -			{ -				// return this object and face -				*object = cur_node->getObject(); -				*te = mCurrentTE; -				return; -			} - -			mCurrentTE++; -		} - -		mCurrentTE = 0; -		cur_node = getNextNode(); -	} - -	// The list doesn't contain any nodes.  Return NULL. -	*object = NULL; -	*te = -1; -	return; -} - -void LLObjectSelection::getCurrentTE(LLViewerObject* *object, S32 *te) -{ -	if (mCurrentNode != end()) -	{ -		*object = (*mCurrentNode)->getObject(); -		*te = mCurrentTE; -	} -	else -	{ -		*object = NULL; -		*te = -1; -	} -} -//----------------------------------------------------------------------------- -// getFirstRootNode() -//----------------------------------------------------------------------------- -LLSelectNode *LLObjectSelection::getFirstRootNode() -{ -	LLSelectNode *cur_node = getFirstNode(); - -	// scan through child objects and roots set to ignore -	while (cur_node &&  -				(!(cur_node->getObject()->isRootEdit() || cur_node->getObject()->isJointChild()) || -					cur_node->mIndividualSelection)) -	{ -		cur_node = getNextNode(); -	} - -	return cur_node; -} - - -//----------------------------------------------------------------------------- -// getNextRootNode() -//----------------------------------------------------------------------------- -LLSelectNode *LLObjectSelection::getNextRootNode() -{ -	LLSelectNode *cur_node = getNextNode(); - -	while (cur_node &&  -				(!(cur_node->getObject()->isRootEdit() || cur_node->getObject()->isJointChild()) || -					cur_node->mIndividualSelection)) -	{ -		cur_node = getNextNode(); -	} - -	return cur_node; -} - - -//----------------------------------------------------------------------------- -// getFirstRootObject() -//----------------------------------------------------------------------------- -LLViewerObject *LLObjectSelection::getFirstRootObject() -{ -	LLSelectNode *node = getFirstRootNode(); - -	if (node) -	{ -		return node->getObject(); -	} -	else -	{ -		return NULL; -	} -} - - -//----------------------------------------------------------------------------- -// getNextRootObject() -//----------------------------------------------------------------------------- -LLViewerObject *LLObjectSelection::getNextRootObject() -{ -	LLSelectNode *node = getNextRootNode(); - -	if (node) -	{ -		return node->getObject(); -	} -	else -	{ -		return NULL; -	} -} - -//-----------------------------------------------------------------------------  // isEmpty()  //-----------------------------------------------------------------------------  BOOL LLObjectSelection::isEmpty()  { -	return (size() == 0); +	return (mList.size() == 0);  }  //----------------------------------------------------------------------------- @@ -6257,24 +5700,20 @@ BOOL LLObjectSelection::isEmpty()  //-----------------------------------------------------------------------------  BOOL LLObjectSelection::getOwnershipCost(S32 &cost)  { -	S32 count = 0; -	for( LLSelectNode* nodep = getFirstNode(); nodep; nodep = getNextNode() ) -	{ -		count++; -	} - +	S32 count = getObjectCount();  	cost = count * OWNERSHIP_COST_PER_OBJECT; -  	return (count > 0);  }  //----------------------------------------------------------------------------- -// getObjectCount() +// getObjectCount() - returns number of non null objects  //-----------------------------------------------------------------------------  S32 LLObjectSelection::getObjectCount()  { -	return getNumNodes(); +	cleanupNodes(); +	S32 count = mList.size(); +	return count;  } @@ -6284,23 +5723,19 @@ S32 LLObjectSelection::getObjectCount()  S32 LLObjectSelection::getTECount()  {  	S32 count = 0; - -	LLSelectNode* nodep; -	for (nodep = getFirstNode(); nodep; nodep = getNextNode() ) +	for (LLObjectSelection::iterator iter = begin(); iter != end(); iter++)  	{ -		if (nodep->getObject()) +		LLSelectNode* node = *iter; +		LLViewerObject* object = node->getObject(); +		S32 num_tes = object->getNumTEs(); +		for (S32 te = 0; te < num_tes; te++)  		{ -			S32 num_tes = nodep->getObject()->getNumTEs(); -			for (S32 te = 0; te < num_tes; te++) +			if (node->isTESelected(te))  			{ -				if (nodep->isTESelected(te)) -				{ -					count++; -				} +				++count;  			}  		}  	} -  	return count;  } @@ -6309,47 +5744,97 @@ S32 LLObjectSelection::getTECount()  //-----------------------------------------------------------------------------  S32 LLObjectSelection::getRootObjectCount()  { -	LLSelectNode *nodep; -  	S32 count = 0; -	for(nodep = getFirstRootNode(); nodep; nodep = getNextRootNode()) +	for (LLObjectSelection::root_iterator iter = root_begin(); iter != root_end(); iter++)  	{  		++count;  	}  	return count;  } -bool LLObjectSelection::applyToObjects(LLSelectedObjectFunctor* func) +bool LLObjectSelection::applyToObjects(LLSelectedObjectFunctor* func, bool firstonly)  { -	bool result = true; -	LLViewerObject* object; -	for (object = getFirstObject(); object != NULL; object = getNextObject()) +	bool result = firstonly ? false : true; +	for (iterator iter = begin(); iter != end(); )  	{ -		result = result && func->apply(object); +		iterator nextiter = iter++; +		LLViewerObject* object = (*nextiter)->getObject(); +		bool r = func->apply(object); +		if (firstonly && r) +			return true; +		else +			result = result && r;  	}  	return result;  } -bool LLObjectSelection::applyToRootObjects(LLSelectedObjectFunctor* func) +bool LLObjectSelection::applyToRootObjects(LLSelectedObjectFunctor* func, bool firstonly)  { -	bool result = true; -	LLViewerObject* object; -	for (object = getFirstRootObject();  -		 object != NULL;  -		 object = getNextRootObject()) +	bool result = firstonly ? false : true; +	for (root_iterator iter = root_begin(); iter != root_end(); )  	{ -		result = result && func->apply(object); +		root_iterator nextiter = iter++; +		LLViewerObject* object = (*nextiter)->getObject(); +		bool r = func->apply(object); +		if (firstonly && r) +			return true; +		else +			result = result && r;  	}  	return result;  } -bool LLObjectSelection::applyToNodes(LLSelectedNodeFunctor *func) +bool LLObjectSelection::applyToTEs(LLSelectedTEFunctor* func, bool firstonly)  { -	bool result = true; -	LLSelectNode* node; -	for (node = getFirstNode(); node != NULL; node = getNextNode()) +	bool result = firstonly ? false : true; +	for (iterator iter = begin(); iter != end(); )  	{ -		result = result && func->apply(node); +		iterator nextiter = iter++; +		LLSelectNode* node = *nextiter; +		LLViewerObject* object = (*nextiter)->getObject(); +		for (S32 te = 0; te < object->getNumTEs(); ++te) +		{ +			if (node->isTESelected(te)) +			{ +				bool r = func->apply(object, te); +				if (firstonly && r) +					return true; +				else +					result = result && r; +			} +		} +	} +	return result; +} + +bool LLObjectSelection::applyToNodes(LLSelectedNodeFunctor *func, bool firstonly) +{ +	bool result = firstonly ? false : true; +	for (iterator iter = begin(); iter != end(); ) +	{ +		iterator nextiter = iter++; +		LLSelectNode* node = *nextiter; +		bool r = func->apply(node); +		if (firstonly && r) +			return true; +		else +			result = result && r; +	} +	return result; +} + +bool LLObjectSelection::applyToRootNodes(LLSelectedNodeFunctor *func, bool firstonly) +{ +	bool result = firstonly ? false : true; +	for (root_iterator iter = root_begin(); iter != root_end(); ) +	{ +		root_iterator nextiter = iter++; +		LLSelectNode* node = *nextiter; +		bool r = func->apply(node); +		if (firstonly && r) +			return true; +		else +			result = result && r;  	}  	return result;  } @@ -6368,12 +5853,13 @@ BOOL LLObjectSelection::contains(LLViewerObject* object)  //-----------------------------------------------------------------------------  BOOL LLObjectSelection::contains(LLViewerObject* object, S32 te)  { -	LLSelectNode *nodep;  	if (te == SELECT_ALL_TES)  	{  		// ...all faces -		for (nodep = getFirstNode(); nodep; nodep = getNextNode() ) +		for (LLObjectSelection::iterator iter = begin(); +			 iter != end(); iter++)  		{ +			LLSelectNode* nodep = *iter;  			if (nodep->getObject() == object)  			{  				BOOL all_selected = TRUE; @@ -6389,8 +5875,9 @@ BOOL LLObjectSelection::contains(LLViewerObject* object, S32 te)  	else  	{  		// ...one face -		for (nodep = getFirstNode(); nodep; nodep = getNextNode() ) +		for (LLObjectSelection::iterator iter = begin(); iter != end(); iter++)  		{ +			LLSelectNode* nodep = *iter;  			if (nodep->getObject() == object && nodep->isTESelected(te))  			{  				return TRUE; @@ -6407,203 +5894,193 @@ BOOL LLObjectSelection::isAttachment()  }  //----------------------------------------------------------------------------- -// getFirstMoveableNode() +// getSelectedParentObject()  //----------------------------------------------------------------------------- -LLSelectNode* LLObjectSelection::getFirstMoveableNode(BOOL get_root) +LLViewerObject* getSelectedParentObject(LLViewerObject *object)  { -	LLSelectNode* selectNode = NULL; - -	if (get_root) +	LLViewerObject *parent; +	while (object && (parent = (LLViewerObject*)object->getParent()))  	{ -		for(selectNode = getFirstRootNode(); selectNode; selectNode = getNextRootNode()) +		if (parent->isSelected())  		{ -			if( selectNode->getObject()->permMove() ) -			{ -				return selectNode; -				break; -			} +			object = parent;  		} -	} -	for(selectNode = getFirstNode(); selectNode; selectNode = getNextNode()) -	{ -		if( selectNode->getObject()->permMove() ) +		else  		{ -			return selectNode;  			break;  		}  	} -	 -	return NULL; +	return object;  }  //----------------------------------------------------------------------------- -// getFirstCopyableObject() +// getFirstNode  //----------------------------------------------------------------------------- -LLViewerObject* LLObjectSelection::getFirstCopyableObject(BOOL get_root) +LLSelectNode* LLObjectSelection::getFirstNode(LLSelectedNodeFunctor* func)  { -	LLViewerObject* object = NULL; -	for(LLViewerObject* cur = getFirstObject(); cur; cur = getNextObject()) +	for (iterator iter = begin(); iter != end(); ++iter)  	{ -		if( cur->permCopy() && !cur->isAttachment()) +		LLSelectNode* node = *iter; +		if (func == NULL || func->apply(node))  		{ -			object = cur; -			break; +			return node;  		} -	}	 +	} +	return NULL; +} -	if (get_root && object) +LLSelectNode* LLObjectSelection::getFirstRootNode(LLSelectedNodeFunctor* func, BOOL non_root_ok) +{ +	for (root_iterator iter = root_begin(); iter != root_end(); ++iter)  	{ -		LLViewerObject *parent; -		while ((parent = (LLViewerObject*)object->getParent())) +		LLSelectNode* node = *iter; +		if (func == NULL || func->apply(node))  		{ -			if (parent->isSelected()) -			{ -				object = parent; -			} -			else -			{ -				break; -			} +			return node;  		}  	} +	if (non_root_ok) +	{ +		// Get non root +		return getFirstNode(func); +	} +	return NULL; +} -	return object; + +//----------------------------------------------------------------------------- +// getFirstSelectedObject +//----------------------------------------------------------------------------- +LLViewerObject* LLObjectSelection::getFirstSelectedObject(LLSelectedNodeFunctor* func, BOOL get_parent) +{ +	LLSelectNode* res = getFirstNode(func); +	if (res && get_parent) +	{ +		return getSelectedParentObject(res->getObject()); +	} +	else if (res) +	{ +		return res->getObject(); +	} +	return NULL;  } +//----------------------------------------------------------------------------- +// getFirstObject() +//----------------------------------------------------------------------------- +LLViewerObject* LLObjectSelection::getFirstObject() +{ +	LLSelectNode* res = getFirstNode(NULL); +	return res ? res->getObject() : NULL; +}  //----------------------------------------------------------------------------- -// getFirstDeleteableObject() +// getFirstRootObject()  //----------------------------------------------------------------------------- -LLViewerObject* LLObjectSelection::getFirstDeleteableObject(BOOL get_root) +LLViewerObject* LLObjectSelection::getFirstRootObject(BOOL non_root_ok)  { -	//RN: don't currently support deletion of child objects, as that requires separating them first -	// then derezzing to trash -	get_root = TRUE; +	LLSelectNode* res = getFirstRootNode(NULL, non_root_ok); +	return res ? res->getObject() : NULL; +} -	LLViewerObject* object = NULL; -	if (get_root) +//----------------------------------------------------------------------------- +// getFirstMoveableNode() +//----------------------------------------------------------------------------- +LLSelectNode* LLObjectSelection::getFirstMoveableNode(BOOL get_root_first) +{ +	struct f : public LLSelectedNodeFunctor  	{ -		for(LLViewerObject* current = getFirstRootObject(); -			current != NULL; -			current = getNextRootObject()) +		bool apply(LLSelectNode* node)  		{ -			// you can delete an object if permissions allow it, you are -			// the owner, you are an officer in the group that owns the -			// object, or you are not the owner but it is on land you own -			// or land owned by your group. (whew!) -			if(   (current->permModify())  -			|| (current->permYouOwner()) -			|| (!current->permAnyOwner())			// public -			|| (current->isOverAgentOwnedLand()) -			|| (current->isOverGroupOwnedLand()) -			) -			{ +			LLViewerObject* obj = node->getObject(); +			return obj->permMove(); +		} +	} func; +	LLSelectNode* res = get_root_first ? getFirstRootNode(&func, TRUE) : getFirstNode(&func); +	return res; +} -				if( !current->isAttachment() ) -				{ -					object = current; -					break; -				} -			} -		}	 -	} -	else +//----------------------------------------------------------------------------- +// getFirstCopyableObject() +//----------------------------------------------------------------------------- +LLViewerObject* LLObjectSelection::getFirstCopyableObject(BOOL get_parent) +{ +	struct f : public LLSelectedNodeFunctor +	{ +		bool apply(LLSelectNode* node) +		{ +			LLViewerObject* obj = node->getObject(); +			return obj->permCopy() && !obj->isAttachment(); +		} +	} func; +	return getFirstSelectedObject(&func, get_parent); +} + +//----------------------------------------------------------------------------- +// getFirstDeleteableObject() +//----------------------------------------------------------------------------- +LLViewerObject* LLObjectSelection::getFirstDeleteableObject() +{ +	//RN: don't currently support deletion of child objects, as that requires separating them first +	// then derezzing to trash +	 +	struct f : public LLSelectedNodeFunctor  	{ -		// We've avoided this path for a while.  It may not work. -		llwarns << "!get_root code path may have bitrotted." << llendl; -		for(LLViewerObject* current = getFirstObject(); -			current != NULL; -			current = getNextObject()) +		bool apply(LLSelectNode* node)  		{ +			LLViewerObject* obj = node->getObject();  			// you can delete an object if permissions allow it, you are  			// the owner, you are an officer in the group that owns the  			// object, or you are not the owner but it is on land you own  			// or land owned by your group. (whew!) -			if(   (current->permModify())  -			|| (current->permYouOwner()) -			|| (!current->permAnyOwner())			// public -			|| (current->isOverAgentOwnedLand()) -			|| (current->isOverGroupOwnedLand()) -			) +			if(    (obj->permModify())  +				|| (obj->permYouOwner()) +				|| (!obj->permAnyOwner())			// public +				|| (obj->isOverAgentOwnedLand()) +				|| (obj->isOverGroupOwnedLand()) +				)  			{ -				if( !current->isAttachment() ) +				if( !obj->isAttachment() )  				{ -					object = current; -					break; +					return TRUE;  				}  			} -		}	 -	} - -	return object; +			return true; +		} +	} func; +	LLSelectNode* node = getFirstNode(&func); +	return node ? node->getObject() : NULL;  } -  //-----------------------------------------------------------------------------  // getFirstEditableObject()  //----------------------------------------------------------------------------- -LLViewerObject* LLObjectSelection::getFirstEditableObject(BOOL get_root) +LLViewerObject* LLObjectSelection::getFirstEditableObject(BOOL get_parent)  { -	LLViewerObject* object = NULL; -	for(LLViewerObject* cur = getFirstObject(); cur; cur = getNextObject()) +	struct f : public LLSelectedNodeFunctor  	{ -		if( cur->permModify() ) +		bool apply(LLSelectNode* node)  		{ -			object = cur; -			break; +			LLViewerObject* obj = node->getObject(); +			return obj->permModify();  		} -	}	 - -	if (get_root && object) -	{ -		LLViewerObject *parent; -		while ((parent = (LLViewerObject*)object->getParent())) -		{ -			if (parent->isSelected()) -			{ -				object = parent; -			} -			else -			{ -				break; -			} -		} -	} - -	return object; +	} func; +	return getFirstSelectedObject(&func, get_parent);  }  //-----------------------------------------------------------------------------  // getFirstMoveableObject()  //----------------------------------------------------------------------------- -LLViewerObject* LLObjectSelection::getFirstMoveableObject(BOOL get_root) +LLViewerObject* LLObjectSelection::getFirstMoveableObject(BOOL get_parent)  { -	LLViewerObject* object = NULL; -	for(LLViewerObject* cur = getFirstObject(); cur; cur = getNextObject()) -	{ -		if( cur->permMove() ) -		{ -			object = cur; -			break; -		} -	}	 - -	if (get_root && object && !object->isJointChild()) +	struct f : public LLSelectedNodeFunctor  	{ -		LLViewerObject *parent; -		while ((parent = (LLViewerObject*)object->getParent())) +		bool apply(LLSelectNode* node)  		{ -			if (parent->isSelected()) -			{ -				object = parent; -			} -			else -			{ -				break; -			} +			LLViewerObject* obj = node->getObject(); +			return obj->permMove();  		} -	} - -	return object; +	} func; +	return getFirstSelectedObject(&func, get_parent);  } diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h index ed59c19e45..69bf585005 100644 --- a/indra/newview/llselectmgr.h +++ b/indra/newview/llselectmgr.h @@ -33,7 +33,6 @@  #define LL_LLSELECTMGR_H  #include "llcharacter.h" -#include "lldarray.h"  #include "lleditmenuhandler.h"  #include "llstring.h"  #include "llundo.h" @@ -47,8 +46,10 @@  #include "llframetimer.h"  #include "llbbox.h"  #include "llpermissions.h" +#include "llviewerobject.h"  #include <deque> +#include "boost/iterator/filter_iterator.hpp"  class LLMessageSystem;  class LLViewerImage; @@ -61,27 +62,37 @@ const S32 SELECT_ALL_TES = -1;  const S32 SELECT_MAX_TES = 32;  // Do something to all objects in the selection manager. -// The bool return value can be used to indicate if all +// The BOOL return value can be used to indicate if all  // objects are identical (gathering information) or if  // the operation was successful. -class LLSelectedObjectFunctor +struct LLSelectedObjectFunctor  { -public:  	virtual ~LLSelectedObjectFunctor() {};  	virtual bool apply(LLViewerObject* object) = 0;  };  // Do something to all select nodes in the selection manager. -// The bool return value can be used to indicate if all +// The BOOL return value can be used to indicate if all  // objects are identical (gathering information) or if  // the operation was successful. -class LLSelectedNodeFunctor +struct LLSelectedNodeFunctor  { -public:  	virtual ~LLSelectedNodeFunctor() {};  	virtual bool apply(LLSelectNode* node) = 0;  }; +struct LLSelectedTEFunctor +{ +	virtual ~LLSelectedTEFunctor() {}; +	virtual bool apply(LLViewerObject* object, S32 face) = 0; +}; + +template <typename T> struct LLSelectedTEGetFunctor +{ +	virtual ~LLSelectedTEGetFunctor() {}; +	virtual T get(LLViewerObject* object, S32 te) = 0; +}; +  typedef enum e_send_type  {  	SEND_ONLY_ROOTS, @@ -114,53 +125,165 @@ typedef enum e_selection_type  	SELECT_TYPE_HUD  }ESelectType; -class LLObjectSelection : public std::list<LLSelectNode*>, public LLRefCount +// Contains information about a selected object, particularly which TEs are selected. +class LLSelectNode +{ +public: +	LLSelectNode(LLViewerObject* object, BOOL do_glow); +	LLSelectNode(const LLSelectNode& nodep); +	~LLSelectNode(); + +	void selectAllTEs(BOOL b); +	void selectTE(S32 te_index, BOOL selected); +	BOOL isTESelected(S32 te_index); +	S32 getLastSelectedTE(); +	void renderOneSilhouette(const LLColor4 &color); +	void setTransient(BOOL transient) { mTransient = transient; } +	BOOL isTransient() { return mTransient; } +	LLViewerObject* getObject(); +	void setObject(LLViewerObject* object); +	// *NOTE: invalidate stored textures and colors when # faces change +	void saveColors(); +	void saveTextures(const std::vector<LLUUID>& textures); +	void saveTextureScaleRatios(); + +	BOOL allowOperationOnNode(PermissionBit op, U64 group_proxy_power) const; + +public: +	BOOL			mIndividualSelection;		// For root objects and objects individually selected + +	BOOL			mTransient; +	BOOL			mValid;				// is extra information valid? +	LLPermissions*	mPermissions; +	LLSaleInfo		mSaleInfo; +	LLAggregatePermissions mAggregatePerm; +	LLAggregatePermissions mAggregateTexturePerm; +	LLAggregatePermissions mAggregateTexturePermOwner; +	LLString		mName; +	LLString		mDescription; +	LLCategory		mCategory; +	S16				mInventorySerial; +	LLVector3		mSavedPositionLocal;	// for interactively modifying object position +	LLVector3		mLastPositionLocal; +	LLVector3d		mSavedPositionGlobal;	// for interactively modifying object position +	LLVector3		mSavedScale;			// for interactively modifying object scale +	LLVector3		mLastScale; +	LLQuaternion	mSavedRotation;			// for interactively modifying object rotation +	LLQuaternion	mLastRotation; +	BOOL			mDuplicated; +	LLVector3d		mDuplicatePos; +	LLQuaternion	mDuplicateRot; +	LLUUID			mItemID; +	LLUUID			mFolderID; +	LLUUID			mFromTaskID; +	LLString		mTouchName; +	LLString		mSitName; +	U64				mCreationDate; +	std::vector<LLColor4>	mSavedColors; +	std::vector<LLUUID>		mSavedTextures; +	std::vector<LLVector3>  mTextureScaleRatios; +	std::vector<LLVector3>	mSilhouetteVertices;	// array of vertices to render silhouette of object +	std::vector<LLVector3>	mSilhouetteNormals;	// array of normals to render silhouette of object +	std::vector<S32>		mSilhouetteSegments;	// array of normals to render silhouette of object +	BOOL					mSilhouetteExists;	// need to generate silhouette? + +protected: +	LLPointer<LLViewerObject>	mObject; +	BOOL			mTESelected[SELECT_MAX_TES]; +	S32				mLastTESelected; +}; + +class LLObjectSelection : public LLRefCount  {  	friend class LLSelectMgr;  protected:  	~LLObjectSelection(); +	// List +public: +	typedef std::list<LLSelectNode*> list_t; +private: +	list_t mList; + +public: +	// Iterators +	struct is_non_null +	{ +		bool operator()(LLSelectNode* node) +		{ +			return (node->getObject() != NULL); +		} +	}; +	typedef boost::filter_iterator<is_non_null, list_t::iterator > iterator; +	iterator begin() { return iterator(mList.begin(), mList.end()); } +	iterator end() { return iterator(mList.end(), mList.end()); } + +	struct is_valid +	{ +		bool operator()(LLSelectNode* node) +		{ +			return (node->getObject() != NULL) && node->mValid; +		} +	}; +	typedef boost::filter_iterator<is_valid, list_t::iterator > valid_iterator; +	valid_iterator valid_begin() { return valid_iterator(mList.begin(), mList.end()); } +	valid_iterator valid_end() { return valid_iterator(mList.end(), mList.end()); } + +	struct is_root +	{ +		bool operator()(LLSelectNode* node) +		{ +			LLViewerObject* object = node->getObject(); +			return (object != NULL) && !node->mIndividualSelection && (object->isRootEdit() || object->isJointChild()); +		} +	}; +	typedef boost::filter_iterator<is_root, list_t::iterator > root_iterator; +	root_iterator root_begin() { return root_iterator(mList.begin(), mList.end()); } +	root_iterator root_end() { return root_iterator(mList.end(), mList.end()); } +	 +	struct is_valid_root +	{ +		bool operator()(LLSelectNode* node) +		{ +			LLViewerObject* object = node->getObject(); +			return (object != NULL) && node->mValid && !node->mIndividualSelection && (object->isRootEdit() || object->isJointChild()); +		} +	}; +	typedef boost::filter_iterator<is_root, list_t::iterator > valid_root_iterator; +	valid_root_iterator valid_root_begin() { return valid_root_iterator(mList.begin(), mList.end()); } +	valid_root_iterator valid_root_end() { return valid_root_iterator(mList.end(), mList.end()); } +	  public:  	LLObjectSelection();  	void updateEffects(); +	void cleanupNodes();  	BOOL isEmpty();  	S32 getOwnershipCost(S32 &cost); -	LLSelectNode* getFirstNode(); -	LLSelectNode* getCurrentNode(); // Warning!  This is NOT the same as the linked_list getCurrentNode -	LLSelectNode* getNextNode(); - -	LLSelectNode *getFirstRootNode(); -	LLSelectNode *getNextRootNode(); - -	LLSelectNode*	getFirstMoveableNode(BOOL get_root = FALSE); - -	// iterate through objects -	LLViewerObject* getFirstObject(); -	LLViewerObject* getNextObject(); - -	// iterate through root objects -	LLViewerObject *getFirstRootObject(); -	LLViewerObject *getNextRootObject(); +	LLSelectNode*	getFirstNode(LLSelectedNodeFunctor* func = NULL); +	LLSelectNode*	getFirstRootNode(LLSelectedNodeFunctor* func = NULL, BOOL non_root_ok = FALSE); +	LLViewerObject* getFirstSelectedObject(LLSelectedNodeFunctor* func, BOOL get_parent = FALSE); +	LLViewerObject*	getFirstObject(); +	LLViewerObject*	getFirstRootObject(BOOL non_root_ok = FALSE); +	 +	LLSelectNode*	getFirstMoveableNode(BOOL get_root_first = FALSE); -	LLViewerObject*	getFirstEditableObject(BOOL get_root = FALSE); -	LLViewerObject*	getFirstCopyableObject(BOOL get_root = FALSE); -	LLViewerObject* getFirstDeleteableObject(BOOL get_root = FALSE); -	LLViewerObject*	getFirstMoveableObject(BOOL get_root = FALSE); +	LLViewerObject*	getFirstEditableObject(BOOL get_parent = FALSE); +	LLViewerObject*	getFirstCopyableObject(BOOL get_parent = FALSE); +	LLViewerObject* getFirstDeleteableObject(); +	LLViewerObject*	getFirstMoveableObject(BOOL get_parent = FALSE);  	LLViewerObject* getPrimaryObject() { return mPrimaryObject; }  	// iterate through texture entries -	void getPrimaryTE(LLViewerObject* *object, S32 *te); -	void getFirstTE(LLViewerObject* *object, S32 *te); -	void getNextTE(LLViewerObject* *object, S32 *te); -	void getCurrentTE(LLViewerObject* *object, S32 *te); - +	template <typename T> bool getSelectedTEValue(LLSelectedTEGetFunctor<T>* func, T& res); +		  	void addNode(LLSelectNode *nodep);  	void addNodeAtEnd(LLSelectNode *nodep); +	void moveNodeToFront(LLSelectNode *nodep);  	void removeNode(LLSelectNode *nodep);  	void deleteAllNodes();			// Delete all nodes  	S32 getNumNodes(); @@ -178,21 +301,22 @@ public:  	BOOL isAttachment();  	// Apply functors to various subsets of the selected objects -	// Returns the AND of all apply() calls. -	bool applyToRootObjects(LLSelectedObjectFunctor* func); -	bool applyToObjects(LLSelectedObjectFunctor* func); -	bool applyToNodes(LLSelectedNodeFunctor* func); +	// If firstonly is FALSE, returns the AND of all apply() calls. +	// Else returns TRUE immediately if any apply() call succeeds (i.e. OR with early exit) +	bool applyToRootObjects(LLSelectedObjectFunctor* func, bool firstonly = false); +	bool applyToObjects(LLSelectedObjectFunctor* func, bool firstonly = false); +	bool applyToTEs(LLSelectedTEFunctor* func, bool firstonly = false); +	bool applyToRootNodes(LLSelectedNodeFunctor* func, bool firstonly = false); +	bool applyToNodes(LLSelectedNodeFunctor* func, bool firstonly = false);  	ESelectType getSelectType() { return mSelectType; }  private:  	const LLObjectSelection &operator=(const LLObjectSelection &); -	LLPointer<LLViewerObject>					mPrimaryObject; -	std::list<LLSelectNode*>::iterator			mCurrentNode; -	S32											mCurrentTE; -	std::map<LLPointer<LLViewerObject>, LLSelectNode*>	mSelectNodeMap; -	ESelectType									mSelectType; +	LLPointer<LLViewerObject> mPrimaryObject; +	std::map<LLPointer<LLViewerObject>, LLSelectNode*> mSelectNodeMap; +	ESelectType mSelectType;  };  typedef LLHandle<LLObjectSelection> LLObjectSelectionHandle; @@ -239,6 +363,8 @@ public:  	virtual void duplicate();  	virtual BOOL canDuplicate(); +	void clearSelections(); +	void update();  	void updateEffects(); // Update HUD effects  	void overrideObjectUpdates(); @@ -261,7 +387,7 @@ public:  	LLObjectSelectionHandle selectObjectAndFamily(LLViewerObject* object, BOOL add_to_end = FALSE);  	// Same as above, but takes a list of objects.  Used by rectangle select. -	LLObjectSelectionHandle selectObjectAndFamily(const LLDynamicArray<LLViewerObject*>& object_list, BOOL send_to_sim = TRUE); +	LLObjectSelectionHandle selectObjectAndFamily(const std::vector<LLViewerObject*>& object_list, BOOL send_to_sim = TRUE);  	// converts all objects currently highlighted to a selection, and returns it  	LLObjectSelectionHandle selectHighlightedObjects(); @@ -270,7 +396,7 @@ public:  	void highlightObjectOnly(LLViewerObject *objectp);  	void highlightObjectAndFamily(LLViewerObject *objectp); -	void highlightObjectAndFamily(const LLDynamicArray<LLViewerObject*>& list); +	void highlightObjectAndFamily(const std::vector<LLViewerObject*>& list);  	////////////////////////////////////////////////////////////////  	// Remove @@ -317,7 +443,7 @@ public:  	EGridMode		getGridMode() { return mGridMode; }  	void			getGrid(LLVector3& origin, LLQuaternion& rotation, LLVector3 &scale); -	BOOL getTEMode()			{ return mTEMode; } +	BOOL getTEMode()		{ return mTEMode; }  	void setTEMode(BOOL b)	{ mTEMode = b; }  	BOOL shouldShowSelection()	{ return mShowSelection; } @@ -346,17 +472,7 @@ public:  	void selectionDump();  	BOOL selectionAllPCode(LLPCode code);		// all objects have this PCode -	BOOL selectionGetMaterial(U8 *material);	// all objects have same material -	BOOL selectionGetTexUUID(LLUUID& id);		// true if all selected tes have same texture -	BOOL selectionGetColor(LLColor4 &color);	// all tes have same color -	BOOL selectionGetTexScale(F32 *u, F32 *v);	// true if all selected tes have same scale -	BOOL selectionGetTexOffset(F32 *u, F32 *v);	// true if all selected tes have same offset -	BOOL selectionGetTexRotation(F32 *rad);		// true if all selected tes have same rotation -	BOOL selectionGetBumpmap(U8 *bumpmap);			// true if all selected tes have same -	BOOL selectionGetShiny(U8 *shiny);			// true if all selected tes have same -	BOOL selectionGetFullbright(U8 *fullbright);// true if all selected tes have same -	bool selectionGetMediaType(U8 *media_type);	// true if all selected tes have same -	BOOL selectionGetClickAction(U8* action); +	BOOL selectionGetClickAction(U8 *out_action);  	bool selectionGetIncludeInSearch(bool* include_in_search_out); // true if all selected objects have same  	void selectionSetMaterial(U8 material); @@ -381,9 +497,7 @@ public:  	void selectionSetObjectSaleInfo(const LLSaleInfo& sale_info);  	void selectionTexScaleAutofit(F32 repeats_per_meter); -	void selectionResetTexInfo(S32 te);						// sets S,T to 1  	void adjustTexturesByScale(BOOL send_to_sim, BOOL stretch); -	BOOL getTESTAxes(const LLViewerObject* object, const U8 te, U32* s_axis, U32* t_axis);	// Only for flex boxes  	void selectionResetRotation();				// sets rotation quat to identity  	void selectionRotateAroundZ(F32 degrees); @@ -396,7 +510,7 @@ public:  	// returns TRUE if it is possible to select this object  	BOOL canSelectObject(LLViewerObject* object); -	// Returns true if the viewer has information on all selected objects +	// Returns TRUE if the viewer has information on all selected objects  	BOOL selectGetAllRootsValid();  	BOOL selectGetAllValid(); @@ -410,17 +524,17 @@ public:  	// returns TRUE if selected objects can be copied.  	BOOL selectGetRootsCopy(); -	BOOL selectGetCreator(LLUUID& id, LLString& name);					// true if all have same creator, returns id -	BOOL selectGetOwner(LLUUID& id, LLString& name);					// true if all objects have same owner, returns id -	BOOL selectGetLastOwner(LLUUID& id, LLString& name);				// true if all objects have same owner, returns id +	BOOL selectGetCreator(LLUUID& id, LLString& name);					// TRUE if all have same creator, returns id +	BOOL selectGetOwner(LLUUID& id, LLString& name);					// TRUE if all objects have same owner, returns id +	BOOL selectGetLastOwner(LLUUID& id, LLString& name);				// TRUE if all objects have same owner, returns id  	// returns TRUE if all are the same. id is stuffed with  	// the value found if available.  	BOOL selectGetGroup(LLUUID& id);  -	BOOL selectGetPerm(	U8 which_perm, U32* mask_on, U32* mask_off);	// true if all have data, returns two masks, each indicating which bits are all on and all off +	BOOL selectGetPerm(	U8 which_perm, U32* mask_on, U32* mask_off);	// TRUE if all have data, returns two masks, each indicating which bits are all on and all off  	BOOL selectGetOwnershipCost(S32* cost);								// sum of all ownership costs -	BOOL selectIsGroupOwned();											// true if all root objects have valid data and are group owned. +	BOOL selectIsGroupOwned();											// TRUE if all root objects have valid data and are group owned.  	// returns TRUE if all the nodes are valid. Accumulates  	// permissions in the parameter. @@ -491,7 +605,7 @@ public:  	void			updatePointAt();  	// Internal list maintenance functions. TODO: Make these private! -	void remove(LLDynamicArray<LLViewerObject*>& objects); +	void remove(std::vector<LLViewerObject*>& objects);  	void remove(LLViewerObject* object, S32 te = SELECT_ALL_TES, BOOL undoable = TRUE);  	void removeAll();  	void addAsIndividual(LLViewerObject* object, S32 te = SELECT_ALL_TES, BOOL undoable = TRUE); @@ -501,7 +615,7 @@ public:  private:  	void convertTransient(); // converts temporarily selected objects to full-fledged selections  	ESelectType getSelectTypeForObject(LLViewerObject* object); -	void addAsFamily(LLDynamicArray<LLViewerObject*>& objects, BOOL add_to_end = FALSE); +	void addAsFamily(std::vector<LLViewerObject*>& objects, BOOL add_to_end = FALSE);  	void generateSilhouette(LLSelectNode *nodep, const LLVector3& view_point);  	// Send one message to each region containing an object on selection list.  	void sendListToRegions(	const LLString& message_name, @@ -574,78 +688,71 @@ private:  	LLAnimPauseRequest		mPauseRequest;  }; - -// Contains information about a selected object, particularly which -// tes are selected. -class LLSelectNode -{ -public: -	LLSelectNode(LLViewerObject* object, BOOL do_glow); -	LLSelectNode(const LLSelectNode& nodep); -	~LLSelectNode(); - -	void selectAllTEs(BOOL b); -	void selectTE(S32 te_index, BOOL selected); -	BOOL isTESelected(S32 te_index); -	S32 getLastSelectedTE(); -	void renderOneSilhouette(const LLColor4 &color); -	void setTransient(BOOL transient) { mTransient = transient; } -	BOOL isTransient() { return mTransient; } -	LLViewerObject *getObject(); -	// *NOTE: invalidate stored textures and colors when # faces change -	void saveColors(); -	void saveTextures(const std::vector<LLUUID>& textures); -	void saveTextureScaleRatios(); - -	BOOL allowOperationOnNode(PermissionBit op, U64 group_proxy_power) const; - -public: -	BOOL			mIndividualSelection;		// For root objects and objects individually selected - -	BOOL			mTransient; -	BOOL			mValid;				// is extra information valid? -	LLPermissions*	mPermissions; -	LLSaleInfo		mSaleInfo; -	LLAggregatePermissions mAggregatePerm; -	LLAggregatePermissions mAggregateTexturePerm; -	LLAggregatePermissions mAggregateTexturePermOwner; -	LLString		mName; -	LLString		mDescription; -	LLCategory		mCategory; -	S16				mInventorySerial; -	LLVector3		mSavedPositionLocal;	// for interactively modifying object position -	LLVector3		mLastPositionLocal; -	LLVector3d		mSavedPositionGlobal;	// for interactively modifying object position -	LLVector3		mSavedScale;			// for interactively modifying object scale -	LLVector3		mLastScale; -	LLQuaternion	mSavedRotation;			// for interactively modifying object rotation -	LLQuaternion	mLastRotation; -	BOOL			mDuplicated; -	LLVector3d		mDuplicatePos; -	LLQuaternion	mDuplicateRot; -	LLUUID			mItemID; -	LLUUID			mFolderID; -	LLUUID			mFromTaskID; -	LLString		mTouchName; -	LLString		mSitName; -	U64				mCreationDate; -	std::vector<LLColor4>	mSavedColors; -	std::vector<LLUUID>		mSavedTextures; -	std::vector<LLVector3>  mTextureScaleRatios; -	std::vector<LLVector3>	mSilhouetteVertices;	// array of vertices to render silhouette of object -	std::vector<LLVector3>	mSilhouetteNormals;	// array of normals to render silhouette of object -	std::vector<S32>		mSilhouetteSegments;	// array of normals to render silhouette of object -	BOOL					mSilhouetteExists;	// need to generate silhouette? - -protected: -	LLPointer<LLViewerObject>	mObject; -	BOOL			mTESelected[SELECT_MAX_TES]; -	S32				mLastTESelected; -}; -  extern LLSelectMgr* gSelectMgr;  // Utilities  void dialog_refresh_all();		// Update subscribers to the selection list +// Templates +//----------------------------------------------------------------------------- +// getSelectedTEValue +//----------------------------------------------------------------------------- +template <typename T> bool LLObjectSelection::getSelectedTEValue(LLSelectedTEGetFunctor<T>* func, T& res) +{ +	bool have_first = false; +	bool have_selected = false; +	T selected_value = T(); + +	// Now iterate through all TEs to test for sameness +	bool identical = TRUE; +	for (iterator iter = begin(); iter != end(); iter++) +	{ +		LLSelectNode* node = *iter; +		LLViewerObject* object = node->getObject(); +		S32 selected_te = -1; +		if (object == getPrimaryObject()) +		{ +			selected_te = node->getLastSelectedTE(); +		} +		for (S32 te = 0; te < object->getNumTEs(); ++te) +		{ +			if (!node->isTESelected(te)) +			{ +				continue; +			} +			T value = func->get(object, te); +			if (!have_first) +			{ +				have_first = true; +				if (!have_selected) +				{ +					selected_value = value; +				} +			} +			else +			{ +				if ( value != selected_value ) +				{ +					identical = false; +				} +				if (te == selected_te) +				{ +					selected_value = value; +					have_selected = true; +				} +			} +		} +		if (!identical && have_selected) +		{ +			break; +		} +	} +	if (have_first || have_selected) +	{ +		res = selected_value; +	} +	return identical; +} + +  #endif diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index fc4754b0ae..4ade8c57ff 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -409,7 +409,7 @@ BOOL idle_startup()  		}  		if (!xml_ok)  		{ -			// XUI:translate (maybe - very unlikely error message) +			// *TODO:translate (maybe - very unlikely error message)  			// Note: alerts.xml may be invalid - if this gets translated it will need to be in the code  			LLString bad_xui_msg = "An error occured while updating Second Life. Please download the latest version from www.secondlife.com.";  			app_early_exit(bad_xui_msg); @@ -537,7 +537,7 @@ BOOL idle_startup()  		// LibXUL (Mozilla) initialization  		//---------------------------------------------------------------------  		#if LL_LIBXUL_ENABLED -		set_startup_status(0.48f, "Initializing embedded web browser...", gAgent.mMOTD.c_str()); +		set_startup_status(0.58f, "Initializing embedded web browser...", gAgent.mMOTD.c_str());  		display_startup();  		llinfos << "Initializing embedded web browser..." << llendl; @@ -1649,12 +1649,17 @@ BOOL idle_startup()  			gSky.init(initial_sun_direction);  		} -		set_startup_status(0.45f, "Decoding UI images...", gAgent.mMOTD.c_str()); -		display_startup();  		llinfos << "Decoding images..." << llendl;  		// For all images pre-loaded into viewer cache, decode them.  		// Need to do this AFTER we init the sky -		gImageList.decodeAllImages(2.f); +		const S32 DECODE_TIME_SEC = 2; +		for (int i = 0; i < DECODE_TIME_SEC; i++) +		{ +			F32 frac = (F32)i / (F32)DECODE_TIME_SEC; +			set_startup_status(0.45f + frac*0.1f, "Decoding images...", gAgent.mMOTD.c_str()); +			display_startup(); +			gImageList.decodeAllImages(1.f); +		}  		LLStartUp::setStartupState( STATE_QUICKTIME_INIT );  		// JC - Do this as late as possible to increase likelihood Purify @@ -1704,7 +1709,7 @@ BOOL idle_startup()  		{  			// initialize quicktime libraries (fails gracefully if quicktime not installed ($QUICKTIME)  			llinfos << "Initializing QuickTime...." << llendl; -			set_startup_status(0.47f, "Initializing QuickTime...", gAgent.mMOTD.c_str()); +			set_startup_status(0.57f, "Initializing QuickTime...", gAgent.mMOTD.c_str());  			display_startup();  			#if LL_WINDOWS  				// Only necessary/available on Windows. @@ -1713,12 +1718,12 @@ BOOL idle_startup()  					// quicktime init failed - turn off media engine support  					LLMediaEngine::getInstance ()->setAvailable ( FALSE );  					llinfos << "...not found - unable to initialize." << llendl; -					set_startup_status(0.47f, "QuickTime not found - unable to initialize.", gAgent.mMOTD.c_str()); +					set_startup_status(0.57f, "QuickTime not found - unable to initialize.", gAgent.mMOTD.c_str());  				}  				else  				{  					llinfos << ".. initialized successfully." << llendl; -					set_startup_status(0.47f, "QuickTime initialized successfully.", gAgent.mMOTD.c_str()); +					set_startup_status(0.57f, "QuickTime initialized successfully.", gAgent.mMOTD.c_str());  				};  			#endif  			EnterMovies (); @@ -1736,7 +1741,7 @@ BOOL idle_startup()  	if(STATE_WORLD_WAIT == LLStartUp::getStartupState())  	{  		//llinfos << "Waiting for simulator ack...." << llendl; -		set_startup_status(0.49f, "Waiting for region handshake...", gAgent.mMOTD.c_str()); +		set_startup_status(0.59f, "Waiting for region handshake...", gAgent.mMOTD.c_str());  		if(gGotUseCircuitCodeAck)  		{  			LLStartUp::setStartupState( STATE_AGENT_SEND ); @@ -1755,7 +1760,7 @@ BOOL idle_startup()  	if (STATE_AGENT_SEND == LLStartUp::getStartupState())  	{  		llinfos << "Connecting to region..." << llendl; -		set_startup_status(0.50f, "Connecting to region...", gAgent.mMOTD.c_str()); +		set_startup_status(0.60f, "Connecting to region...", gAgent.mMOTD.c_str());  		// register with the message system so it knows we're  		// expecting this message  		LLMessageSystem* msg = gMessageSystem; @@ -2118,6 +2123,7 @@ BOOL idle_startup()  		gInitializationComplete = TRUE;  		gRenderStartTime.reset(); +		gForegroundTime.reset();  		// HACK: Inform simulator of window size.  		// Do this here so it's less likely to race with RegisterNewAgent. @@ -2198,7 +2204,7 @@ BOOL idle_startup()  		else  		{  			update_texture_fetch(); -			set_startup_status(0.50f + 0.50f * timeout_frac, "Precaching...", +			set_startup_status(0.60f + 0.40f * timeout_frac, "Precaching...",  							   gAgent.mMOTD.c_str());  		} @@ -2325,11 +2331,8 @@ void login_show()  						bUseDebugLogin,  						login_callback, NULL ); -	llinfos << "Decoding Images" << llendl; +	// UI textures have been previously loaded in doPreloadImages() -	// Make sure all the UI textures are present and decoded. -	gImageList.decodeAllImages(2.f); -  	llinfos << "Setting Servers" << llendl;  	if( USERSERVER_OTHER == gUserServerChoice ) @@ -2567,7 +2570,7 @@ void update_app(BOOL mandatory, const std::string& auth_msg)  	std::ostringstream message; -	//XUI:translate +	//*TODO:translate  	std::string msg;  	if (!auth_msg.empty())  	{ @@ -2909,11 +2912,11 @@ void register_viewer_callbacks(LLMessageSystem* msg)  	msg->setHandlerFuncFast(_PREHASH_GrantGodlikePowers, process_grant_godlike_powers);  	msg->setHandlerFuncFast(_PREHASH_GroupAccountSummaryReply, -							LLGroupMoneyPlanningTabEventHandler::processGroupAccountSummaryReply); +							LLPanelGroupLandMoney::processGroupAccountSummaryReply);  	msg->setHandlerFuncFast(_PREHASH_GroupAccountDetailsReply, -							LLGroupMoneyDetailsTabEventHandler::processGroupAccountDetailsReply); +							LLPanelGroupLandMoney::processGroupAccountDetailsReply);  	msg->setHandlerFuncFast(_PREHASH_GroupAccountTransactionsReply, -							LLGroupMoneySalesTabEventHandler::processGroupAccountTransactionsReply); +							LLPanelGroupLandMoney::processGroupAccountTransactionsReply);  	msg->setHandlerFuncFast(_PREHASH_UserInfoReply,  		process_user_info_reply); @@ -3598,7 +3601,6 @@ void callback_choose_gender(S32 option, void* userdata)  	gAgent.setGenderChosen(TRUE);  } -// XUI:translate  void dialog_choose_gender_first_start()  {  	if (!gNoRender diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp index 9b7d31acb4..9bbb25fd2b 100644 --- a/indra/newview/llstatusbar.cpp +++ b/indra/newview/llstatusbar.cpp @@ -252,6 +252,8 @@ void LLStatusBar::refresh()  	mSGBandwidth->setThreshold(1, bwtotal);  	mSGBandwidth->setThreshold(2, bwtotal); +	// *TODO: Localize / translate time +	  	// Get current UTC time, adjusted for the user's clock  	// being off.  	U32 utc_time; @@ -285,7 +287,7 @@ void LLStatusBar::refresh()  	t << std::setfill(' ') << std::setw(2) << hour << ":"   	  << std::setfill('0') << std::setw(2) << min   	  << " " << am_pm << " " << tz; -	mTextTime->setText(t.str().c_str()); +	mTextTime->setText(t.str());  	// Year starts at 1900, set the tooltip to have the date  	std::ostringstream date; @@ -462,13 +464,13 @@ void LLStatusBar::refresh()  			pos_y -= pos_y % 2;  		} -		if (parcel && parcel->getName()) +		if (parcel && !parcel->getName().empty())  		{  			location_name = region->getName()  				+ llformat(" %d, %d, %d (%s) - %s",   						   pos_x, pos_y, pos_z,  						   region->getSimAccessString(), -						   parcel->getName()); +						   parcel->getName().c_str());  		}  		else  		{ @@ -537,10 +539,8 @@ void LLStatusBar::setBalance(S32 balance)  void LLStatusBar::setHealth(S32 health)  { -	char buffer[MAX_STRING];		/* Flawfinder: ignore */ -	snprintf(buffer, MAX_STRING, "%d%%", health);		/* Flawfinder: ignore */  	//llinfos << "Setting health to: " << buffer << llendl; -	mTextHealth->setText(buffer); +	mTextHealth->setText(llformat("%d%%", health));  	if( mHealth > health )  	{ diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index 2d013e04fb..b961053799 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -344,13 +344,12 @@ void LLFloaterTexturePicker::updateImageStats()  		//RN: have we received header data for this image?  		if (mTexturep->getWidth(0) > 0 && mTexturep->getHeight(0) > 0)  		{ -			std::ostringstream formatted_dims; -			formatted_dims << llformat("Dimensions: %d x %d", mTexturep->getWidth(0),mTexturep->getHeight(0)); -			mResolutionLabel->setText(formatted_dims.str()); +			LLString formatted_dims = llformat("%d x %d", mTexturep->getWidth(0),mTexturep->getHeight(0)); +			mResolutionLabel->setTextArg("[DIMENSIONS]", formatted_dims);  		}  		else  		{ -			mResolutionLabel->setText("Dimensions: unknown"); +			mResolutionLabel->setTextArg("[DIMENSIONS]", LLString("[? x ?]"));  		}  		if (gAgent.isGodlike())  		{ @@ -1454,3 +1453,4 @@ BOOL LLToolTexEyedropper::handleHover(S32 x, S32 y, MASK mask)  	return TRUE;  } + diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp index 06c014a7e7..4df5444d66 100644 --- a/indra/newview/lltextureview.cpp +++ b/indra/newview/lltextureview.cpp @@ -641,16 +641,20 @@ void LLTextureView::draw()  #if 1  			if (pri < HIGH_PRIORITY && gSelectMgr)  			{ -				S32 te; -				LLViewerObject *objectp; -				LLObjectSelectionHandle selection = gSelectMgr->getSelection(); -				for (selection->getFirstTE(&objectp, &te); objectp; selection->getNextTE(&objectp, &te)) +				struct f : public LLSelectedTEFunctor  				{ -					if (imagep == objectp->getTEImage(te)) +					LLViewerImage* mImage; +					f(LLViewerImage* image) : mImage(image) {} +					virtual bool apply(LLViewerObject* object, S32 te)  					{ -						pri += 3*HIGH_PRIORITY; -						break; +						return (mImage == object->getTEImage(te));  					} +				} func(imagep); +				const bool firstonly = true; +				bool match = gSelectMgr->getSelection()->applyToTEs(&func, firstonly); +				if (match) +				{ +					pri += 3*HIGH_PRIORITY;  				}  			}  #endif diff --git a/indra/newview/lltoolbrush.cpp b/indra/newview/lltoolbrush.cpp index f7b1405074..a56bf42cee 100644 --- a/indra/newview/lltoolbrush.cpp +++ b/indra/newview/lltoolbrush.cpp @@ -416,7 +416,7 @@ void LLToolBrushLand::handleSelect()  {  	gEditMenuHandler = this; -	gFloaterTools->setStatusText("Click and hold to modify land"); +	gFloaterTools->setStatusText("modifyland");  //	if (!mBrushSelected)  	{  		mLastShowParcelOwners = gSavedSettings.getBOOL("ShowParcelOwners"); @@ -432,7 +432,6 @@ void LLToolBrushLand::handleDeselect()  	{  		gEditMenuHandler = NULL;  	} -	gFloaterTools->setStatusText("");  	mLastShowParcelOwners = gSavedSettings.getBOOL("ShowParcelOwners");  	gSavedSettings.setBOOL("ShowParcelOwners", mLastShowParcelOwners);  	gParcelMgr->setSelectionVisible(TRUE); diff --git a/indra/newview/lltoolcomp.cpp b/indra/newview/lltoolcomp.cpp index 65182d366e..182ea5602e 100644 --- a/indra/newview/lltoolcomp.cpp +++ b/indra/newview/lltoolcomp.cpp @@ -250,11 +250,7 @@ void LLToolCompTranslate::pickCallback(S32 x, S32 y, MASK mask)  			gEditMenuHandler = gSelectMgr;  		} -		BOOL can_move = gToolTranslate->mManip->getSelection()->getObjectCount() != 0; -		for (LLViewerObject* objectp = gToolTranslate->mManip->getSelection()->getFirstObject(); objectp; objectp = gToolTranslate->mManip->getSelection()->getNextObject()) -		{ -			can_move = can_move && objectp->permMove() && (objectp->permModify() || !gSavedSettings.getBOOL("EditLinkedParts")); -		} +		BOOL can_move = gToolTranslate->mManip->canAffectSelection();  		if(	LLManip::LL_NO_PART != gToolTranslate->mManip->getHighlightedPart() && can_move)  		{ diff --git a/indra/newview/lltoolfocus.cpp b/indra/newview/lltoolfocus.cpp index c4a8ac307f..2ac2b33945 100644 --- a/indra/newview/lltoolfocus.cpp +++ b/indra/newview/lltoolfocus.cpp @@ -94,17 +94,13 @@ void LLToolCamera::handleSelect()  {  	if (gFloaterTools)  	{ -		gFloaterTools->setStatusText("Click and drag to change view"); +		gFloaterTools->setStatusText("camera");  	}  }  // virtual  void LLToolCamera::handleDeselect()  { -	if (gFloaterTools) -	{ -		gFloaterTools->setStatusText(""); -	}  //	gAgent.setLookingAtAvatar(FALSE);  } diff --git a/indra/newview/lltoolgrab.cpp b/indra/newview/lltoolgrab.cpp index e416e25777..13977ee3ac 100644 --- a/indra/newview/lltoolgrab.cpp +++ b/indra/newview/lltoolgrab.cpp @@ -101,7 +101,7 @@ void LLToolGrab::handleSelect()  	if(gFloaterTools)  	{  		// viewer can crash during startup if we don't check. -		gFloaterTools->setStatusText("Drag to move objects, Ctrl to lift, Ctrl-Shift to spin"); +		gFloaterTools->setStatusText("grab");  	}  	gGrabBtnVertical = FALSE;  	gGrabBtnSpin = FALSE; @@ -114,7 +114,6 @@ void LLToolGrab::handleDeselect()  		setMouseCapture( FALSE );  	} -	gFloaterTools->setStatusText("");  }  BOOL LLToolGrab::handleDoubleClick(S32 x, S32 y, MASK mask) diff --git a/indra/newview/lltoolindividual.cpp b/indra/newview/lltoolindividual.cpp index 24bac8a7fe..3ec6b7d4d3 100644 --- a/indra/newview/lltoolindividual.cpp +++ b/indra/newview/lltoolindividual.cpp @@ -108,11 +108,8 @@ BOOL LLToolIndividual::handleDoubleClick(S32 x, S32 y, MASK mask)  void LLToolIndividual::handleSelect()  { -	LLViewerObject* obj = gSelectMgr->getSelection()->getFirstRootObject(); -	if(!obj) -	{ -		obj = gSelectMgr->getSelection()->getFirstObject(); -	} +	const BOOL children_ok = TRUE; +	LLViewerObject* obj = gSelectMgr->getSelection()->getFirstRootObject(children_ok);  	gSelectMgr->deselectAll();  	if(obj)  	{ diff --git a/indra/newview/lltoolmgr.cpp b/indra/newview/lltoolmgr.cpp index 7391a53036..ae74eba026 100644 --- a/indra/newview/lltoolmgr.cpp +++ b/indra/newview/lltoolmgr.cpp @@ -338,18 +338,21 @@ LLTool* LLToolMgr::getCurrentTool()  		cur_tool = mOverrideTool ? mOverrideTool : mBaseTool;  	} +	LLTool* prev_tool = mSelectedTool; +	// Set the selected tool to avoid infinite recursion +	mSelectedTool = cur_tool; +	  	//update tool selection status -	if (mSelectedTool != cur_tool) +	if (prev_tool != cur_tool)  	{ -		if (mSelectedTool) +		if (prev_tool)  		{ -			mSelectedTool->handleDeselect(); +			prev_tool->handleDeselect();  		}  		if (cur_tool)  		{  			cur_tool->handleSelect();  		} -		mSelectedTool = cur_tool;  	}  	return mSelectedTool; diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index cdf2b25a39..55692d1962 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -310,12 +310,12 @@ BOOL LLToolPie::pickAndShowMenu(S32 x, S32 y, MASK mask, BOOL always_show)  			LLString name = avatar->getFullname();  			if (gMuteListp->isMuted(avatar->getID(), name))  			{ -				gMenuHolder->childSetText("Avatar Mute", "Unmute"); +				gMenuHolder->childSetText("Avatar Mute", LLString("Unmute")); // *TODO:Translate  				//gMutePieMenu->setLabel("Unmute");  			}  			else  			{ -				gMenuHolder->childSetText("Avatar Mute", "Mute"); +				gMenuHolder->childSetText("Avatar Mute", LLString("Mute")); // *TODO:Translate  				//gMutePieMenu->setLabel("Mute");  			} @@ -336,12 +336,12 @@ BOOL LLToolPie::pickAndShowMenu(S32 x, S32 y, MASK mask, BOOL always_show)  			}  			if (gMuteListp->isMuted(object->getID(), name))  			{ -				gMenuHolder->childSetText("Object Mute", "Unmute"); +				gMenuHolder->childSetText("Object Mute", LLString("Unmute")); // *TODO:Translate  				//gMuteObjectPieMenu->setLabel("Unmute");  			}  			else  			{ -				gMenuHolder->childSetText("Object Mute", "Mute"); +				gMenuHolder->childSetText("Object Mute", LLString("Mute")); // *TODO:Translate  				//gMuteObjectPieMenu->setLabel("Mute");  			} @@ -675,3 +675,4 @@ void LLToolPie::render()  	return;  } + diff --git a/indra/newview/lltoolplacer.cpp b/indra/newview/lltoolplacer.cpp index f99bb3da22..ee5d08f128 100644 --- a/indra/newview/lltoolplacer.cpp +++ b/indra/newview/lltoolplacer.cpp @@ -148,12 +148,11 @@ BOOL LLToolPlacer::handleHover(S32 x, S32 y, MASK mask)  void LLToolPlacer::handleSelect()  { -	gFloaterTools->setStatusText("Click in the world to create, shift-click to select"); +	gFloaterTools->setStatusText("place");  }  void LLToolPlacer::handleDeselect()  { -	gFloaterTools->setStatusText("");  }  ////////////////////////////////////////////////////// diff --git a/indra/newview/lltoolselectland.cpp b/indra/newview/lltoolselectland.cpp index f54caff738..dae8288810 100644 --- a/indra/newview/lltoolselectland.cpp +++ b/indra/newview/lltoolselectland.cpp @@ -219,7 +219,7 @@ void LLToolSelectLand::render()  void LLToolSelectLand::handleSelect()  { -	gFloaterTools->setStatusText("Click and drag to select land"); +	gFloaterTools->setStatusText("selectland");  	mLastShowParcelOwners = gSavedSettings.getBOOL("ShowParcelOwners");  	gSavedSettings.setBOOL("ShowParcelOwners", mLastShowParcelOwners);  } @@ -227,7 +227,6 @@ void LLToolSelectLand::handleSelect()  void LLToolSelectLand::handleDeselect()  { -	gFloaterTools->setStatusText("");  	mSelection = NULL;  	mLastShowParcelOwners = gSavedSettings.getBOOL("ShowParcelOwners");  	//gParcelMgr->deselectLand(); diff --git a/indra/newview/lltoolview.cpp b/indra/newview/lltoolview.cpp index 1129479480..b3f0dc4883 100644 --- a/indra/newview/lltoolview.cpp +++ b/indra/newview/lltoolview.cpp @@ -75,7 +75,7 @@ LLToolView::~LLToolView()  	mContainList.deleteAllData();  } -//XUI: translate +//*TODO:translate?  void LLToolView::addTool(const LLString& icon_off, const LLString& icon_on, LLPanel* panel, LLTool* tool, LLView* hoverView, const char* label)  {  	llassert(tool); @@ -195,3 +195,4 @@ void LLToolView::onClickToolButton(void* userdata)  	gToolMgr->getCurrentToolset()->selectTool( clicked->mTool );  } + diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index 7c69fc6648..79ec70fb1c 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -258,7 +258,7 @@ void LLFloaterSettingsDebug::updateControl(LLControlBase* controlp)  	color_swatch->setVisible(FALSE);  	childSetVisible("val_text", FALSE);  	childSetVisible("boolean_combo", FALSE); -	mComment->setText(""); +	mComment->setText(LLString::null);  	if (controlp)  	{ @@ -294,7 +294,7 @@ void LLFloaterSettingsDebug::updateControl(LLControlBase* controlp)  		{  		  case TYPE_U32:  			spinner1->setVisible(TRUE); -			spinner1->setLabel("value"); +			spinner1->setLabel(LLString("value")); // Debug, don't translate  			if (!spinner1->hasFocus())  			{  				spinner1->setValue(sd); @@ -306,7 +306,7 @@ void LLFloaterSettingsDebug::updateControl(LLControlBase* controlp)  			break;  		  case TYPE_S32:  			spinner1->setVisible(TRUE); -			spinner1->setLabel("value"); +			spinner1->setLabel(LLString("value")); // Debug, don't translate  			if (!spinner1->hasFocus())  			{  				spinner1->setValue(sd); @@ -318,7 +318,7 @@ void LLFloaterSettingsDebug::updateControl(LLControlBase* controlp)  			break;  		  case TYPE_F32:  			spinner1->setVisible(TRUE); -			spinner1->setLabel("value"); +			spinner1->setLabel(LLString("value")); // Debug, don't translate  			if (!spinner1->hasFocus())  			{  				spinner1->setPrecision(3); @@ -352,11 +352,11 @@ void LLFloaterSettingsDebug::updateControl(LLControlBase* controlp)  			LLVector3 v;  			v.setValue(sd);  			spinner1->setVisible(TRUE); -			spinner1->setLabel("X"); +			spinner1->setLabel(LLString("X"));  			spinner2->setVisible(TRUE); -			spinner2->setLabel("Y"); +			spinner2->setLabel(LLString("Y"));  			spinner3->setVisible(TRUE); -			spinner3->setLabel("Z"); +			spinner3->setLabel(LLString("Z"));  			if (!spinner1->hasFocus())  			{  				spinner1->setPrecision(3); @@ -379,11 +379,11 @@ void LLFloaterSettingsDebug::updateControl(LLControlBase* controlp)  			LLVector3d v;  			v.setValue(sd);  			spinner1->setVisible(TRUE); -			spinner1->setLabel("X"); +			spinner1->setLabel(LLString("X"));  			spinner2->setVisible(TRUE); -			spinner2->setLabel("Y"); +			spinner2->setLabel(LLString("Y"));  			spinner3->setVisible(TRUE); -			spinner3->setLabel("Z"); +			spinner3->setLabel(LLString("Z"));  			if (!spinner1->hasFocus())  			{  				spinner1->setPrecision(3); @@ -406,13 +406,13 @@ void LLFloaterSettingsDebug::updateControl(LLControlBase* controlp)  			LLRect r;  			r.setValue(sd);  			spinner1->setVisible(TRUE); -			spinner1->setLabel("Left"); +			spinner1->setLabel(LLString("Left"));  			spinner2->setVisible(TRUE); -			spinner2->setLabel("Right"); +			spinner2->setLabel(LLString("Right"));  			spinner3->setVisible(TRUE); -			spinner3->setLabel("Bottom"); +			spinner3->setLabel(LLString("Bottom"));  			spinner4->setVisible(TRUE); -			spinner4->setLabel("Top"); +			spinner4->setLabel(LLString("Top"));  			if (!spinner1->hasFocus())  			{  				spinner1->setPrecision(0); @@ -462,7 +462,7 @@ void LLFloaterSettingsDebug::updateControl(LLControlBase* controlp)  				color_swatch->set(LLColor4(sd), TRUE, FALSE);  			}  			spinner4->setVisible(TRUE); -			spinner4->setLabel("Alpha"); +			spinner4->setLabel(LLString("Alpha"));  			if (!spinner4->hasFocus())  			{  				spinner4->setPrecision(3); @@ -490,7 +490,7 @@ void LLFloaterSettingsDebug::updateControl(LLControlBase* controlp)  				color_swatch->set(LLColor4(clr), TRUE, FALSE);  			}  			spinner4->setVisible(TRUE); -			spinner4->setLabel("Alpha"); +			spinner4->setLabel(LLString("Alpha"));  			if(!spinner4->hasFocus())  			{  				spinner4->setPrecision(0); @@ -504,7 +504,7 @@ void LLFloaterSettingsDebug::updateControl(LLControlBase* controlp)  			break;  		  }  		  default: -			mComment->setText("unknown"); +			mComment->setText(LLString("unknown"));  			break;  		}  	} diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index c7a892fe70..b4dc093f6a 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -242,6 +242,10 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield)  	LLVOAvatar::sRenderName = gSavedSettings.getS32("RenderName");  	gPipeline.mBackfaceCull = TRUE;  	gFrameCount++; +	if (gFocusMgr.getAppHasFocus()) +	{ +		gForegroundFrameCount++; +	}  	//////////////////////////////////////////////////////////  	// diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index c1e2b5e9d3..28c504910b 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -636,10 +636,12 @@ void init_menus()  	// flash when an item is triggered (the flash occurs in the holder)  	gViewerWindow->getRootView()->addChild(gMenuHolder); -	gMenuHolder->childSetLabelArg("Upload Image", "[COST]", "10"); -	gMenuHolder->childSetLabelArg("Upload Sound", "[COST]", "10"); -	gMenuHolder->childSetLabelArg("Upload Animation", "[COST]", "10"); -	gMenuHolder->childSetLabelArg("Bulk Upload", "[COST]", "10"); +	// *TODO:Get the cost info from the server +	const LLString upload_cost("10"); +	gMenuHolder->childSetLabelArg("Upload Image", "[COST]", upload_cost); +	gMenuHolder->childSetLabelArg("Upload Sound", "[COST]", upload_cost); +	gMenuHolder->childSetLabelArg("Upload Animation", "[COST]", upload_cost); +	gMenuHolder->childSetLabelArg("Bulk Upload", "[COST]", upload_cost);  	gAFKMenu = (LLMenuItemCallGL*)gMenuBarView->getChildByName("Set Away", TRUE);  	gBusyMenu = (LLMenuItemCallGL*)gMenuBarView->getChildByName("Set Busy", TRUE); @@ -3395,31 +3397,33 @@ void derez_objects(EDeRezDestination dest, const LLUUID& dest_id)  	}  	//gInventoryView->setPanelOpen(TRUE); -	LLObjectSelectionHandle selection = gSelectMgr->getSelection(); -	LLViewerObject* object = NULL; -	LLSelectNode* node = selection->getFirstRootNode(); -	if(!node) return; -	object = node->getObject(); -	if(!object) return; -	LLViewerRegion* region = object->getRegion(); -	char* error = NULL; - +	std::string error; +	LLDynamicArray<LLViewerObject*> derez_objects; +	  	// Check conditions that we can't deal with, building a list of  	// everything that we'll actually be derezzing. -	LLDynamicArray<LLViewerObject*> derez_objects; -	BOOL can_derez_current; -	for( ; node != NULL; node = selection->getNextRootNode()) +	LLViewerRegion* first_region = NULL; +	for (LLObjectSelection::valid_root_iterator iter = gSelectMgr->getSelection()->valid_root_begin(); +		 iter != gSelectMgr->getSelection()->valid_root_end(); iter++)  	{ -		object = node->getObject(); -		if(!object || !node->mValid) continue; -		if(object->getRegion() != region) +		LLSelectNode* node = *iter; +		LLViewerObject* object = node->getObject(); +		LLViewerRegion* region = object->getRegion(); +		if (!first_region)  		{ -			// Derez doesn't work at all if the some of the objects -			// are in regions besides the first object selected. - -			// ...crosses region boundaries -			error = "AcquireErrorObjectSpan"; -			break; +			first_region = region; +		} +		else +		{ +			if(region != first_region) +			{ +				// Derez doesn't work at all if the some of the objects +				// are in regions besides the first object selected. +				 +				// ...crosses region boundaries +				error = "AcquireErrorObjectSpan"; +				break; +			}  		}  		if (object->isAvatar())  		{ @@ -3440,7 +3444,7 @@ void derez_objects(EDeRezDestination dest, const LLUUID& dest_id)  			*/  			continue;  		} -		can_derez_current = FALSE; +		BOOL can_derez_current = FALSE;  		switch(dest)  		{  		case DRD_TAKE_INTO_AGENT_INVENTORY: @@ -3484,7 +3488,7 @@ void derez_objects(EDeRezDestination dest, const LLUUID& dest_id)  		error = "AcquireErrorTooManyObjects";  	} -	if(!error && derez_objects.count() > 0) +	if(error.empty() && derez_objects.count() > 0)  	{  		U8 d = (U8)dest;  		LLUUID tid; @@ -3513,7 +3517,7 @@ void derez_objects(EDeRezDestination dest, const LLUUID& dest_id)  				  && (objects_in_packet++ < MAX_ROOTS_PER_PACKET))  			{ -				object = derez_objects.get(object_index++); +				LLViewerObject* object = derez_objects.get(object_index++);  				msg->nextBlockFast(_PREHASH_ObjectData);  				msg->addU32Fast(_PREHASH_ObjectLocalID, object->getLocalID());  				// VEFFECT: DerezObject @@ -3521,7 +3525,7 @@ void derez_objects(EDeRezDestination dest, const LLUUID& dest_id)  				effectp->setPositionGlobal(object->getPositionGlobal());  				effectp->setColor(LLColor4U(gAgent.getEffectColor()));  			} -			msg->sendReliable(region->getHost()); +			msg->sendReliable(first_region->getHost());  		}  		make_ui_sound("UISndObjectRezOut"); @@ -3532,7 +3536,7 @@ void derez_objects(EDeRezDestination dest, const LLUUID& dest_id)  			gViewerWindow->getWindow()->incBusyCount();  		}  	} -	else if(error) +	else if(!error.empty())  	{  		gViewerWindow->alertXml(error);  	} @@ -3612,20 +3616,17 @@ class LLObjectEnableReturn : public view_listener_t  				}  				else  				{ -					LLObjectSelectionHandle selection = gSelectMgr->getSelection(); -					LLViewerObject* obj = NULL; -					for(obj = selection->getFirstRootObject(); -						obj; -						obj = selection->getNextRootObject()) +					struct f : public LLSelectedObjectFunctor  					{ -						if (obj->isOverAgentOwnedLand() -							|| obj->isOverGroupOwnedLand() -							|| obj->permModify()) +						virtual bool apply(LLViewerObject* obj)  						{ -							new_value = true; -							break; +							return (obj->isOverAgentOwnedLand() || +									obj->isOverGroupOwnedLand() || +									obj->permModify());  						} -					} +					} func; +					const bool firstonly = true; +					new_value = gSelectMgr->getSelection()->applyToRootObjects(&func, firstonly);  				}  			}  		} @@ -3641,373 +3642,25 @@ void force_take_copy(void*)  	const LLUUID& category_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_OBJECT);  	derez_objects(DRD_FORCE_TO_GOD_INVENTORY, category_id);  } -#ifdef _CORY_TESTING - -void force_export_copy(void*) -{ -	LLViewerObject* object = NULL; -	LLSelectNode* node = gSelectMgr->getSelection()->getFirstNode(); -	if(!node) return; -	object = node->getObject(); -	if(!object) return; - - -	LLString proposed_name; -	proposed_name.append(node->mName); -	proposed_name.append( ".slg" ); - -	LLViewerRegion* region = object->getRegion(); - -	// Check conditions that we can't deal with, building a list of -	// everything that we'll actually be derezzing. -	 -	std::vector<LLViewerObject*>		export_objects; -	std::vector<std::string>			export_names; -	std::vector<std::string>			export_descriptions; - -	S32 object_index = 0; - -	for( ; node != NULL; node = gSelectMgr->getSelection()->getNextNode()) -	{ -		object = node->getObject(); -		if(!object || !node->mValid) -		{ -			// Clicked cancel -			return; -		} -		if(object->getRegion() != region) -		{ -			// Clicked cancel -			return; -		} -		if (object->isAvatar()) -		{ -			continue; -		} - -		if (object->getNVPair("AssetContainer")) -		{ -			continue; -		} -		export_objects.push_back(node->getObject()); -		export_names.push_back(node->mName); -		export_descriptions.push_back(node->mDescription); -	} - -	if (export_objects.empty()) -	{ -		return; -	} - -	// pick a save file -	LLFilePicker& picker = LLFilePicker::instance(); -	if (!picker.getSaveFile(LLFilePicker::FFSAVE_GEOMETRY, proposed_name)) -	{ -		// Clicked cancel -		return; -	} - -	// Copy the directory + file name -	char filepath[LL_MAX_PATH];		/* Flawfinder: ignore */ -	strncpy(filepath, picker.getFirstFile(), LL_MAX_PATH -1);		/* Flawfinder: ignore */ -	filepath[LL_MAX_PATH -1] = '\0'; - -	apr_file_t* fp = ll_apr_file_open(filepath, LL_APR_W); - -	if (!fp) -	{ -		return; -	} - -	object = export_objects[object_index]; -	LLVector3 baseoffset = object->getPositionRegion(); - -	apr_file_printf(fp, "<?xml version=\"1.0\" encoding=\"US-ASCII\" standalone=\"yes\"?>\n"); -	apr_file_printf(fp, "<LindenGeometry>\n"); - -	while(object_index < export_objects.size()) -	{ -		apr_file_printf(fp, "<Object\n"); -		apr_file_printf(fp, "\tShape='%s'\n", export_names[object_index].c_str()); -		apr_file_printf(fp, "\tDescription='%s'\n", export_descriptions[object_index].c_str()); - -		apr_file_printf(fp, "\tPCode='%d'\n", (U32)object->getPCode()); -		apr_file_printf(fp, "\tMaterial='%d'\n", object->getMaterial()); -		apr_file_printf(fp, "\tScale='%5f %5f %5f'\n", object->getScale().mV[VX], object->getScale().mV[VY], object->getScale().mV[VZ]); -		LLVector3 delta = object->getPositionRegion() - baseoffset; -		LLQuaternion rot = object->getRotationRegion(); -		apr_file_printf(fp, "\tOffset='%5f %5f %5f'\n", delta.mV[VX], delta.mV[VY], delta.mV[VZ]); -		apr_file_printf(fp, "\tOrientation='%5f %5f %5f %5f'\n", rot.mQ[VX], rot.mQ[VY], rot.mQ[VZ], rot.mQ[VS]); -		const LLProfileParams pparams = object->getVolume()->getProfile().mParams; -		apr_file_printf(fp, "\tShapeProfile='%d %f %f %f'\n", pparams.getCurveType(), pparams.getBegin(), pparams.getEnd(), pparams.getHollow()); -		const LLPathParams paparams = object->getVolume()->getPath().mParams; -		apr_file_printf(fp, "\tShapePath='%d %f %f %f %f %f %f %f %f %f %f %f %f %f'\n", -								 paparams.getCurveType(), paparams.getBegin(), paparams.getEnd(), paparams.getTwist(), paparams.getTwistBegin(), paparams.getScaleX(), paparams.getScaleY(), -								 paparams.getShearX(), paparams.getShearY(), paparams.getRadiusOffset(), paparams.getTaperX(), paparams.getTaperY(), -								 paparams.getRevolutions(), paparams.getSkew()); -		S32 face, numfaces; -		numfaces = object->getNumTEs(); -		apr_file_printf(fp, "\tNumberOfFaces='%d'>\n", numfaces); -		for (face = 0; face < numfaces; face++) -		{ -			const LLTextureEntry *te = object->getTE(face); -			LLColor4 color = te->getColor(); -			apr_file_printf(fp, "\t<Face\n\t\tFaceColor='%d %5f %5f %5f %5f'\n", face, color.mV[VX], color.mV[VY], color.mV[VZ], color.mV[VW]); -			 -			char texture[UUID_STR_LENGTH];		/* Flawfinder: ignore */ -			LLUUID texid = te->getID(); -			texid.toString(texture); -			F32 sx, sy, ox, oy; -			te->getScale(&sx, &sy); -			te->getOffset(&ox, &oy); -			 -			apr_file_printf(fp, "\t\tFace='%d %5f %5f %5f %5f %5f %d %s'\n\t/>\n", face, sx, sy, ox, oy, te->getRotation(), te->getBumpShinyFullbright(), texture); -		} -		apr_file_printf(fp, "</Object>\n"); -		object = export_objects[++object_index]; -	} -	apr_file_printf(fp, "</LindenGeometry>\n"); - -	fclose(fp); -} - -void undo_find_local_contact_point(LLVector3 &contact, -								   const LLVector3& surface_norm,  -								   const LLQuaternion& rot,  -								   const LLVector3& scale  ) -{ -	LLVector3 local_norm = surface_norm; -	local_norm.rotVec( ~rot ); - -	LLVector3 v[6];  -	v[0].mV[VX] = -1.f; -	v[1].mV[VX] = 1.f; -	 -	v[2].mV[VY] = -1.f; -	v[3].mV[VY] = 1.f; - -	v[4].mV[VZ] = -1.f; -	v[5].mV[VZ] = 1.f; - -	contact = v[0]; -	F32 cur_val = 0; - -	for( S32 i = 0; i < 6; i++ ) -	{ -		F32 val = v[i] * local_norm; -		if( val < cur_val ) -		{ -			contact = v[i]; -			cur_val = val; -		} -	} - -	contact.mV[VX] *= 0.5f * scale.mV[VX]; -	contact.mV[VY] *= 0.5f * scale.mV[VY]; -	contact.mV[VZ] *= 0.5f * scale.mV[VZ]; -	contact.rotVec( rot ); -} - - - -void force_import_geometry(void*) +void handle_take()  { -	LLFilePicker& picker = LLFilePicker::instance(); -	if (!picker.getOpenFile(LLFilePicker::FFLOAD_GEOMETRY)) -	{ -		llinfos << "Couldn't import objects from file" << llendl; -		return; -	} - -	char directory[LL_MAX_PATH];		/* Flawfinder: ignore */ -	strncpy(directory, picker.getFirstFile(), LL_MAX_PATH -1);		/* Flawfinder: ignore */ -	directory[LL_MAX_PATH -1] = '\0'; - -	llinfos << "Loading LSG file " << directory << llendl; -	LLXmlTree *xmlparser = new LLXmlTree(); -	xmlparser->parseFile(directory, TRUE); -	LLXmlTreeNode	*root = xmlparser->getRoot(); -	if( !root ) -	{ -		return; -	} -	// header -	if( !root->hasName( "LindenGeometry" ) ) +	// we want to use the folder this was derezzed from if it's +	// available. Otherwise, derez to the normal place. +	if(gSelectMgr->getSelection()->isEmpty())  	{ -		llwarns << "Invalid LindenGeometry file header: " << directory << llendl;  		return;  	} -	// objects -	for (LLXmlTreeNode *child = root->getChildByName( "Object" ); -		 child; -		 child = root->getNextNamedChild()) -	{ -		// get object data -		// *NOTE: This buffer size is hard coded into scanf() below. -		char name[255];		/* Flawfinder: ignore */			// Shape -		char description[255];		/* Flawfinder: ignore */		// Description -		U32	 material;			// Material -		F32  sx, sy, sz;		// Scale -		LLVector3 scale; -		F32  ox, oy, oz;		// Offset -		LLVector3 offset; -		F32  rx, ry, rz, rs;	// Orientation -		LLQuaternion rot; -		U32	 curve; -		F32  begin; -		F32  end; -		F32	 hollow; -		F32	 twist; -		F32	 scx, scy; -		F32  shx, shy; -		F32  twist_begin; -		F32	 radius_offset; -		F32  tx, ty; -		F32	 revolutions; -		F32	 skew; -		S32  faces; -		U32 pcode; -		U32 flags = FLAGS_CREATE_SELECTED; - -		LLString attribute; - -		S32 count = 0; - -		child->getAttributeString("PCode", &attribute); -		pcode = atoi(attribute.c_str()); -		child->getAttributeString("Shape", &attribute); -		sscanf(	/* Flawfinder: ignore */ -			attribute.c_str(), "%254s", name); -		child->getAttributeString("Description", &attribute); -		sscanf(	/* Flawfinder: ignore */ -			attribute.c_str(), "%254s", description); -		child->getAttributeString("Material", &attribute); -		material = atoi(attribute.c_str()); -		child->getAttributeString("Scale", &attribute); -		sscanf(attribute.c_str(), "%f %f %f", &sx, &sy, &sz); -		scale.setVec(sx, sy, sz); -		child->getAttributeString("Offset", &attribute); -		sscanf(attribute.c_str(), "%f %f %f", &ox, &oy, &oz); -		offset.setVec(ox, oy, oz); -		child->getAttributeString("Orientation", &attribute); -		sscanf(attribute.c_str(), "%f %f %f %f", &rx, &ry, &rz, &rs); -		rot.mQ[VX] = rx; -		rot.mQ[VY] = ry; -		rot.mQ[VZ] = rz; -		rot.mQ[VS] = rs; - -		child->getAttributeString("ShapeProfile", &attribute); -		sscanf(attribute.c_str(), "%d %f %f %f", &curve, &begin, &end, &hollow); -		LLProfileParams pparams(curve, begin, end, hollow); -		child->getAttributeString("ShapePath", &attribute); -		sscanf(attribute.c_str(), "%d %f %f %f %f %f %f %f %f %f %f %f %f %f",  -			&curve, &begin, &end, &twist, &twist_begin, &scx, &scy, &shx, ­, &radius_offset, &tx, &ty, &revolutions, &skew); -		LLPathParams paparams(curve, begin, end, scx, scy, shx, shy, twist, twist_begin, radius_offset, tx, ty, revolutions, skew); -		child->getAttributeString("NumberOfFaces", &attribute); -		faces = atoi(attribute.c_str()); - - - -		gMessageSystem->newMessageFast(_PREHASH_ObjectAdd); -		gMessageSystem->nextBlockFast(_PREHASH_AgentData); -		gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); -		gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); -		gMessageSystem->addUUIDFast(_PREHASH_GroupID, gAgent.getGroupID()); - -		gMessageSystem->nextBlockFast(_PREHASH_ObjectData); -		gMessageSystem->addU8Fast(_PREHASH_PCode,		pcode); -		gMessageSystem->addU8Fast(_PREHASH_Material,	material); -		gMessageSystem->addU32Fast(_PREHASH_AddFlags,	flags ); -		pparams.packMessage(gMessageSystem); -		paparams.packMessage(gMessageSystem); - -		LLVector3 forward; -		forward.setVec(3.f, 0.f, 1.f); -		forward = forward * gAgent.getQuat(); - -		LLVector3 start = gAgent.getPositionAgent() + forward; - -		start += offset; - -		// offset position to make up for error introduced by placement code -		LLVector3 normal(0.f, 0.f, 1.f); -		LLVector3 delta; - -		undo_find_local_contact_point(delta, normal, rot, scale); - -		start += delta; - -		gMessageSystem->addVector3Fast(_PREHASH_Scale,			scale ); -		gMessageSystem->addQuatFast(_PREHASH_Rotation,			rot ); -		gMessageSystem->addVector3Fast(_PREHASH_RayStart,		start ); -		gMessageSystem->addVector3Fast(_PREHASH_RayEnd,			start ); -		gMessageSystem->addBOOLFast(_PREHASH_BypassRaycast,		TRUE ); -		gMessageSystem->addBOOLFast(_PREHASH_RayEndIsIntersection,	FALSE ); - -		U8 state = 0; -		gMessageSystem->addU8Fast(_PREHASH_State, state); -	 -		LLUUID ray_target_id; -		gMessageSystem->addUUIDFast(_PREHASH_RayTargetID,			ray_target_id ); -		/* Setting TE info through ObjectAdd is no longer supported. -		LLPrimitive     temp_primitive; -		temp_primitive.setNumTEs(faces); -		for (LLXmlTreeNode *face = child->getChildByName( "Face" ); -			 face; -			 face = child->getNextNamedChild()) -		{ -			// read the faces -			U32 facenumber; -			LLColor4 color; -			// *NOTE: This buffer size is hard coded into scanf() below. -			char texture[UUID_STR_LENGTH]; -			LLUUID texid; -			texid.toString(texture); -			F32 sx, sy, ox, oy, rot; -			U8 bump; -			LLTextureEntry te; - -			face->getAttributeString("FaceColor", &attribute); -			sscanf(attribute, "%d %f %f %f %f", &facenumber, &color.mV[VX], &color.mV[VY], &color.mV[VZ], &color.mV[VW]); -			face->getAttributeString("Face", &attribute); -			sscanf(attribute, "%d %f %f %f %f %f %d %36s", &facenumber, &sx, &sy, &ox, &oy, &rot, &bump, texture); -			texid.set(texture); -			te.setColor(color); -			te.setBumpShinyFullbright(bump); -			te.setID(texid); -			te.setRotation(rot); -			te.setOffset(ox, oy); -			te.setScale(sx, sy); - -			temp_primitive.setTE(facenumber, te); -		} - -		temp_primitive.packTEMessage(gMessageSystem); -		*/ -		gMessageSystem->sendReliable(gAgent.getRegionHost()); -	} - -} -#endif - -void handle_take() -{ -	// we want to use the folder this was derezzed from if it's -	// available. Otherwise, derez to the normal place. -	if(gSelectMgr->getSelection()->isEmpty()) return; -	LLSelectNode* node = NULL; -	LLViewerObject* object = NULL;  	BOOL you_own_everything = TRUE; -  	BOOL locked_but_takeable_object = FALSE;  	LLUUID category_id; -	for(node = gSelectMgr->getSelection()->getFirstRootNode(); -		node != NULL; -		node = gSelectMgr->getSelection()->getNextRootNode()) +	 +	for (LLObjectSelection::root_iterator iter = gSelectMgr->getSelection()->root_begin(); +		 iter != gSelectMgr->getSelection()->root_end(); iter++)  	{ -		object = node->getObject(); +		LLSelectNode* node = *iter; +		LLViewerObject* object = node->getObject();  		if(object)  		{  			if(!object->permYouOwner()) @@ -4016,11 +3669,8 @@ void handle_take()  			}  			if(!object->permMove()) -  			{ -  				locked_but_takeable_object = TRUE; -  			}  		}  		if(node->mFolderID.notNull()) @@ -4071,7 +3721,6 @@ void handle_take()  	}  	LLUUID* cat_id = new LLUUID(category_id);  	if(locked_but_takeable_object || -  	   !you_own_everything)  	{  		if(locked_but_takeable_object && you_own_everything) @@ -4124,13 +3773,11 @@ BOOL enable_take()  		return FALSE;  	} -	LLViewerObject* object = NULL; -	for(LLSelectNode* node = gSelectMgr->getSelection()->getFirstRootNode(); -		node != NULL; -		node = gSelectMgr->getSelection()->getNextRootNode()) +	for (LLObjectSelection::valid_root_iterator iter = gSelectMgr->getSelection()->valid_root_begin(); +		 iter != gSelectMgr->getSelection()->valid_root_end(); iter++)  	{ -		object = node->getObject(); -		if(!object || !node->mValid) continue; +		LLSelectNode* node = *iter; +		LLViewerObject* object = node->getObject();  		if (object->isAvatar())  		{  			// ...don't acquire avatars @@ -4240,12 +3887,11 @@ class LLToolsEnableBuyOrTake : public view_listener_t  //                FALSE if selection is a 'take'  BOOL is_selection_buy_not_take()  { -	LLViewerObject* obj = NULL; -	for(LLSelectNode* node = gSelectMgr->getSelection()->getFirstRootNode(); -		node != NULL; -		node = gSelectMgr->getSelection()->getNextRootNode()) +	for (LLObjectSelection::root_iterator iter = gSelectMgr->getSelection()->root_begin(); +		 iter != gSelectMgr->getSelection()->root_end(); iter++)  	{ -		obj = node->getObject(); +		LLSelectNode* node = *iter; +		LLViewerObject* obj = node->getObject();  		if(obj && !(obj->permYouOwner()) && (node->mSaleInfo.isForSale()))  		{  			// you do not own the object and it is for sale, thus, @@ -4258,13 +3904,12 @@ BOOL is_selection_buy_not_take()  S32 selection_price()  { -	LLViewerObject* obj = NULL;  	S32 total_price = 0; -	for(LLSelectNode* node = gSelectMgr->getSelection()->getFirstRootNode(); -		node != NULL; -		node = gSelectMgr->getSelection()->getNextRootNode()) +	for (LLObjectSelection::root_iterator iter = gSelectMgr->getSelection()->root_begin(); +		 iter != gSelectMgr->getSelection()->root_end(); iter++)  	{ -		obj = node->getObject(); +		LLSelectNode* node = *iter; +		LLViewerObject* obj = node->getObject();  		if(obj && !(obj->permYouOwner()) && (node->mSaleInfo.isForSale()))  		{  			// you do not own the object and it is for sale. @@ -4404,12 +4049,11 @@ class LLToolsSnapObjectXY : public view_listener_t  	{  		F64 snap_size = (F64)gSavedSettings.getF32("GridResolution"); -		LLViewerObject* obj; -		LLObjectSelectionHandle selection = gSelectMgr->getSelection(); -		for (obj = selection->getFirstRootObject(); -			obj != NULL; -			obj = selection->getNextRootObject()) +		for (LLObjectSelection::root_iterator iter = gSelectMgr->getSelection()->root_begin(); +			 iter != gSelectMgr->getSelection()->root_end(); iter++)  		{ +			LLSelectNode* node = *iter; +			LLViewerObject* obj = node->getObject();  			if (obj->permModify())  			{  				LLVector3d pos_global = obj->getPositionGlobal(); @@ -4466,17 +4110,15 @@ class LLToolsEnableLink : public view_listener_t  		{  			if(gSelectMgr->selectGetAllRootsValid() && gSelectMgr->getSelection()->getRootObjectCount() >= 2)  			{ -				LLObjectSelectionHandle selection = gSelectMgr->getSelection(); -				for(LLViewerObject* object = selection->getFirstRootObject(); -					object != NULL; -					object = selection->getNextRootObject()) +				struct f : public LLSelectedObjectFunctor  				{ -					if(object->permModify()) +					virtual bool apply(LLViewerObject* object)  					{ -						new_value = true; -						break; +						return object->permModify();  					} -				} +				} func; +				const bool firstonly = true; +				new_value = gSelectMgr->getSelection()->applyToRootObjects(&func, firstonly);  			}  		}  		gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); @@ -4914,7 +4556,6 @@ void handle_export_selected( void * )  		return;  	}  	llinfos << "Exporting selected objects:" << llendl; -	LLViewerObject *object = selection->getFirstRootObject();  	gExporterRequestID.generate();  	gExportDirectory = ""; @@ -4926,8 +4567,11 @@ void handle_export_selected( void * )  	msg->addUUIDFast(_PREHASH_RequestID, gExporterRequestID);  	msg->addS16Fast(_PREHASH_VolumeDetail, 4); -	for (; object != NULL; object = selection->getNextRootObject()) +	for (LLObjectSelection::root_iterator iter = selection->root_begin(); +		 iter != selection->root_end(); iter++)  	{ +		LLSelectNode* node = *iter; +		LLViewerObject* object = node->getObject();  		msg->nextBlockFast(_PREHASH_ObjectData);  		msg->addUUIDFast(_PREHASH_ObjectID, object->getID());  		llinfos << "Object: " << object->getID() << llendl; @@ -5321,16 +4965,21 @@ void handle_force_unlock(void*)  	gSelectMgr->sendOwner(LLUUID::null, LLUUID::null, TRUE);  	// Second, lie to the viewer and mark it editable and unowned -	LLViewerObject* object; -	for (object = gSelectMgr->getSelection()->getFirstObject(); object; object = gSelectMgr->getSelection()->getNextObject() ) + +	struct f : public LLSelectedObjectFunctor  	{ -		object->mFlags |= FLAGS_OBJECT_MOVE; -		object->mFlags |= FLAGS_OBJECT_MODIFY; -		object->mFlags |= FLAGS_OBJECT_COPY; +		virtual bool apply(LLViewerObject* object) +		{ +			object->mFlags |= FLAGS_OBJECT_MOVE; +			object->mFlags |= FLAGS_OBJECT_MODIFY; +			object->mFlags |= FLAGS_OBJECT_COPY; -		object->mFlags &= ~FLAGS_OBJECT_ANY_OWNER; -		object->mFlags &= ~FLAGS_OBJECT_YOU_OWNER; -	} +			object->mFlags &= ~FLAGS_OBJECT_ANY_OWNER; +			object->mFlags &= ~FLAGS_OBJECT_YOU_OWNER; +			return true; +		} +	} func; +	gSelectMgr->getSelection()->applyToObjects(&func);  }  // Fullscreen debug stuff @@ -6169,11 +5818,16 @@ class LLAttachmentEnableDetach : public view_listener_t  BOOL object_selected_and_point_valid(void *user_data)  {  	//LLViewerJointAttachment *attachment = (LLViewerJointAttachment *)user_data; -	if (gSelectMgr == NULL) return FALSE; - +	if (gSelectMgr == NULL) +	{ +		return FALSE; +	}  	LLObjectSelectionHandle selection = gSelectMgr->getSelection(); -	for (LLViewerObject *object = selection->getFirstRootObject(); object; object = selection->getNextRootObject()) +	for (LLObjectSelection::root_iterator iter = selection->root_begin(); +		 iter != selection->root_end(); iter++)  	{ +		LLSelectNode* node = *iter; +		LLViewerObject* object = node->getObject();  		for (U32 child_num = 0; child_num < object->mChildList.size(); child_num++ )  		{  			if (object->mChildList[child_num]->isAvatar()) @@ -6245,12 +5899,68 @@ BOOL enable_activate(void*)  	return FALSE;  } +namespace +{ +	struct QueueObjects : public LLSelectedObjectFunctor +	{ +		BOOL scripted; +		BOOL modifiable; +		LLFloaterScriptQueue* mQueue; +		QueueObjects(LLFloaterScriptQueue* q) : mQueue(q), scripted(FALSE), modifiable(FALSE) {} +		virtual bool apply(LLViewerObject* obj) +		{ +			scripted = obj->flagScripted(); +			modifiable = obj->permModify(); + +			if( scripted && modifiable ) +			{ +				mQueue->addObject(obj->getID()); +				return false; +			} +			else +			{ +				return true; // fail: stop applying +			} +		} +	}; +} + +void queue_actions(LLFloaterScriptQueue* q, const std::string& noscriptmsg, const std::string& nomodmsg) +{ +	// Apply until an object fails +	QueueObjects func(q); +	const bool firstonly = true; +	bool fail = gSelectMgr->getSelection()->applyToObjects(&func, firstonly); +	if(fail) +	{ +		if ( !func.scripted ) +		{ +			gViewerWindow->alertXml(noscriptmsg); +		} +		else if ( !func.modifiable ) +		{ +			gViewerWindow->alertXml(nomodmsg); +		} +		else +		{ +			llerrs << "Bad logic." << llendl; +		} +	} +	else +	{ +		if (!q->start()) +		{ +			llwarns << "Unexpected script compile failure." << llendl; +		} +	} +} +  class LLToolsSelectedScriptAction : public view_listener_t  {  	bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)  	{  		LLString action = userdata.asString(); -		LLFloaterScriptQueue *queue = NULL; +		LLFloaterScriptQueue* queue = NULL;  		if (action == "compile")  		{  			queue = LLFloaterCompileQueue::create(); @@ -6267,35 +5977,13 @@ class LLToolsSelectedScriptAction : public view_listener_t  		{  			queue = LLFloaterNotRunQueue::create();  		} -		if (!queue) return true; - -		BOOL scripted = FALSE; -		BOOL modifiable = FALSE; - -		for(LLViewerObject* obj = gSelectMgr->getSelection()->getFirstObject(); -			obj; -			obj = gSelectMgr->getSelection()->getNextObject()) +		if (!queue)  		{ -			scripted = obj->flagScripted(); -			modifiable = obj->permModify(); - -			if( scripted &&  modifiable ) -				queue->addObject(obj->getID()); -			else -				break; +			return true;  		} -		if(!queue->start()) -		{ -			if ( ! scripted ) -			{ -				gViewerWindow->alertXml("CannotRecompileSelectObjectsNoScripts"); -			} -			else if ( ! modifiable ) -			{ -				gViewerWindow->alertXml("CannotRecompileSelectObjectsNoPermission"); -			} -		} +		queue_actions(queue, "CannotRecompileSelectObjectsNoScripts", "CannotRecompileSelectObjectsNoPermission"); +  		return true;  	}  }; @@ -6303,109 +5991,28 @@ class LLToolsSelectedScriptAction : public view_listener_t  void handle_reset_selection(void*)  {  	LLFloaterResetQueue* queue = LLFloaterResetQueue::create(); - -	BOOL scripted = FALSE; -	BOOL modifiable = FALSE; - -	for(LLViewerObject* obj = gSelectMgr->getSelection()->getFirstObject(); -		obj; -		obj = gSelectMgr->getSelection()->getNextObject()) -	{ -		scripted = obj->flagScripted(); -		modifiable = obj->permModify(); - -		if( scripted &&  modifiable ) -			queue->addObject(obj->getID()); -		else -			break; -	} - -	if(!queue->start()) -	{ -		if ( ! scripted ) -		{ -			gViewerWindow->alertXml("CannotResetSelectObjectsNoScripts"); -		} -		else if ( ! modifiable ) -		{ -			gViewerWindow->alertXml("CannotResetSelectObjectsNoPermission"); -		} -	} +	queue_actions(queue, "CannotResetSelectObjectsNoScripts", "CannotResetSelectObjectsNoPermission");  }  void handle_set_run_selection(void*)  {  	LLFloaterRunQueue* queue = LLFloaterRunQueue::create(); - -	BOOL scripted = FALSE; -	BOOL modifiable = FALSE; - -	for(LLViewerObject* obj = gSelectMgr->getSelection()->getFirstObject(); -		obj; -		obj = gSelectMgr->getSelection()->getNextObject()) -	{ -		scripted = obj->flagScripted(); -		modifiable = obj->permModify(); - -		if( scripted &&  modifiable ) -			queue->addObject(obj->getID()); -		else -			break; -	} - -	if(!queue->start()) -	{ -		if ( ! scripted ) -		{ -			gViewerWindow->alertXml("CannotSetRunningSelectObjectsNoScripts"); -		} -		else if ( ! modifiable ) -		{ -			gViewerWindow->alertXml("CannotSerRunningSelectObjectsNoPermission"); -		} -	} +	queue_actions(queue, "CannotSetRunningSelectObjectsNoScripts", "CannotSerRunningSelectObjectsNoPermission");  }  void handle_set_not_run_selection(void*)  {  	LLFloaterNotRunQueue* queue = LLFloaterNotRunQueue::create(); - -	BOOL scripted = FALSE; -	BOOL modifiable = FALSE; - -	for(LLViewerObject* obj = gSelectMgr->getSelection()->getFirstObject(); -		obj; -		obj = gSelectMgr->getSelection()->getNextObject()) -	{ -		scripted = obj->flagScripted(); -		modifiable = obj->permModify(); - -		if( scripted &&  modifiable ) -			queue->addObject(obj->getID()); -		else -			break; -	} - -	if(!queue->start()) -	{ -		if ( ! scripted ) -		{ -			gViewerWindow->alertXml("CannotSetRunningNotSelectObjectsNoScripts"); -		} -		else if ( ! modifiable ) -		{ -			gViewerWindow->alertXml("CannotSerRunningNotSelectObjectsNoPermission"); -		} -	} +	queue_actions(queue, "CannotSetRunningNotSelectObjectsNoScripts", "CannotSerRunningNotSelectObjectsNoPermission");  }  void handle_selected_texture_info(void*)  { -	LLSelectNode* node = NULL; -	for (node = gSelectMgr->getSelection()->getFirstNode(); node != NULL; node = gSelectMgr->getSelection()->getNextNode()) +	for (LLObjectSelection::valid_iterator iter = gSelectMgr->getSelection()->valid_begin(); +		 iter != gSelectMgr->getSelection()->valid_end(); iter++)  	{ -		if (!node->mValid) continue; - +		LLSelectNode* node = *iter; +		  		std::string msg;  		msg.assign("Texture info for: ");  		msg.append(node->mName); @@ -6625,51 +6232,52 @@ class LLToolsEnableTakeCopy : public view_listener_t  {  	bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)  	{ -		bool new_value = false; +		bool all_valid = false;  		if (gSelectMgr)  		{ -			new_value = true; +			all_valid = true;  #ifndef HACKED_GODLIKE_VIEWER  # ifdef TOGGLE_HACKED_GODLIKE_VIEWER  			if (gInProductionGrid || !gAgent.isGodlike())  # endif  			{ -				LLObjectSelectionHandle selection = gSelectMgr->getSelection(); -				LLViewerObject* obj = selection->getFirstRootObject(); -				if(obj) +				struct f : public LLSelectedObjectFunctor  				{ -					for( ; obj; obj = selection->getNextRootObject()) +					virtual bool apply(LLViewerObject* obj)  					{ -						if(!(obj->permCopy()) || obj->isAttachment()) -						{ -							new_value = false; -						} +						return (!obj->permCopy() || obj->isAttachment());  					} -				} +				} func; +				const bool firstonly = true; +				bool any_invalid = gSelectMgr->getSelection()->applyToRootObjects(&func, firstonly); +				all_valid = !any_invalid;  			}  #endif // HACKED_GODLIKE_VIEWER  		} -		gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); +		gMenuHolder->findControl(userdata["control"].asString())->setValue(all_valid);  		return true;  	}  };  BOOL enable_selection_you_own_all(void*)  { -	LLViewerObject *obj;  	if (gSelectMgr)  	{ -		LLObjectSelectionHandle selection = gSelectMgr->getSelection(); -		for (obj = selection->getFirstRootObject(); obj; obj = selection->getNextRootObject()) +		struct f : public LLSelectedObjectFunctor  		{ -			if (!obj->permYouOwner()) +			virtual bool apply(LLViewerObject* obj)  			{ -				return FALSE; +				return (!obj->permYouOwner());  			} +		} func; +		const bool firstonly = true; +		bool no_perms = gSelectMgr->getSelection()->applyToRootObjects(&func, firstonly); +		if (no_perms) +		{ +			return FALSE;  		}  	} -  	return TRUE;  } @@ -6677,17 +6285,21 @@ BOOL enable_selection_you_own_one(void*)  {  	if (gSelectMgr)  	{ -		LLObjectSelectionHandle selection = gSelectMgr->getSelection(); -		LLViewerObject *obj; -		for (obj = selection->getFirstRootObject(); obj; obj = selection->getNextRootObject()) +		struct f : public LLSelectedObjectFunctor  		{ -			if (obj->permYouOwner()) +			virtual bool apply(LLViewerObject* obj)  			{ -				return TRUE; +				return (obj->permYouOwner());  			} +		} func; +		const bool firstonly = true; +		bool any_perms = gSelectMgr->getSelection()->applyToRootObjects(&func, firstonly); +		if (!any_perms) +		{ +			return FALSE;  		}  	} -	return FALSE; +	return TRUE;  }  class LLHasAsset : public LLInventoryCollectFunctor @@ -6718,13 +6330,13 @@ BOOL enable_save_into_inventory(void*)  {  	if(gSelectMgr)  	{ +		// *TODO: clean this up  		// find the last root  		LLSelectNode* last_node = NULL; -		for(LLSelectNode* node = gSelectMgr->getSelection()->getFirstRootNode(); -			node != NULL; -			node = gSelectMgr->getSelection()->getNextRootNode()) +		for (LLObjectSelection::root_iterator iter = gSelectMgr->getSelection()->root_begin(); +			 iter != gSelectMgr->getSelection()->root_end(); iter++)  		{ -			last_node = node; +			last_node = *iter;  		}  #ifdef HACKED_GODLIKE_VIEWER @@ -7206,13 +6818,15 @@ class LLToolsUseSelectionForGrid : public view_listener_t  	bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)  	{  		gSelectMgr->clearGridObjects(); -		LLObjectSelectionHandle selection = gSelectMgr->getSelection(); -		for (LLViewerObject* objectp = selection->getFirstRootObject(); -			objectp; -			objectp = selection->getNextRootObject()) +		struct f : public LLSelectedObjectFunctor +		{ +			virtual bool apply(LLViewerObject* objectp)  			{  				gSelectMgr->addGridObject(objectp); +				return true;  			} +		} func; +		gSelectMgr->getSelection()->applyToRootObjects(&func);  		gSelectMgr->setGridMode(GRID_MODE_REF_OBJECT);  		if (gFloaterTools)  		{ diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 90bda38ec6..bd959b9dea 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -989,7 +989,7 @@ void inventory_offer_callback(S32 button, void* user_data)  		itemp = (LLViewerInventoryItem*)gInventory.getItem(info->mObjectID);  	} -	// XUI:translate +	// *TODO:translate  	LLString from_string; // Used in the pop-up.  	LLString chatHistory_string;  // Used in chat history.  	if (info->mFromObject == TRUE) @@ -1225,7 +1225,7 @@ void inventory_offer_handler(LLOfferInfo* info, BOOL from_task)  	}  	else  	{ -		// XUI:translate -> [FIRST] [LAST] +		// *TODO:translate -> [FIRST] [LAST]  		args["[NAME]"] = info->mFromName;  		LLNotifyBox::showXml("UserGiveItem", args,  							&inventory_offer_callback, (void*)info); @@ -1329,7 +1329,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  	S32 binary_bucket_size;  	LLChat chat; -	//XUI:translate - need to fix the full name to first/last +	//*TODO:translate - need to fix the full name to first/last (maybe)  	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, from_id);  	msg->getBOOLFast(_PREHASH_MessageBlock, _PREHASH_FromGroup, from_group);  	msg->getUUIDFast(_PREHASH_MessageBlock, _PREHASH_ToAgentID, to_id); @@ -1379,7 +1379,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  	case IM_CONSOLE_AND_CHAT_HISTORY:  		// These are used for system messages, hence don't need the name,  		// as it is always "Second Life". -	  	// XUI:translate +	  	// *TODO:translate  		args["[MESSAGE]"] = message;  		// Note: don't put the message in the IM history, even though was sent @@ -1528,7 +1528,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  	case IM_MESSAGEBOX:  		{  			// This is a block, modeless dialog. -			//XUI:translate +			//*TODO:translate  			args["[MESSAGE]"] = message;  			LLNotifyBox::showXml("SystemMessage", args);  		} @@ -1845,7 +1845,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  			}  			else  			{ -				// XUI:translate -> [FIRST] [LAST] +				// *TODO:translate -> [FIRST] [LAST] (maybe)  				LLLureInfo* info = new LLLureInfo(from_id, session_id, FALSE);  				args["[NAME]"] = name;  				args["[MESSAGE]"] = message; @@ -4026,7 +4026,7 @@ void process_money_balance_reply( LLMessageSystem* msg, void** )  	{  		// Make the user confirm the transaction, since they might  		// have missed something during an event. -		// XUI:translate +		// *TODO:translate  		LLString::format_map_t args;  		args["[MESSAGE]"] = desc;  		LLNotifyBox::showXml("SystemMessage", args); @@ -4082,7 +4082,6 @@ void process_alert_core(const char* buffer, BOOL modal)  		gViewerWindow->saveSnapshot(snap_filename, gViewerWindow->getWindowWidth(), gViewerWindow->getWindowHeight(), FALSE, FALSE);  	} -	// Translate system messages here.  	const char ALERT_PREFIX[] = "ALERT: ";  	const size_t ALERT_PREFIX_LEN = sizeof(ALERT_PREFIX) - 1;  	if (!strncmp(buffer, ALERT_PREFIX, ALERT_PREFIX_LEN)) @@ -4113,21 +4112,21 @@ void process_alert_core(const char* buffer, BOOL modal)  		}  		else  		{ -			//XUI:translate +			// *TODO:translate  			args["[MESSAGE]"] = text;  			LLNotifyBox::showXml("SystemMessage", args);  		}  	}  	else if (modal)  	{ -		//XUI:translate +		// *TODO:translate  		LLString::format_map_t args;  		args["[ERROR_MESSAGE]"] = buffer;  		gViewerWindow->alertXml("ErrorMessage", args);  	}  	else  	{ -		//XUI:translate +		// *TODO:translate  		LLString::format_map_t args;  		args["[MESSAGE]"] = buffer;  		LLNotifyBox::showXml("SystemMessageTip", args); @@ -4428,7 +4427,7 @@ void script_question_cb(S32 option, void* user_data)  void process_script_question(LLMessageSystem *msg, void **user_data)  { -	// XUI:translate owner name -> [FIRST] [LAST] +	// *TODO:translate owner name -> [FIRST] [LAST]  	LLHost sender = msg->getSender(); diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index c860dd9cdd..967f018f0d 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -592,12 +592,15 @@ void LLViewerObjectList::updateApparentAngles(LLAgent &agent)  	}  	// Selected -	LLObjectSelectionHandle selection = gSelectMgr->getSelection(); -	for (objectp = selection->getFirstRootObject(); objectp; objectp = selection->getNextRootObject()) +	struct f : public LLSelectedObjectFunctor  	{ -		objectp->boostTexturePriority(); -	} - +		virtual bool apply(LLViewerObject* objectp) +		{ +			objectp->boostTexturePriority(); +			return true; +		} +	} func; +	gSelectMgr->getSelection()->applyToRootObjects(&func);  	// Iterate through some of the objects and lazy update their texture priorities  	for (i = mCurLazyUpdateIndex; i < max_value; i++) @@ -1028,7 +1031,7 @@ void LLViewerObjectList::renderObjectsForMap(LLNetMap &netmap)  	for (S32 i = 0; i < mMapObjects.count(); i++)  	{  		LLViewerObject* objectp = mMapObjects[i]; -		if (objectp->isOrphaned() || objectp->isAttachment()) +		if (!objectp->getRegion() || objectp->isOrphaned() || objectp->isAttachment())  		{  			continue;  		} diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index 2a9ad2b456..f0e8132990 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -1252,7 +1252,7 @@ void LLViewerParcelMgr::makeLandmarkAtSelection()  }  */ -const char* LLViewerParcelMgr::getAgentParcelName() const +const LLString& LLViewerParcelMgr::getAgentParcelName() const  {  	return mAgentParcel->getName();  } diff --git a/indra/newview/llviewerparcelmgr.h b/indra/newview/llviewerparcelmgr.h index b8238c3dbe..58a7067da4 100644 --- a/indra/newview/llviewerparcelmgr.h +++ b/indra/newview/llviewerparcelmgr.h @@ -280,7 +280,7 @@ public:  	void sendParcelRelease();  	// accessors for mAgentParcel -	const char *getAgentParcelName() const; +	const LLString& getAgentParcelName() const;  	// Create a landmark at the "appropriate" location for the  	// currently selected parcel. diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index c3e0e56fb1..0a8d9a8e1d 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -451,6 +451,7 @@ std::string LLViewerRegion::regionFlagsToString(U32 flags)  	return result;  } +// *TODO:Translate  char* SIM_ACCESS_STR[] = { "Free Trial",  						   "PG",  						   "Mature", @@ -1413,3 +1414,4 @@ void LLViewerRegion::logActiveCapabilities() const  	llinfos << "Dumped " << count << " entries." << llendl;  } + diff --git a/indra/newview/llviewertexteditor.h b/indra/newview/llviewertexteditor.h index f52ffe9795..e05a61c3a3 100644 --- a/indra/newview/llviewertexteditor.h +++ b/indra/newview/llviewertexteditor.h @@ -50,7 +50,7 @@ public:  	LLViewerTextEditor(const LLString& name,  					   const LLRect& rect,  					   S32 max_length, -					   const LLString& default_text = "", +					   const LLString& default_text = LLString(),  					   const LLFontGL* glfont = NULL,  					   BOOL allow_embedded_items = FALSE); diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index ae94dcc384..49abf130ac 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1218,6 +1218,10 @@ void LLViewerWindow::handleFocus(LLWindow *window)  	{  		gKeyboard->resetMaskKeys();  	} + +	// resume foreground running timer +	// since we artifically limit framerate when not frontmost +	gForegroundTime.unpause();  }  // The top-level window has lost focus (e.g. via ALT-TAB) @@ -1251,6 +1255,9 @@ void LLViewerWindow::handleFocusLost(LLWindow *window)  	{  		gKeyboard->resetKeys();  	} + +	// pause timer that tracks total foreground running time +	gForegroundTime.pause();  } @@ -1328,10 +1335,16 @@ BOOL LLViewerWindow::handleActivate(LLWindow *window, BOOL activated)  	else  	{  		mActive = FALSE; -		if (gAllowIdleAFK) { +		if (gAllowIdleAFK) +		{  			gAgent.setAFK();  		} +		 +		// SL-53351: Make sure we're not in mouselook when minimised, to prevent control issues +		gAgent.changeCameraToDefault(); +		  		send_agent_pause(); +		  		if (mWindow->getFullscreen() && !mIgnoreActivate)  		{  			llinfos << "Stopping GL during deactivation" << llendl; @@ -3099,7 +3112,6 @@ void LLViewerWindow::saveLastMouse(const LLCoordGL &point)  //  render_hud_elements:	FALSE, FALSE, FALSE  void LLViewerWindow::renderSelections( BOOL for_gl_pick, BOOL pick_parcel_walls, BOOL for_hud )  { -	LLViewerObject* object;  	LLObjectSelectionHandle selection = gSelectMgr->getSelection();  	if (!for_hud && !for_gl_pick) @@ -3155,34 +3167,41 @@ void LLViewerWindow::renderSelections( BOOL for_gl_pick, BOOL pick_parcel_walls,  				F32 zoom = gAgent.getAvatarObject()->mHUDCurZoom;  				glScalef(zoom, zoom, zoom);  			} -			for( object = gSelectMgr->getSelection()->getFirstObject(); object; object = gSelectMgr->getSelection()->getNextObject() ) + +			struct f : public LLSelectedObjectFunctor  			{ -				LLDrawable* drawable = object->mDrawable; -				if (drawable && drawable->isLight()) +				virtual bool apply(LLViewerObject* object)  				{ -					LLVOVolume* vovolume = drawable->getVOVolume(); -					glPushMatrix(); +					LLDrawable* drawable = object->mDrawable; +					if (drawable && drawable->isLight()) +					{ +						LLVOVolume* vovolume = drawable->getVOVolume(); +						glPushMatrix(); -					LLVector3 center = drawable->getPositionAgent(); -					glTranslatef(center[0], center[1], center[2]); -					F32 scale = vovolume->getLightRadius(); -					glScalef(scale, scale, scale); +						LLVector3 center = drawable->getPositionAgent(); +						glTranslatef(center[0], center[1], center[2]); +						F32 scale = vovolume->getLightRadius(); +						glScalef(scale, scale, scale); -					LLColor4 color(vovolume->getLightColor(), .5f); -					glColor4fv(color.mV); +						LLColor4 color(vovolume->getLightColor(), .5f); +						glColor4fv(color.mV); -					F32 pixel_area = 100000.f; -					// Render Outside -					gSphere.render(pixel_area); - -					// Render Inside -					glCullFace(GL_FRONT); -					gSphere.render(pixel_area); -					glCullFace(GL_BACK); +						F32 pixel_area = 100000.f; +						// Render Outside +						gSphere.render(pixel_area); + +						// Render Inside +						glCullFace(GL_FRONT); +						gSphere.render(pixel_area); +						glCullFace(GL_BACK); -					glPopMatrix(); +						glPopMatrix(); +					} +					return true;  				} -			} +			} func; +			gSelectMgr->getSelection()->applyToObjects(&func); +			  			glPopMatrix();  		}				 @@ -3205,8 +3224,12 @@ void LLViewerWindow::renderSelections( BOOL for_gl_pick, BOOL pick_parcel_walls,  					BOOL all_selected_objects_move = TRUE;  					BOOL all_selected_objects_modify = TRUE;  					BOOL selecting_linked_set = !gSavedSettings.getBOOL("EditLinkedParts"); -					for( object = gSelectMgr->getSelection()->getFirstObject(); object; object = gSelectMgr->getSelection()->getNextObject() ) + +					for (LLObjectSelection::iterator iter = gSelectMgr->getSelection()->begin(); +						 iter != gSelectMgr->getSelection()->end(); iter++)  					{ +						LLSelectNode* nodep = *iter; +						LLViewerObject* object = nodep->getObject();  						BOOL this_object_movable = FALSE;  						if (object->permMove() && (object->permModify() || selecting_linked_set))  						{ diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index f97f36aa4a..fcd15974f6 100644 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -220,7 +220,7 @@ public:  	BOOL			saveSnapshot(const LLString&  filename, S32 image_width, S32 image_height, BOOL show_ui = TRUE, BOOL do_rebuild = FALSE, ESnapshotType type = SNAPSHOT_TYPE_COLOR);  	BOOL			rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_height, BOOL keep_window_aspect = TRUE,   								BOOL show_ui = TRUE, BOOL do_rebuild = FALSE, ESnapshotType type = SNAPSHOT_TYPE_COLOR ); -	BOOL		    saveImageNumbered(LLImageRaw *raw, const LLString& extension = ""); +	BOOL		    saveImageNumbered(LLImageRaw *raw, const LLString& extension = LLString());  	void			playSnapshotAnimAndSound(); diff --git a/indra/newview/llvoiceclient.h b/indra/newview/llvoiceclient.h index ee7d18c0c8..ed256b6f8c 100644 --- a/indra/newview/llvoiceclient.h +++ b/indra/newview/llvoiceclient.h @@ -445,7 +445,7 @@ class LLVoiceClient: public LLSingleton<LLVoiceClient>  		// It initiates the call to the server that gets the parcel channel.  		void parcelChanged(); -		void switchChannel(std::string uri = "", bool spatial = true, bool noReconnect = false, std::string hash = ""); +	void switchChannel(std::string uri = std::string(), bool spatial = true, bool noReconnect = false, std::string hash = "");  		void joinSession(std::string handle, std::string uri);  		std::string nameFromAvatar(LLVOAvatar *avatar); @@ -526,3 +526,4 @@ extern LLVoiceClient *gVoiceClient;  #endif //LL_VOICE_CLIENT_H + diff --git a/indra/newview/llwearable.h b/indra/newview/llwearable.h index 07ea638b7f..cd02843ccf 100644 --- a/indra/newview/llwearable.h +++ b/indra/newview/llwearable.h @@ -85,11 +85,11 @@ public:  	EWearableType		getType() const							{ return mType; }  	void				setType( EWearableType type )			{ mType = type; } -	void				setName( const std::string& name )				{ mName = name; } -	const std::string&	getName()								{ return mName; } +	void				setName( const LLString& name )			{ mName = name; } +	const LLString&		getName()								{ return mName; } -	void				setDescription( const std::string& desc )		{ mDescription = desc; } -	const std::string&	getDescription()						{ return mDescription; } +	void				setDescription( const LLString& desc )	{ mDescription = desc; } +	const LLString&		getDescription()						{ return mDescription; }  	void				setPermissions( const LLPermissions& p ) { mPermissions = p; }  	const LLPermissions& getPermissions()						{ return mPermissions; } diff --git a/indra/newview/llwearablelist.cpp b/indra/newview/llwearablelist.cpp index 06ad6bb470..39a6046f59 100644 --- a/indra/newview/llwearablelist.cpp +++ b/indra/newview/llwearablelist.cpp @@ -132,7 +132,7 @@ void LLWearableList::processGetAssetReply( const char* filename, const LLAssetID  			else  			{  				LLString::format_map_t args; -				// XUI:translate +				// *TODO:translate  				args["[TYPE]"] = LLAssetType::lookupHumanReadable(data->mAssetType);  				if (data->mName.empty())  				{ @@ -170,7 +170,7 @@ void LLWearableList::processGetAssetReply( const char* filename, const LLAssetID  		  case LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE:  		  {  			  LLString::format_map_t args; -			  // XUI:translate +			  // *TODO:translate  			  args["[TYPE]"] = LLAssetType::lookupHumanReadable(data->mAssetType);  			  if (data->mName.empty())  			  { diff --git a/indra/newview/llwearablelist.h b/indra/newview/llwearablelist.h index 4866fb5eb7..303fcb7bd3 100644 --- a/indra/newview/llwearablelist.h +++ b/indra/newview/llwearablelist.h @@ -57,7 +57,7 @@ public:  	LLWearable*			createLegacyWearableFromAvatar( EWearableType type );  	LLWearable*			createWearableMatchedToInventoryItem( LLWearable* old_wearable, LLViewerInventoryItem* item ); -	LLWearable*			createCopyFromAvatar( LLWearable* old_wearable, const std::string& new_name = "" ); +	LLWearable*			createCopyFromAvatar( LLWearable* old_wearable, const std::string& new_name = std::string() );  	LLWearable*			createCopy( LLWearable* old_wearable );  	LLWearable*			createNewWearable( EWearableType type ); diff --git a/indra/newview/llworldmapview.h b/indra/newview/llworldmapview.h index 72e470e2f0..28ffb421b0 100644 --- a/indra/newview/llworldmapview.h +++ b/indra/newview/llworldmapview.h @@ -104,7 +104,7 @@ public:  	// the view area.  	void			drawTracking( const LLVector3d& pos_global,   								  const LLColor4& color, -								  BOOL draw_arrow = TRUE, LLString label = "", LLString tooltip = "", S32 vert_offset = 0); +								  BOOL draw_arrow = TRUE, LLString label = LLString(), LLString tooltip = "", S32 vert_offset = 0);  	static void		drawTrackingArrow(const LLRect& view_rect, S32 x, S32 y,   									  const LLColor4& color,  									  S32 arrow_size = DEFAULT_TRACKING_ARROW_SIZE); diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index a9c5e36bf5..d336876ee1 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -1813,15 +1813,18 @@ void LLPipeline::postSort(LLCamera& camera)  	// Draw face highlights for selected faces.  	if (gSelectMgr->getTEMode())  	{ -		LLViewerObject *vobjp; -		S32             te; -		gSelectMgr->getSelection()->getFirstTE(&vobjp,&te); - -		while (vobjp) +		struct f : public LLSelectedTEFunctor  		{ -			mSelectedFaces.push_back(vobjp->mDrawable->getFace(te)); -			gSelectMgr->getSelection()->getNextTE(&vobjp,&te); -		} +			virtual bool apply(LLViewerObject* object, S32 te) +			{ +				if (object->mDrawable) +				{ +					gPipeline.mSelectedFaces.push_back(object->mDrawable->getFace(te)); +				} +				return true; +			} +		} func; +		gSelectMgr->getSelection()->applyToTEs(&func);  	}  }  | 
