diff options
| author | Monroe Linden <monroe@lindenlab.com> | 2010-08-09 17:05:53 -0700 | 
|---|---|---|
| committer | Monroe Linden <monroe@lindenlab.com> | 2010-08-09 17:05:53 -0700 | 
| commit | 011c3686a6e10edfe40adb67105298033188c1d6 (patch) | |
| tree | 8e45584e245d4f31429703a52da2bf0124d93d04 | |
| parent | bd708f82bd3b87051e03a2794ce417ae6f432c08 (diff) | |
| parent | a11a8c4027eb949c8a33951b9e8c7475e59a2eeb (diff) | |
Automated merge with ssh://hg.lindenlab.com/dessie/viewer-public
34 files changed, 823 insertions, 226 deletions
diff --git a/indra/llcommon/stdenums.h b/indra/llcommon/stdenums.h index 1a5678dde1..e0565204d4 100644 --- a/indra/llcommon/stdenums.h +++ b/indra/llcommon/stdenums.h @@ -119,8 +119,8 @@ enum EObjectPropertiesExtraID  enum EAddPosition  {  	ADD_TOP, -	ADD_SORTED, -	ADD_BOTTOM +	ADD_BOTTOM, +	ADD_DEFAULT  };  enum LLGroupChange diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp index d6c062fc5e..849318ccee 100644 --- a/indra/llrender/llfontgl.cpp +++ b/indra/llrender/llfontgl.cpp @@ -983,37 +983,43 @@ LLFontGL::VAlign LLFontGL::vAlignFromName(const std::string& name)  //static  LLFontGL* LLFontGL::getFontMonospace()  { -	return getFont(LLFontDescriptor("Monospace","Monospace",0)); +	static LLFontGL* fontp = getFont(LLFontDescriptor("Monospace","Monospace",0)); +	return fontp;  }  //static  LLFontGL* LLFontGL::getFontSansSerifSmall()  { -	return getFont(LLFontDescriptor("SansSerif","Small",0)); +	static LLFontGL* fontp = getFont(LLFontDescriptor("SansSerif","Small",0)); +	return fontp;  }  //static  LLFontGL* LLFontGL::getFontSansSerif()  { -	return getFont(LLFontDescriptor("SansSerif","Medium",0)); +	static LLFontGL* fontp = getFont(LLFontDescriptor("SansSerif","Medium",0)); +	return fontp;  }  //static  LLFontGL* LLFontGL::getFontSansSerifBig()  { -	return getFont(LLFontDescriptor("SansSerif","Large",0)); +	static LLFontGL* fontp = getFont(LLFontDescriptor("SansSerif","Large",0)); +	return fontp;  }  //static   LLFontGL* LLFontGL::getFontSansSerifHuge()  { -	return getFont(LLFontDescriptor("SansSerif","Huge",0)); +	static LLFontGL* fontp = getFont(LLFontDescriptor("SansSerif","Large",0)); +	return fontp;  }  //static   LLFontGL* LLFontGL::getFontSansSerifBold()  { -	return getFont(LLFontDescriptor("SansSerif","Medium",BOLD)); +	static LLFontGL* fontp = getFont(LLFontDescriptor("SansSerif","Medium",BOLD)); +	return fontp;  }  //static diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp index 64238b2008..eb2c54198d 100644 --- a/indra/llrender/llrender.cpp +++ b/indra/llrender/llrender.cpp @@ -901,7 +901,7 @@ LLVector3 LLRender::getUITranslation()  {  	if (mUIOffset.empty())  	{ -		llerrs << "UI offset stack empty." << llendl; +		return LLVector3::zero;  	}  	return mUIOffset.back();  } @@ -910,7 +910,7 @@ LLVector3 LLRender::getUIScale()  {  	if (mUIScale.empty())  	{ -		llerrs << "UI scale stack empty." << llendl; +		return LLVector3(1.f, 1.f, 1.f);  	}  	return mUIScale.back();  } diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp index bb43c19c2c..d356f061f9 100644 --- a/indra/llui/llscrolllistctrl.cpp +++ b/indra/llui/llscrolllistctrl.cpp @@ -543,23 +543,7 @@ BOOL LLScrollListCtrl::addItem( LLScrollListItem* item, EAddPosition pos, BOOL r  			setNeedsSort();  			break; -		case ADD_SORTED: -			{ -				// sort by column 0, in ascending order -				std::vector<sort_column_t> single_sort_column; -				single_sort_column.push_back(std::make_pair(0, TRUE)); - -				mItemList.push_back(item); -				std::stable_sort( -					mItemList.begin(),  -					mItemList.end(),  -					SortScrollListItem(single_sort_column,mSortCallback)); -				 -				// ADD_SORTED just sorts by first column... -				// this might not match user sort criteria, so flag list as being in unsorted state -				setNeedsSort(); -				break; -			}	 +		case ADD_DEFAULT:  		case ADD_BOTTOM:  			mItemList.push_back(item);  			setNeedsSort(); @@ -2770,9 +2754,10 @@ LLScrollListColumn* LLScrollListCtrl::getColumn(const std::string& name)  	return NULL;  } - +LLFastTimer::DeclareTimer FTM_ADD_SCROLLLIST_ELEMENT("Add Scroll List Item");  LLScrollListItem* LLScrollListCtrl::addElement(const LLSD& element, EAddPosition pos, void* userdata)  { +	LLFastTimer _(FTM_ADD_SCROLLLIST_ELEMENT);  	LLScrollListItem::Params item_params;  	LLParamSDParser::instance().readSD(element, item_params);  	item_params.userdata = userdata; @@ -2781,12 +2766,14 @@ LLScrollListItem* LLScrollListCtrl::addElement(const LLSD& element, EAddPosition  LLScrollListItem* LLScrollListCtrl::addRow(const LLScrollListItem::Params& item_p, EAddPosition pos)  { +	LLFastTimer _(FTM_ADD_SCROLLLIST_ELEMENT);  	LLScrollListItem *new_item = new LLScrollListItem(item_p);  	return addRow(new_item, item_p, pos);  }  LLScrollListItem* LLScrollListCtrl::addRow(LLScrollListItem *new_item, const LLScrollListItem::Params& item_p, EAddPosition pos)  { +	LLFastTimer _(FTM_ADD_SCROLLLIST_ELEMENT);  	if (!item_p.validateBlock() || !new_item) return NULL;  	new_item->setNumColumns(mColumns.size()); diff --git a/indra/llui/llsdparam.cpp b/indra/llui/llsdparam.cpp index 4bb45a3065..7d37127584 100644 --- a/indra/llui/llsdparam.cpp +++ b/indra/llui/llsdparam.cpp @@ -43,33 +43,16 @@ LLParamSDParser::LLParamSDParser()  {  	using boost::bind; -	registerParserFuncs<S32>(bind(&LLParamSDParser::readTypedValue<S32>, this, _1, &LLSD::asInteger), -							bind(&LLParamSDParser::writeTypedValue<S32>, this, _1, _2)); -	registerParserFuncs<U32>(bind(&LLParamSDParser::readTypedValue<U32>, this, _1, &LLSD::asInteger), -							bind(&LLParamSDParser::writeU32Param, this, _1, _2)); -	registerParserFuncs<F32>(bind(&LLParamSDParser::readTypedValue<F32>, this, _1, &LLSD::asReal), -							bind(&LLParamSDParser::writeTypedValue<F32>, this, _1, _2)); -	registerParserFuncs<F64>(bind(&LLParamSDParser::readTypedValue<F64>, this, _1, &LLSD::asReal), -							bind(&LLParamSDParser::writeTypedValue<F64>, this, _1, _2)); -	registerParserFuncs<bool>(bind(&LLParamSDParser::readTypedValue<F32>, this, _1, &LLSD::asBoolean), -							bind(&LLParamSDParser::writeTypedValue<F32>, this, _1, _2)); -	registerParserFuncs<std::string>(bind(&LLParamSDParser::readTypedValue<std::string>, this, _1, &LLSD::asString), -							bind(&LLParamSDParser::writeTypedValue<std::string>, this, _1, _2)); -	registerParserFuncs<LLUUID>(bind(&LLParamSDParser::readTypedValue<LLUUID>, this, _1, &LLSD::asUUID), -							bind(&LLParamSDParser::writeTypedValue<LLUUID>, this, _1, _2)); -	registerParserFuncs<LLDate>(bind(&LLParamSDParser::readTypedValue<LLDate>, this, _1, &LLSD::asDate), -							bind(&LLParamSDParser::writeTypedValue<LLDate>, this, _1, _2)); -	registerParserFuncs<LLURI>(bind(&LLParamSDParser::readTypedValue<LLURI>, this, _1, &LLSD::asURI), -							bind(&LLParamSDParser::writeTypedValue<LLURI>, this, _1, _2)); -	registerParserFuncs<LLSD>(bind(&LLParamSDParser::readSDParam, this, _1), -							bind(&LLParamSDParser::writeTypedValue<LLSD>, this, _1, _2)); -} - -bool LLParamSDParser::readSDParam(void* value_ptr) -{ -	if (!mCurReadSD) return false; -	*((LLSD*)value_ptr) = *mCurReadSD; -	return true; +	registerParserFuncs<S32>(readS32, bind(&LLParamSDParser::writeTypedValue<S32>, this, _1, _2)); +	registerParserFuncs<U32>(readU32, bind(&LLParamSDParser::writeU32Param, this, _1, _2)); +	registerParserFuncs<F32>(readF32, bind(&LLParamSDParser::writeTypedValue<F32>, this, _1, _2)); +	registerParserFuncs<F64>(readF64, bind(&LLParamSDParser::writeTypedValue<F64>, this, _1, _2)); +	registerParserFuncs<bool>(readBool, bind(&LLParamSDParser::writeTypedValue<F32>, this, _1, _2)); +	registerParserFuncs<std::string>(readString, bind(&LLParamSDParser::writeTypedValue<std::string>, this, _1, _2)); +	registerParserFuncs<LLUUID>(readUUID, bind(&LLParamSDParser::writeTypedValue<LLUUID>, this, _1, _2)); +	registerParserFuncs<LLDate>(readDate, bind(&LLParamSDParser::writeTypedValue<LLDate>, this, _1, _2)); +	registerParserFuncs<LLURI>(readURI, bind(&LLParamSDParser::writeTypedValue<LLURI>, this, _1, _2)); +	registerParserFuncs<LLSD>(readSD, bind(&LLParamSDParser::writeTypedValue<LLSD>, this, _1, _2));  }  // special case handling of U32 due to ambiguous LLSD::assign overload @@ -148,3 +131,82 @@ LLSD* LLParamSDParser::getSDWriteNode(const parser_t::name_stack_t& name_stack)  	return mWriteSD;  } +bool LLParamSDParser::readS32(Parser& parser, void* val_ptr) +{ +	LLParamSDParser& self = static_cast<LLParamSDParser&>(parser); + +    *((S32*)val_ptr) = self.mCurReadSD->asInteger(); +    return true; +} + +bool LLParamSDParser::readU32(Parser& parser, void* val_ptr) +{ +	LLParamSDParser& self = static_cast<LLParamSDParser&>(parser); + +    *((U32*)val_ptr) = self.mCurReadSD->asInteger(); +    return true; +} + +bool LLParamSDParser::readF32(Parser& parser, void* val_ptr) +{ +	LLParamSDParser& self = static_cast<LLParamSDParser&>(parser); + +    *((F32*)val_ptr) = self.mCurReadSD->asReal(); +    return true; +} + +bool LLParamSDParser::readF64(Parser& parser, void* val_ptr) +{ +	LLParamSDParser& self = static_cast<LLParamSDParser&>(parser); + +    *((F64*)val_ptr) = self.mCurReadSD->asReal(); +    return true; +} + +bool LLParamSDParser::readBool(Parser& parser, void* val_ptr) +{ +	LLParamSDParser& self = static_cast<LLParamSDParser&>(parser); + +    *((bool*)val_ptr) = self.mCurReadSD->asBoolean(); +    return true; +} + +bool LLParamSDParser::readString(Parser& parser, void* val_ptr) +{ +	LLParamSDParser& self = static_cast<LLParamSDParser&>(parser); + +	*((std::string*)val_ptr) = self.mCurReadSD->asString(); +    return true; +} + +bool LLParamSDParser::readUUID(Parser& parser, void* val_ptr) +{ +	LLParamSDParser& self = static_cast<LLParamSDParser&>(parser); + +	*((LLUUID*)val_ptr) = self.mCurReadSD->asUUID(); +    return true; +} + +bool LLParamSDParser::readDate(Parser& parser, void* val_ptr) +{ +	LLParamSDParser& self = static_cast<LLParamSDParser&>(parser); + +	*((LLDate*)val_ptr) = self.mCurReadSD->asDate(); +    return true; +} + +bool LLParamSDParser::readURI(Parser& parser, void* val_ptr) +{ +	LLParamSDParser& self = static_cast<LLParamSDParser&>(parser); + +	*((LLURI*)val_ptr) = self.mCurReadSD->asURI(); +    return true; +} + +bool LLParamSDParser::readSD(Parser& parser, void* val_ptr) +{ +	LLParamSDParser& self = static_cast<LLParamSDParser&>(parser); + +	*((LLSD*)val_ptr) = *self.mCurReadSD; +    return true; +} diff --git a/indra/llui/llsdparam.h b/indra/llui/llsdparam.h index 12f28f876f..71b0a45630 100644 --- a/indra/llui/llsdparam.h +++ b/indra/llui/llsdparam.h @@ -79,9 +79,19 @@ private:  	LLSD* getSDWriteNode(const parser_t::name_stack_t& name_stack); -	bool readSDParam(void* value_ptr);  	bool writeU32Param(const void* value_ptr, const parser_t::name_stack_t& name_stack); +	static bool readS32(Parser& parser, void* val_ptr); +	static bool readU32(Parser& parser, void* val_ptr); +	static bool readF32(Parser& parser, void* val_ptr); +	static bool readF64(Parser& parser, void* val_ptr); +	static bool readBool(Parser& parser, void* val_ptr); +	static bool readString(Parser& parser, void* val_ptr); +	static bool readUUID(Parser& parser, void* val_ptr); +	static bool readDate(Parser& parser, void* val_ptr); +	static bool readURI(Parser& parser, void* val_ptr); +	static bool readSD(Parser& parser, void* val_ptr); +  	Parser::name_stack_t	mNameStack;  	const LLSD*				mCurReadSD;  	LLSD*					mWriteSD; diff --git a/indra/llui/lluictrlfactory.cpp b/indra/llui/lluictrlfactory.cpp index a46d961709..c5bd6c7fce 100644 --- a/indra/llui/lluictrlfactory.cpp +++ b/indra/llui/lluictrlfactory.cpp @@ -99,10 +99,11 @@ void LLUICtrlFactory::loadWidgetTemplate(const std::string& widget_tag, LLInitPa  	std::string filename = std::string("widgets") + gDirUtilp->getDirDelimiter() + widget_tag + ".xml";  	LLXMLNodePtr root_node; -	if (LLUICtrlFactory::getLayeredXMLNode(filename, root_node)) +	std::string full_filename = gDirUtilp->findSkinnedFilename(LLUI::getXUIPaths().front(), filename); +	if (!full_filename.empty())  	{ -		LLUICtrlFactory::instance().pushFileName(filename); -		LLXUIParser::instance().readXUI(root_node, block, filename); +		LLUICtrlFactory::instance().pushFileName(full_filename); +		LLSimpleXUIParser::instance().readXUI(full_filename, block);  		LLUICtrlFactory::instance().popFileName();  	}  } diff --git a/indra/llui/lluistring.cpp b/indra/llui/lluistring.cpp index ac9e71665f..e343df0063 100644 --- a/indra/llui/lluistring.cpp +++ b/indra/llui/lluistring.cpp @@ -40,7 +40,7 @@ LLFastTimer::DeclareTimer FTM_UI_STRING("UI String");  LLUIString::LLUIString(const std::string& instring, const LLStringUtil::format_map_t& args)  :	mOrig(instring), -	mArgs(args) +	mArgs(new LLStringUtil::format_map_t(args))  {  	dirty();  } @@ -54,7 +54,7 @@ void LLUIString::assign(const std::string& s)  void LLUIString::setArgList(const LLStringUtil::format_map_t& args)  { -	mArgs = args; +	getArgs() = args;  	dirty();  } @@ -74,7 +74,7 @@ void LLUIString::setArgs(const LLSD& sd)  void LLUIString::setArg(const std::string& key, const std::string& replacement)  { -	mArgs[key] = replacement; +	getArgs()[key] = replacement;  	dirty();  } @@ -135,14 +135,14 @@ void LLUIString::updateResult() const  	mResult = mOrig;  	// get the defailt args + local args -	if (mArgs.empty()) +	if (!mArgs || mArgs->empty())  	{  		LLStringUtil::format(mResult, LLTrans::getDefaultArgs());  	}  	else  	{  		LLStringUtil::format_map_t combined_args = LLTrans::getDefaultArgs(); -		combined_args.insert(mArgs.begin(), mArgs.end()); +		combined_args.insert(mArgs->begin(), mArgs->end());  		LLStringUtil::format(mResult, combined_args);  	}  } @@ -153,3 +153,12 @@ void LLUIString::updateWResult() const  	mWResult = utf8str_to_wstring(getUpdatedResult());  } + +LLStringUtil::format_map_t& LLUIString::getArgs() +{ +	if (!mArgs) +	{ +		mArgs = new LLStringUtil::format_map_t; +	} +	return *mArgs; +} diff --git a/indra/llui/lluistring.h b/indra/llui/lluistring.h index 32cfc0d9cd..3f91856e26 100644 --- a/indra/llui/lluistring.h +++ b/indra/llui/lluistring.h @@ -64,9 +64,9 @@ class LLUIString  public:  	// These methods all perform appropriate argument substitution  	// and modify mOrig where appropriate -        LLUIString() : mNeedsResult(false), mNeedsWResult(false) {} +        LLUIString() : mArgs(NULL), mNeedsResult(false), mNeedsWResult(false) {}  	LLUIString(const std::string& instring, const LLStringUtil::format_map_t& args); -	LLUIString(const std::string& instring) { assign(instring); } +	LLUIString(const std::string& instring) : mArgs(NULL) { assign(instring); }  	void assign(const std::string& instring);  	LLUIString& operator=(const std::string& s) { assign(s); return *this; } @@ -86,7 +86,7 @@ public:  	S32 length() const { return getUpdatedWResult().size(); }  	void clear(); -	void clearArgs() { mArgs.clear(); } +	void clearArgs() { if (mArgs) mArgs->clear(); }  	// These utility functions are included for text editing.  	// They do not affect mOrig and do not perform argument substitution @@ -105,11 +105,12 @@ private:  	// do actual work of updating strings (non-inlined)  	void updateResult() const;  	void updateWResult() const; +	LLStringUtil::format_map_t& getArgs();  	std::string mOrig;  	mutable std::string mResult;  	mutable LLWString mWResult; // for displaying -	LLStringUtil::format_map_t mArgs; +	LLStringUtil::format_map_t* mArgs;  	// controls lazy evaluation  	mutable bool	mNeedsResult; diff --git a/indra/llxuixml/llinitparam.h b/indra/llxuixml/llinitparam.h index b645c4be7c..9890bacea4 100644 --- a/indra/llxuixml/llinitparam.h +++ b/indra/llxuixml/llinitparam.h @@ -40,6 +40,7 @@ f * @file llinitparam.h  #include <boost/function.hpp>  #include <boost/bind.hpp>  #include <boost/type_traits/is_convertible.hpp> +#include <boost/unordered_map.hpp>  #include "llregistry.h"  #include "llmemory.h" @@ -202,7 +203,7 @@ namespace LLInitParam  		typedef std::pair<name_stack_t::const_iterator, name_stack_t::const_iterator>	name_stack_range_t;  		typedef std::vector<std::string>							possible_values_t; -		typedef boost::function<bool (void*)>															parser_read_func_t; +		typedef bool (*parser_read_func_t)(Parser& parser, void* output);  		typedef boost::function<bool (const void*, const name_stack_t&)>								parser_write_func_t;  		typedef boost::function<void (const name_stack_t&, S32, S32, const possible_values_t*)>	parser_inspect_func_t; @@ -221,7 +222,7 @@ namespace LLInitParam  		    parser_read_func_map_t::iterator found_it = mParserReadFuncs.find(&typeid(T));  		    if (found_it != mParserReadFuncs.end())  		    { -			    return found_it->second((void*)¶m); +			    return found_it->second(*this, (void*)¶m);  		    }  		    return false;  	    } @@ -386,7 +387,7 @@ namespace LLInitParam  		void aggregateBlockData(BlockDescriptor& src_block_data);  	public: -		typedef std::map<const std::string, ParamDescriptor*> param_map_t; // references param descriptors stored in mAllParams +		typedef boost::unordered_map<const std::string, ParamDescriptor*> param_map_t; // references param descriptors stored in mAllParams  		typedef std::vector<ParamDescriptor*> param_list_t;   		typedef std::list<ParamDescriptor> all_params_list_t;// references param descriptors stored in mAllParams diff --git a/indra/llxuixml/llxuiparser.cpp b/indra/llxuixml/llxuiparser.cpp index dbc20a5a1e..d856efb008 100644 --- a/indra/llxuixml/llxuiparser.cpp +++ b/indra/llxuixml/llxuiparser.cpp @@ -35,11 +35,16 @@  #include "llxuiparser.h"  #include "llxmlnode.h" +#include "expat/expat.h"  #include <fstream>  #include <boost/tokenizer.hpp> +//#include <boost/spirit/include/qi.hpp> +#include <boost/spirit/include/classic_core.hpp>  #include "lluicolor.h" +using namespace BOOST_SPIRIT_CLASSIC_NS; +  const S32 MAX_STRING_ATTRIBUTE_SIZE = 40;  // @@ -370,34 +375,20 @@ LLXUIParser::LLXUIParser()  :	mLastWriteGeneration(-1),  	mCurReadDepth(0)  { -	registerParserFuncs<bool>(boost::bind(&LLXUIParser::readBoolValue, this, _1), -								boost::bind(&LLXUIParser::writeBoolValue, this, _1, _2)); -	registerParserFuncs<std::string>(boost::bind(&LLXUIParser::readStringValue, this, _1), -								boost::bind(&LLXUIParser::writeStringValue, this, _1, _2)); -	registerParserFuncs<U8>(boost::bind(&LLXUIParser::readU8Value, this, _1), -								boost::bind(&LLXUIParser::writeU8Value, this, _1, _2)); -	registerParserFuncs<S8>(boost::bind(&LLXUIParser::readS8Value, this, _1), -								boost::bind(&LLXUIParser::writeS8Value, this, _1, _2)); -	registerParserFuncs<U16>(boost::bind(&LLXUIParser::readU16Value, this, _1), -								boost::bind(&LLXUIParser::writeU16Value, this, _1, _2)); -	registerParserFuncs<S16>(boost::bind(&LLXUIParser::readS16Value, this, _1), -								boost::bind(&LLXUIParser::writeS16Value, this, _1, _2)); -	registerParserFuncs<U32>(boost::bind(&LLXUIParser::readU32Value, this, _1), -								boost::bind(&LLXUIParser::writeU32Value, this, _1, _2)); -	registerParserFuncs<S32>(boost::bind(&LLXUIParser::readS32Value, this, _1), -								boost::bind(&LLXUIParser::writeS32Value, this, _1, _2)); -	registerParserFuncs<F32>(boost::bind(&LLXUIParser::readF32Value, this, _1), -								boost::bind(&LLXUIParser::writeF32Value, this, _1, _2)); -	registerParserFuncs<F64>(boost::bind(&LLXUIParser::readF64Value, this, _1), -								boost::bind(&LLXUIParser::writeF64Value, this, _1, _2)); -	registerParserFuncs<LLColor4>(boost::bind(&LLXUIParser::readColor4Value, this, _1), -								boost::bind(&LLXUIParser::writeColor4Value, this, _1, _2)); -	registerParserFuncs<LLUIColor>(boost::bind(&LLXUIParser::readUIColorValue, this, _1), -								boost::bind(&LLXUIParser::writeUIColorValue, this, _1, _2)); -	registerParserFuncs<LLUUID>(boost::bind(&LLXUIParser::readUUIDValue, this, _1), -								boost::bind(&LLXUIParser::writeUUIDValue, this, _1, _2)); -	registerParserFuncs<LLSD>(boost::bind(&LLXUIParser::readSDValue, this, _1), -								boost::bind(&LLXUIParser::writeSDValue, this, _1, _2)); +	registerParserFuncs<bool>(readBoolValue, boost::bind(&LLXUIParser::writeBoolValue, this, _1, _2)); +	registerParserFuncs<std::string>(readStringValue, boost::bind(&LLXUIParser::writeStringValue, this, _1, _2)); +	registerParserFuncs<U8>(readU8Value, boost::bind(&LLXUIParser::writeU8Value, this, _1, _2)); +	registerParserFuncs<S8>(readS8Value, boost::bind(&LLXUIParser::writeS8Value, this, _1, _2)); +	registerParserFuncs<U16>(readU16Value, boost::bind(&LLXUIParser::writeU16Value, this, _1, _2)); +	registerParserFuncs<S16>(readS16Value, boost::bind(&LLXUIParser::writeS16Value, this, _1, _2)); +	registerParserFuncs<U32>(readU32Value, boost::bind(&LLXUIParser::writeU32Value, this, _1, _2)); +	registerParserFuncs<S32>(readS32Value, boost::bind(&LLXUIParser::writeS32Value, this, _1, _2)); +	registerParserFuncs<F32>(readF32Value, boost::bind(&LLXUIParser::writeF32Value, this, _1, _2)); +	registerParserFuncs<F64>(readF64Value, boost::bind(&LLXUIParser::writeF64Value, this, _1, _2)); +	registerParserFuncs<LLColor4>(readColor4Value, boost::bind(&LLXUIParser::writeColor4Value, this, _1, _2)); +	registerParserFuncs<LLUIColor>(readUIColorValue, boost::bind(&LLXUIParser::writeUIColorValue, this, _1, _2)); +	registerParserFuncs<LLUUID>(readUUIDValue, boost::bind(&LLXUIParser::writeUUIDValue, this, _1, _2)); +	registerParserFuncs<LLSD>(readSDValue, boost::bind(&LLXUIParser::writeSDValue, this, _1, _2));  }  static LLFastTimer::DeclareTimer FTM_PARSE_XUI("XUI Parsing"); @@ -621,10 +612,11 @@ LLXMLNodePtr LLXUIParser::getNode(const name_stack_t& stack)  } -bool LLXUIParser::readBoolValue(void* val_ptr) +bool LLXUIParser::readBoolValue(Parser& parser, void* val_ptr)  {  	S32 value; -	bool success = mCurReadNode->getBoolValue(1, &value); +	LLXUIParser& self = static_cast<LLXUIParser&>(parser); +	bool success = self.mCurReadNode->getBoolValue(1, &value);  	*((bool*)val_ptr) = (value != FALSE);  	return success;  } @@ -640,9 +632,10 @@ bool LLXUIParser::writeBoolValue(const void* val_ptr, const name_stack_t& stack)  	return false;  } -bool LLXUIParser::readStringValue(void* val_ptr) +bool LLXUIParser::readStringValue(Parser& parser, void* val_ptr)  { -	*((std::string*)val_ptr) = mCurReadNode->getSanitizedValue(); +	LLXUIParser& self = static_cast<LLXUIParser&>(parser); +	*((std::string*)val_ptr) = self.mCurReadNode->getSanitizedValue();  	return true;  } @@ -677,9 +670,10 @@ bool LLXUIParser::writeStringValue(const void* val_ptr, const name_stack_t& stac  	return false;  } -bool LLXUIParser::readU8Value(void* val_ptr) +bool LLXUIParser::readU8Value(Parser& parser, void* val_ptr)  { -	return mCurReadNode->getByteValue(1, (U8*)val_ptr); +	LLXUIParser& self = static_cast<LLXUIParser&>(parser); +	return self.mCurReadNode->getByteValue(1, (U8*)val_ptr);  }  bool LLXUIParser::writeU8Value(const void* val_ptr, const name_stack_t& stack) @@ -693,10 +687,11 @@ bool LLXUIParser::writeU8Value(const void* val_ptr, const name_stack_t& stack)  	return false;  } -bool LLXUIParser::readS8Value(void* val_ptr) +bool LLXUIParser::readS8Value(Parser& parser, void* val_ptr)  { +	LLXUIParser& self = static_cast<LLXUIParser&>(parser);  	S32 value; -	if(mCurReadNode->getIntValue(1, &value)) +	if(self.mCurReadNode->getIntValue(1, &value))  	{  		*((S8*)val_ptr) = value;  		return true; @@ -715,10 +710,11 @@ bool LLXUIParser::writeS8Value(const void* val_ptr, const name_stack_t& stack)  	return false;  } -bool LLXUIParser::readU16Value(void* val_ptr) +bool LLXUIParser::readU16Value(Parser& parser, void* val_ptr)  { +	LLXUIParser& self = static_cast<LLXUIParser&>(parser);  	U32 value; -	if(mCurReadNode->getUnsignedValue(1, &value)) +	if(self.mCurReadNode->getUnsignedValue(1, &value))  	{  		*((U16*)val_ptr) = value;  		return true; @@ -737,10 +733,11 @@ bool LLXUIParser::writeU16Value(const void* val_ptr, const name_stack_t& stack)  	return false;  } -bool LLXUIParser::readS16Value(void* val_ptr) +bool LLXUIParser::readS16Value(Parser& parser, void* val_ptr)  { +	LLXUIParser& self = static_cast<LLXUIParser&>(parser);  	S32 value; -	if(mCurReadNode->getIntValue(1, &value)) +	if(self.mCurReadNode->getIntValue(1, &value))  	{  		*((S16*)val_ptr) = value;  		return true; @@ -759,9 +756,10 @@ bool LLXUIParser::writeS16Value(const void* val_ptr, const name_stack_t& stack)  	return false;  } -bool LLXUIParser::readU32Value(void* val_ptr) +bool LLXUIParser::readU32Value(Parser& parser, void* val_ptr)  { -	return mCurReadNode->getUnsignedValue(1, (U32*)val_ptr); +	LLXUIParser& self = static_cast<LLXUIParser&>(parser); +	return self.mCurReadNode->getUnsignedValue(1, (U32*)val_ptr);  }  bool LLXUIParser::writeU32Value(const void* val_ptr, const name_stack_t& stack) @@ -775,9 +773,10 @@ bool LLXUIParser::writeU32Value(const void* val_ptr, const name_stack_t& stack)  	return false;  } -bool LLXUIParser::readS32Value(void* val_ptr) +bool LLXUIParser::readS32Value(Parser& parser, void* val_ptr)  { -	return mCurReadNode->getIntValue(1, (S32*)val_ptr); +	LLXUIParser& self = static_cast<LLXUIParser&>(parser); +	return self.mCurReadNode->getIntValue(1, (S32*)val_ptr);  }  bool LLXUIParser::writeS32Value(const void* val_ptr, const name_stack_t& stack) @@ -791,9 +790,10 @@ bool LLXUIParser::writeS32Value(const void* val_ptr, const name_stack_t& stack)  	return false;  } -bool LLXUIParser::readF32Value(void* val_ptr) +bool LLXUIParser::readF32Value(Parser& parser, void* val_ptr)  { -	return mCurReadNode->getFloatValue(1, (F32*)val_ptr); +	LLXUIParser& self = static_cast<LLXUIParser&>(parser); +	return self.mCurReadNode->getFloatValue(1, (F32*)val_ptr);  }  bool LLXUIParser::writeF32Value(const void* val_ptr, const name_stack_t& stack) @@ -807,9 +807,10 @@ bool LLXUIParser::writeF32Value(const void* val_ptr, const name_stack_t& stack)  	return false;  } -bool LLXUIParser::readF64Value(void* val_ptr) +bool LLXUIParser::readF64Value(Parser& parser, void* val_ptr)  { -	return mCurReadNode->getDoubleValue(1, (F64*)val_ptr); +	LLXUIParser& self = static_cast<LLXUIParser&>(parser); +	return self.mCurReadNode->getDoubleValue(1, (F64*)val_ptr);  }  bool LLXUIParser::writeF64Value(const void* val_ptr, const name_stack_t& stack) @@ -823,10 +824,11 @@ bool LLXUIParser::writeF64Value(const void* val_ptr, const name_stack_t& stack)  	return false;  } -bool LLXUIParser::readColor4Value(void* val_ptr) +bool LLXUIParser::readColor4Value(Parser& parser, void* val_ptr)  { +	LLXUIParser& self = static_cast<LLXUIParser&>(parser);  	LLColor4* colorp = (LLColor4*)val_ptr; -	if(mCurReadNode->getFloatValue(4, colorp->mV) >= 3) +	if(self.mCurReadNode->getFloatValue(4, colorp->mV) >= 3)  	{  		return true;  	} @@ -846,11 +848,12 @@ bool LLXUIParser::writeColor4Value(const void* val_ptr, const name_stack_t& stac  	return false;  } -bool LLXUIParser::readUIColorValue(void* val_ptr) +bool LLXUIParser::readUIColorValue(Parser& parser, void* val_ptr)  { +	LLXUIParser& self = static_cast<LLXUIParser&>(parser);  	LLUIColor* param = (LLUIColor*)val_ptr;  	LLColor4 color; -	bool success =  mCurReadNode->getFloatValue(4, color.mV) >= 3; +	bool success =  self.mCurReadNode->getFloatValue(4, color.mV) >= 3;  	if (success)  	{  		param->set(color); @@ -874,11 +877,12 @@ bool LLXUIParser::writeUIColorValue(const void* val_ptr, const name_stack_t& sta  	return false;  } -bool LLXUIParser::readUUIDValue(void* val_ptr) +bool LLXUIParser::readUUIDValue(Parser& parser, void* val_ptr)  { +	LLXUIParser& self = static_cast<LLXUIParser&>(parser);  	LLUUID temp_id;  	// LLUUID::set is destructive, so use temporary value -	if (temp_id.set(mCurReadNode->getSanitizedValue())) +	if (temp_id.set(self.mCurReadNode->getSanitizedValue()))  	{  		*(LLUUID*)(val_ptr) = temp_id;  		return true; @@ -897,9 +901,10 @@ bool LLXUIParser::writeUUIDValue(const void* val_ptr, const name_stack_t& stack)  	return false;  } -bool LLXUIParser::readSDValue(void* val_ptr) +bool LLXUIParser::readSDValue(Parser& parser, void* val_ptr)  { -	*((LLSD*)val_ptr) = LLSD(mCurReadNode->getSanitizedValue()); +	LLXUIParser& self = static_cast<LLXUIParser&>(parser); +	*((LLSD*)val_ptr) = LLSD(self.mCurReadNode->getSanitizedValue());  	return true;  } @@ -968,3 +973,411 @@ void LLXUIParser::parserError(const std::string& message)  	Parser::parserError(message);  #endif  } + + +// +// LLSimpleXUIParser +// + +struct ScopedFile +{ +	ScopedFile( const std::string& filename, const char* accessmode ) +	{ +		mFile = LLFile::fopen(filename, accessmode); +	} + +	~ScopedFile() +	{ +		fclose(mFile); +		mFile = NULL; +	} + +	S32 getRemainingBytes() +	{ +		if (!isOpen()) return 0; + +		S32 cur_pos = ftell(mFile); +		fseek(mFile, 0L, SEEK_END); +		S32 file_size = ftell(mFile); +		fseek(mFile, cur_pos, SEEK_SET); +		return file_size - cur_pos; +	} + +	bool isOpen() { return mFile != NULL; } + +	LLFILE* mFile; +}; + +LLSimpleXUIParser::LLSimpleXUIParser() +:	mLastWriteGeneration(-1), +	mCurReadDepth(0) +{ +	registerParserFuncs<bool>(readBoolValue, NULL); +	registerParserFuncs<std::string>(readStringValue, NULL); +	registerParserFuncs<U8>(readU8Value, NULL); +	registerParserFuncs<S8>(readS8Value, NULL); +	registerParserFuncs<U16>(readU16Value, NULL); +	registerParserFuncs<S16>(readS16Value, NULL); +	registerParserFuncs<U32>(readU32Value, NULL); +	registerParserFuncs<S32>(readS32Value, NULL); +	registerParserFuncs<F32>(readF32Value, NULL); +	registerParserFuncs<F64>(readF64Value, NULL); +	registerParserFuncs<LLColor4>(readColor4Value, NULL); +	registerParserFuncs<LLUIColor>(readUIColorValue, NULL); +	registerParserFuncs<LLUUID>(readUUIDValue, NULL); +	registerParserFuncs<LLSD>(readSDValue, NULL); +} + +LLSimpleXUIParser::~LLSimpleXUIParser() +{ +} + + +bool LLSimpleXUIParser::readXUI(const std::string& filename, LLInitParam::BaseBlock& block, bool silent) +{ +	LLFastTimer timer(FTM_PARSE_XUI); + +	mParser = XML_ParserCreate(NULL); +	XML_SetUserData(mParser, this); +	XML_SetElementHandler(			mParser,	startElementHandler, endElementHandler); +	XML_SetCharacterDataHandler(	mParser,	characterDataHandler); + +	mBlock = █ +	mNameStack.clear(); +	mCurFileName = filename; +	mCurReadDepth = 0; +	setParseSilently(silent); + +	ScopedFile file(filename, "rb"); +	if( !file.isOpen() ) +	{ +		LL_WARNS("ReadXUI") << "Unable to open file " << filename << LL_ENDL; +		return false; +	} + +	S32 bytes_read = 0; +	 +	S32 buffer_size = file.getRemainingBytes(); +	void* buffer = XML_GetBuffer(mParser, buffer_size); +	if( !buffer )  +	{ +		LL_WARNS("ReadXUI") << "Unable to allocate XML buffer while reading file " << filename << LL_ENDL; +		XML_ParserFree( mParser ); +		return false; +	} + +	bytes_read = (S32)fread(buffer, 1, buffer_size, file.mFile); +	if( bytes_read <= 0 ) +	{ +		LL_WARNS("ReadXUI") << "Error while reading file  " << filename << LL_ENDL; +		XML_ParserFree( mParser ); +		return false; +	} +	 +	if( !XML_ParseBuffer(mParser, bytes_read, TRUE ) ) +	{ +		LL_WARNS("ReadXUI") << "Error while parsing file  " << filename << LL_ENDL; +		XML_ParserFree( mParser ); +		return false; +	} + +	XML_ParserFree( mParser ); +	return true; +} + +void LLSimpleXUIParser::startElementHandler(void *userData, const char *name, const char **atts) +{ +	LLSimpleXUIParser* self = reinterpret_cast<LLSimpleXUIParser*>(userData); +	self->startElement(name, atts); +} + +void LLSimpleXUIParser::endElementHandler(void *userData, const char *name) +{ +	LLSimpleXUIParser* self = reinterpret_cast<LLSimpleXUIParser*>(userData); +	self->endElement(name); +} + +void LLSimpleXUIParser::characterDataHandler(void *userData, const char *s, int len) +{ +	LLSimpleXUIParser* self = reinterpret_cast<LLSimpleXUIParser*>(userData); +	self->characterData(s, len); +} + +void LLSimpleXUIParser::startElement(const char *name, const char **atts) +{ +	typedef boost::tokenizer<boost::char_separator<char> > tokenizer; +	boost::char_separator<char> sep("."); + +	mCurReadDepth++; +	S32 num_tokens_pushed = 0; +	std::string child_name(name); + +	if (mCurReadDepth > 1) +	{ +		// for non "dotted" child nodes	check to see if child node maps to another widget type +		// and if not, treat as a child element of the current node +		// e.g. <button><rect left="10"/></button> will interpret <rect> as "button.rect" +		// since there is no widget named "rect" +		if (child_name.find(".") == std::string::npos)  +		{ +			mNameStack.push_back(std::make_pair(child_name, newParseGeneration())); +			num_tokens_pushed++; +			mScope.push_back(child_name); +		} +		else +		{ +			// parse out "dotted" name into individual tokens +			tokenizer name_tokens(child_name, sep); + +			tokenizer::iterator name_token_it = name_tokens.begin(); +			if(name_token_it == name_tokens.end())  +			{ +				return; +			} + +			// check for proper nesting +			if(!mScope.empty() && *name_token_it != mScope.back()) +			{ +				return; +			} + +			// now ignore first token +			++name_token_it;  + +			// copy remaining tokens on to our running token list +			for(tokenizer::iterator token_to_push = name_token_it; token_to_push != name_tokens.end(); ++token_to_push) +			{ +				mNameStack.push_back(std::make_pair(*token_to_push, newParseGeneration())); +				num_tokens_pushed++; +			} +			mScope.push_back(mNameStack.back().first); +		} +	} +	else +	{ +		mScope.push_back(child_name); +	} + +	mTokenSizeStack.push_back(num_tokens_pushed); +	readAttributes(atts); +} + +bool LLSimpleXUIParser::readAttributes(const char **atts) +{ +	typedef boost::tokenizer<boost::char_separator<char> > tokenizer; +	boost::char_separator<char> sep("."); + +	bool any_parsed = false; +	for(S32 i = 0; atts[i] && atts[i+1]; i += 2 ) +	{ +		std::string attribute_name(atts[i]); +		mCurAttributeValueBegin = atts[i+1]; +		 +		S32 num_tokens_pushed = 0; +		tokenizer name_tokens(attribute_name, sep); +		// copy remaining tokens on to our running token list +		for(tokenizer::iterator token_to_push = name_tokens.begin(); token_to_push != name_tokens.end(); ++token_to_push) +		{ +			mNameStack.push_back(std::make_pair(*token_to_push, newParseGeneration())); +			num_tokens_pushed++; +		} + +		// child nodes are not necessarily valid attributes, so don't complain once we've recursed +		bool silent = mCurReadDepth > 1; +		any_parsed |= mBlock->submitValue(mNameStack, *this, silent); +		 +		while(num_tokens_pushed-- > 0) +		{ +			mNameStack.pop_back(); +		} +	} +	return any_parsed; +} + + +void LLSimpleXUIParser::endElement(const char *name) +{ +	if (!mTextContents.empty()) +	{ +		LLStringUtil::trim(mTextContents); +		if (!mTextContents.empty()) +		{ +			mNameStack.push_back(std::make_pair(std::string("value"), newParseGeneration())); +			mCurAttributeValueBegin = mTextContents.c_str(); +			mBlock->submitValue(mNameStack, *this, false); +			mNameStack.pop_back(); +			mTextContents.clear(); +		} +	} +	mCurReadDepth--; +	S32 num_tokens_to_pop = mTokenSizeStack.back(); +	mTokenSizeStack.pop_back(); +	while(num_tokens_to_pop-- > 0) +	{ +		mNameStack.pop_back(); +	} +	mScope.pop_back(); +} + +void LLSimpleXUIParser::characterData(const char *s, int len) +{ +	mTextContents += std::string(s, len); +} + + +/*virtual*/ std::string LLSimpleXUIParser::getCurrentElementName() +{ +	std::string full_name; +	for (name_stack_t::iterator it = mNameStack.begin();	 +		it != mNameStack.end(); +		++it) +	{ +		full_name += it->first + "."; // build up dotted names: "button.param.nestedparam." +	} + +	return full_name; +} + +const S32 LINE_NUMBER_HERE = 0; + +void LLSimpleXUIParser::parserWarning(const std::string& message) +{ +#ifdef LL_WINDOWS +	// use Visual Studo friendly formatting of output message for easy access to originating xml +	llutf16string utf16str = utf8str_to_utf16str(llformat("%s(%d):\t%s", mCurFileName.c_str(), LINE_NUMBER_HERE, message.c_str()).c_str()); +	utf16str += '\n'; +	OutputDebugString(utf16str.c_str()); +#else +	Parser::parserWarning(message); +#endif +} + +void LLSimpleXUIParser::parserError(const std::string& message) +{ +#ifdef LL_WINDOWS +	llutf16string utf16str = utf8str_to_utf16str(llformat("%s(%d):\t%s", mCurFileName.c_str(), LINE_NUMBER_HERE, message.c_str()).c_str()); +	utf16str += '\n'; +	OutputDebugString(utf16str.c_str()); +#else +	Parser::parserError(message); +#endif +} + +bool LLSimpleXUIParser::readBoolValue(Parser& parser, void* val_ptr) +{ +	LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser); +	if (!strcmp(self.mCurAttributeValueBegin, "true"))  +	{ +		*((bool*)val_ptr) = true; +		return true; +	} +	else if (!strcmp(self.mCurAttributeValueBegin, "false")) +	{ +		*((bool*)val_ptr) = false; +		return true; +	} + +	return false; +} + +bool LLSimpleXUIParser::readStringValue(Parser& parser, void* val_ptr) +{ +	LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser); +	*((std::string*)val_ptr) = self.mCurAttributeValueBegin; +	return true; +} + +bool LLSimpleXUIParser::readU8Value(Parser& parser, void* val_ptr) +{ +	LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser); +	return parse(self.mCurAttributeValueBegin, uint_p[assign_a(*(U8*)val_ptr)]).full; +} + +bool LLSimpleXUIParser::readS8Value(Parser& parser, void* val_ptr) +{ +	LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser); +	return parse(self.mCurAttributeValueBegin, int_p[assign_a(*(S8*)val_ptr)]).full; +} + +bool LLSimpleXUIParser::readU16Value(Parser& parser, void* val_ptr) +{ +	LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser); +	return parse(self.mCurAttributeValueBegin, uint_p[assign_a(*(U16*)val_ptr)]).full; +} + +bool LLSimpleXUIParser::readS16Value(Parser& parser, void* val_ptr) +{ +	LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser); +	return parse(self.mCurAttributeValueBegin, int_p[assign_a(*(S16*)val_ptr)]).full; +} + +bool LLSimpleXUIParser::readU32Value(Parser& parser, void* val_ptr) +{ +	LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser); +	return parse(self.mCurAttributeValueBegin, uint_p[assign_a(*(U32*)val_ptr)]).full; +} + +bool LLSimpleXUIParser::readS32Value(Parser& parser, void* val_ptr) +{ +	LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser); +	return parse(self.mCurAttributeValueBegin, int_p[assign_a(*(S32*)val_ptr)]).full; +} + +bool LLSimpleXUIParser::readF32Value(Parser& parser, void* val_ptr) +{ +	LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser); +	return parse(self.mCurAttributeValueBegin, real_p[assign_a(*(F32*)val_ptr)]).full; +} + +bool LLSimpleXUIParser::readF64Value(Parser& parser, void* val_ptr) +{ +	LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser); +	return parse(self.mCurAttributeValueBegin, real_p[assign_a(*(F64*)val_ptr)]).full; +} +	 +bool LLSimpleXUIParser::readColor4Value(Parser& parser, void* val_ptr) +{ +	LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser); +	LLColor4 value; + +	if (parse(self.mCurAttributeValueBegin, real_p[assign_a(value.mV[0])] >> real_p[assign_a(value.mV[1])] >> real_p[assign_a(value.mV[2])] >> real_p[assign_a(value.mV[3])], space_p).full) +	{ +		*(LLColor4*)(val_ptr) = value; +		return true; +	} +	return false; +} + +bool LLSimpleXUIParser::readUIColorValue(Parser& parser, void* val_ptr) +{ +	LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser); +	LLColor4 value; +	LLUIColor* colorp = (LLUIColor*)val_ptr; + +	if (parse(self.mCurAttributeValueBegin, real_p[assign_a(value.mV[0])] >> real_p[assign_a(value.mV[1])] >> real_p[assign_a(value.mV[2])] >> real_p[assign_a(value.mV[3])], space_p).full) +	{ +		colorp->set(value); +		return true; +	} +	return false; +} + +bool LLSimpleXUIParser::readUUIDValue(Parser& parser, void* val_ptr) +{ +	LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser); +	LLUUID temp_id; +	// LLUUID::set is destructive, so use temporary value +	if (temp_id.set(std::string(self.mCurAttributeValueBegin))) +	{ +		*(LLUUID*)(val_ptr) = temp_id; +		return true; +	} +	return false; +} + +bool LLSimpleXUIParser::readSDValue(Parser& parser, void* val_ptr) +{ +	LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser); +	*((LLSD*)val_ptr) = LLSD(self.mCurAttributeValueBegin); +	return true; +} diff --git a/indra/llxuixml/llxuiparser.h b/indra/llxuixml/llxuiparser.h index 884f4f7578..eb7147f49e 100644 --- a/indra/llxuixml/llxuiparser.h +++ b/indra/llxuixml/llxuiparser.h @@ -120,26 +120,24 @@ public:  	void writeXUI(LLXMLNodePtr node, const LLInitParam::BaseBlock& block, const LLInitParam::BaseBlock* diff_block = NULL);  private: -	typedef std::list<std::pair<std::string, bool> >	token_list_t; -  	bool readXUIImpl(LLXMLNodePtr node, const std::string& scope, LLInitParam::BaseBlock& block);  	bool readAttributes(LLXMLNodePtr nodep, LLInitParam::BaseBlock& block);  	//reader helper functions -	bool readBoolValue(void* val_ptr); -	bool readStringValue(void* val_ptr); -	bool readU8Value(void* val_ptr); -	bool readS8Value(void* val_ptr); -	bool readU16Value(void* val_ptr); -	bool readS16Value(void* val_ptr); -	bool readU32Value(void* val_ptr); -	bool readS32Value(void* val_ptr); -	bool readF32Value(void* val_ptr); -	bool readF64Value(void* val_ptr); -	bool readColor4Value(void* val_ptr); -	bool readUIColorValue(void* val_ptr); -	bool readUUIDValue(void* val_ptr); -	bool readSDValue(void* val_ptr); +	static bool readBoolValue(Parser& parser, void* val_ptr); +	static bool readStringValue(Parser& parser, void* val_ptr); +	static bool readU8Value(Parser& parser, void* val_ptr); +	static bool readS8Value(Parser& parser, void* val_ptr); +	static bool readU16Value(Parser& parser, void* val_ptr); +	static bool readS16Value(Parser& parser, void* val_ptr); +	static bool readU32Value(Parser& parser, void* val_ptr); +	static bool readS32Value(Parser& parser, void* val_ptr); +	static bool readF32Value(Parser& parser, void* val_ptr); +	static bool readF64Value(Parser& parser, void* val_ptr); +	static bool readColor4Value(Parser& parser, void* val_ptr); +	static bool readUIColorValue(Parser& parser, void* val_ptr); +	static bool readUUIDValue(Parser& parser, void* val_ptr); +	static bool readSDValue(Parser& parser, void* val_ptr);  	//writer helper functions  	bool writeBoolValue(const void* val_ptr, const name_stack_t&); @@ -173,5 +171,74 @@ private:  	std::string						mCurFileName;  }; +// LLSimpleXUIParser is a streamlined SAX-based XUI parser that does not support localization  +// or parsing of a tree of independent param blocks, such as child widgets. +// Use this for reading non-localized files that only need a single param block as a result. +// +// NOTE: In order to support nested block parsing, we need callbacks for start element that +// push new blocks contexts on the mScope stack. +// NOTE: To support localization without building a DOM, we need to enforce consistent  +// ordering of child elements from base file to localized diff file.  Then we can use a pair +// of coroutines to perform matching of xml nodes during parsing.  Not sure if the overhead +// of coroutines would offset the gain from SAX parsing + +class LLSimpleXUIParser : public LLInitParam::Parser, public LLSingleton<LLSimpleXUIParser> +{ +LOG_CLASS(LLSimpleXUIParser); + +protected: +	LLSimpleXUIParser(); +	virtual ~LLSimpleXUIParser(); +	friend class LLSingleton<LLSimpleXUIParser>; +public: +	typedef LLInitParam::Parser::name_stack_t name_stack_t; + +	/*virtual*/ std::string getCurrentElementName(); +	/*virtual*/ void parserWarning(const std::string& message); +	/*virtual*/ void parserError(const std::string& message); + +	bool readXUI(const std::string& filename, LLInitParam::BaseBlock& block, bool silent=false); +	void setBlock(LLInitParam::BaseBlock* block); + +private: +	//reader helper functions +	static bool readBoolValue(Parser&, void* val_ptr); +	static bool readStringValue(Parser&, void* val_ptr); +	static bool readU8Value(Parser&, void* val_ptr); +	static bool readS8Value(Parser&, void* val_ptr); +	static bool readU16Value(Parser&, void* val_ptr); +	static bool readS16Value(Parser&, void* val_ptr); +	static bool readU32Value(Parser&, void* val_ptr); +	static bool readS32Value(Parser&, void* val_ptr); +	static bool readF32Value(Parser&, void* val_ptr); +	static bool readF64Value(Parser&, void* val_ptr); +	static bool readColor4Value(Parser&, void* val_ptr); +	static bool readUIColorValue(Parser&, void* val_ptr); +	static bool readUUIDValue(Parser&, void* val_ptr); +	static bool readSDValue(Parser&, void* val_ptr); + +private: +	static void startElementHandler(void *userData, const char *name, const char **atts); +	static void endElementHandler(void *userData, const char *name); +	static void characterDataHandler(void *userData, const char *s, int len); + +	void startElement(const char *name, const char **atts); +	void endElement(const char *name); +	void characterData(const char *s, int len); +	bool readAttributes(const char **atts); + +	LLInitParam::BaseBlock*			mBlock; +	Parser::name_stack_t			mNameStack; +	struct XML_ParserStruct*		mParser; +	S32								mLastWriteGeneration; +	LLXMLNodePtr					mLastWrittenChild; +	S32								mCurReadDepth; +	std::string						mCurFileName; +	std::string						mTextContents; +	const char*						mCurAttributeValueBegin; +	std::vector<S32>				mTokenSizeStack; +	std::vector<std::string>		mScope; +}; +  #endif //LLXUIPARSER_H diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp index 8bc3b5a75f..696ac4e6fa 100644 --- a/indra/newview/llfasttimerview.cpp +++ b/indra/newview/llfasttimerview.cpp @@ -123,7 +123,7 @@ BOOL LLFastTimerView::handleRightMouseDown(S32 x, S32 y, MASK mask)  	{  		S32 bar_idx = MAX_VISIBLE_HISTORY - ((y - mBarRect.mBottom) * (MAX_VISIBLE_HISTORY + 2) / mBarRect.getHeight());  		bar_idx = llclamp(bar_idx, 0, MAX_VISIBLE_HISTORY); -		mPrintStats = bar_idx; +		mPrintStats = LLFastTimer::NamedTimer::HISTORY_NUM - mScrollIndex - bar_idx;  	}  	return FALSE;  } @@ -140,6 +140,17 @@ LLFastTimer::NamedTimer* LLFastTimerView::getLegendID(S32 y)  	return NULL;  } +BOOL LLFastTimerView::handleDoubleClick(S32 x, S32 y, MASK mask) +{ +	for(timer_tree_iterator_t it = begin_timer_tree(LLFastTimer::NamedTimer::getRootNamedTimer()); +		it != end_timer_tree(); +		++it) +	{ +		(*it)->setCollapsed(false); +	} +	return TRUE; +} +  BOOL LLFastTimerView::handleMouseDown(S32 x, S32 y, MASK mask)  { @@ -953,7 +964,7 @@ void LLFastTimerView::draw()  			{  				legend_stat += ", ";  			} -			first = true; +			first = false;  			legend_stat += idp->getName();  			if (idp->getCollapsed()) @@ -980,8 +991,7 @@ void LLFastTimerView::draw()  			U64 ticks;  			if (mPrintStats > 0)  			{ -				S32 hidx = (mPrintStats - 1) - mScrollIndex; -				ticks = idp->getHistoricalCount(hidx); +				ticks = idp->getHistoricalCount(mPrintStats);  			}  			else  			{ diff --git a/indra/newview/llfasttimerview.h b/indra/newview/llfasttimerview.h index ac06990913..6f64248f78 100644 --- a/indra/newview/llfasttimerview.h +++ b/indra/newview/llfasttimerview.h @@ -54,6 +54,7 @@ private:  public:  	virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); +	virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask);  	virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);  	virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask);  	virtual BOOL handleHover(S32 x, S32 y, MASK mask); diff --git a/indra/newview/llfloatergroups.cpp b/indra/newview/llfloatergroups.cpp index 0bd8215e5c..8558345efa 100644 --- a/indra/newview/llfloatergroups.cpp +++ b/indra/newview/llfloatergroups.cpp @@ -347,11 +347,10 @@ void LLPanelGroups::onGroupList(LLUICtrl* ctrl, void* userdata)  	if(self) self->enableButtons();  } -void init_group_list(LLScrollListCtrl* ctrl, const LLUUID& highlight_id, U64 powers_mask) +void init_group_list(LLScrollListCtrl* group_list, const LLUUID& highlight_id, U64 powers_mask)  {  	S32 count = gAgent.mGroups.count();  	LLUUID id; -	LLCtrlListInterface *group_list = ctrl->getListInterface();  	if (!group_list) return;  	group_list->operateOnAll(LLCtrlListInterface::OP_DELETE); @@ -375,10 +374,12 @@ void init_group_list(LLScrollListCtrl* ctrl, const LLUUID& highlight_id, U64 pow  			element["columns"][0]["font"]["name"] = "SANSSERIF";  			element["columns"][0]["font"]["style"] = style; -			group_list->addElement(element, ADD_SORTED); +			group_list->addElement(element);  		}  	} +	group_list->sortOnce(0, TRUE); +  	// add "none" to list at top  	{  		std::string style = "NORMAL"; diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 625b443abc..19e28720ae 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -2440,7 +2440,7 @@ void LLPanelLandAccess::refresh()  					suffix.append(" " + parent_floater->getString("Remaining") + ")");  				}  				if (mListAccess) -					mListAccess->addNameItem(entry.mID, ADD_SORTED, TRUE, suffix); +					mListAccess->addNameItem(entry.mID, ADD_DEFAULT, TRUE, suffix);  			}  		} @@ -2481,7 +2481,7 @@ void LLPanelLandAccess::refresh()  					}  					suffix.append(" " + parent_floater->getString("Remaining") + ")");  				} -				mListBanned->addNameItem(entry.mID, ADD_SORTED, TRUE, suffix); +				mListBanned->addNameItem(entry.mID, ADD_DEFAULT, TRUE, suffix);  			}  		} diff --git a/indra/newview/llfloaterlandholdings.cpp b/indra/newview/llfloaterlandholdings.cpp index 3c8ee6eb9e..12d27b8790 100644 --- a/indra/newview/llfloaterlandholdings.cpp +++ b/indra/newview/llfloaterlandholdings.cpp @@ -75,10 +75,9 @@ BOOL LLFloaterLandHoldings::postBuild()  	childSetAction("Show on Map", onClickMap, this);  	// Grant list -	getChild<LLScrollListCtrl>("grant list")->setDoubleClickCallback(onGrantList, this); - -	LLCtrlListInterface *list = childGetListInterface("grant list"); -	if (!list) return TRUE; +	LLScrollListCtrl* grant_list = getChild<LLScrollListCtrl>("grant list"); +	grant_list->sortByColumnIndex(0, TRUE); +	grant_list->setDoubleClickCallback(onGrantList, this);  	S32 count = gAgent.mGroups.count();  	for(S32 i = 0; i < count; ++i) @@ -97,7 +96,7 @@ BOOL LLFloaterLandHoldings::postBuild()  		element["columns"][1]["value"] = areastr;  		element["columns"][1]["font"] = "SANSSERIF"; -		list->addElement(element, ADD_SORTED); +		grant_list->addElement(element);  	}  	center(); diff --git a/indra/newview/llfloatermediabrowser.cpp b/indra/newview/llfloatermediabrowser.cpp index 5405de2f9a..268a0e0b93 100644 --- a/indra/newview/llfloatermediabrowser.cpp +++ b/indra/newview/llfloatermediabrowser.cpp @@ -63,6 +63,30 @@ LLFloaterMediaBrowser::LLFloaterMediaBrowser(const LLSD& key)  } +//static  +void LLFloaterMediaBrowser::create(const std::string &url, const std::string& target) +{ +	std::string tag = target; +	 +	if(target.empty() || target == "_blank") +	{ +		// create a unique tag for this instance +		LLUUID id; +		id.generate(); +		tag = id.asString(); +	} +	 +	// TODO: Figure out whether we need to close an existing instance and/or warn the user about the number of instances they have open +	 +	LLFloaterMediaBrowser *browser = dynamic_cast<LLFloaterMediaBrowser*> (LLFloaterReg::showInstance("media_browser", tag)); +	llassert(browser); +	if(browser) +	{ +		// tell the browser instance to load the specified URL +		browser->openMedia(url); +	} +} +  void LLFloaterMediaBrowser::draw()  {  	getChildView("go")->setEnabled(!mAddressCombo->getValue().asString().empty()); @@ -105,6 +129,7 @@ BOOL LLFloaterMediaBrowser::postBuild()  	mAddressCombo = getChild<LLComboBox>("address");  	mAddressCombo->setCommitCallback(onEnterAddress, this); +	mAddressCombo->sortByName();  	childSetAction("back", onClickBack, this);  	childSetAction("forward", onClickForward, this); @@ -185,7 +210,7 @@ void LLFloaterMediaBrowser::setCurrentURL(const std::string& url)  	if (mCurrentURL != "about:blank")  	{  		mAddressCombo->remove(mCurrentURL); -		mAddressCombo->add(mCurrentURL, ADD_SORTED); +		mAddressCombo->add(mCurrentURL);  		mAddressCombo->selectByValue(mCurrentURL);  		// Serialize url history @@ -197,12 +222,6 @@ void LLFloaterMediaBrowser::setCurrentURL(const std::string& url)  	getChildView("reload")->setEnabled(TRUE);  } -void LLFloaterMediaBrowser::onOpen(const LLSD& media_url) -{ -	LLFloater::onOpen(media_url); -	openMedia(media_url.asString()); -} -  //static   void LLFloaterMediaBrowser::onEnterAddress(LLUICtrl* ctrl, void* user_data)  { diff --git a/indra/newview/llfloatermediabrowser.h b/indra/newview/llfloatermediabrowser.h index c315f9e797..1645ed4613 100644 --- a/indra/newview/llfloatermediabrowser.h +++ b/indra/newview/llfloatermediabrowser.h @@ -47,10 +47,11 @@ class LLFloaterMediaBrowser :  public:  	LLFloaterMediaBrowser(const LLSD& key); +	static void create(const std::string &url, const std::string& target); +	  	/*virtual*/ BOOL postBuild();  	/*virtual*/ void onClose(bool app_quitting);  	/*virtual*/ void draw(); -	/*virtual*/ void onOpen(const LLSD& key);  	// inherited from LLViewerMediaObserver  	/*virtual*/ void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event); diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 7791c037d3..a4b45e04f2 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -826,13 +826,11 @@ void LLFloaterPreference::buildPopupLists()  				row["columns"][1]["font"] = "SANSSERIF_SMALL";  				row["columns"][1]["width"] = 360;  			} -			item = disabled_popups.addElement(row, -											  ADD_SORTED); +			item = disabled_popups.addElement(row);  		}  		else  		{ -			item = enabled_popups.addElement(row, -											 ADD_SORTED); +			item = enabled_popups.addElement(row);  		}  		if (item) diff --git a/indra/newview/llfloaterscriptlimits.cpp b/indra/newview/llfloaterscriptlimits.cpp index e0f646349e..a77fc4710a 100644 --- a/indra/newview/llfloaterscriptlimits.cpp +++ b/indra/newview/llfloaterscriptlimits.cpp @@ -712,38 +712,44 @@ void LLPanelScriptLimitsRegionMemory::setRegionDetails(LLSD content)  				}  			} -			LLSD element; +			LLScrollListItem::Params item_params; +			item_params.value = task_id; -			element["id"] = task_id; -			element["columns"][0]["column"] = "size"; -			element["columns"][0]["value"] = llformat("%d", size); -			element["columns"][0]["font"] = "SANSSERIF"; -			element["columns"][1]["column"] = "urls"; -			element["columns"][1]["value"] = llformat("%d", urls); -			element["columns"][1]["font"] = "SANSSERIF"; -			element["columns"][2]["column"] = "name"; -			element["columns"][2]["value"] = name_buf; -			element["columns"][2]["font"] = "SANSSERIF"; -			element["columns"][3]["column"] = "owner"; -			element["columns"][3]["value"] = owner_buf; -			element["columns"][3]["font"] = "SANSSERIF"; -			element["columns"][4]["column"] = "parcel"; -			element["columns"][4]["value"] = parcel_name; -			element["columns"][4]["font"] = "SANSSERIF"; -			element["columns"][5]["column"] = "location"; -			if(has_locations) -			{ -				element["columns"][5]["value"] = llformat("<%0.1f,%0.1f,%0.1f>", location_x, location_y, location_z); -			} -			else -			{ -				element["columns"][5]["value"] = ""; -			} -			element["columns"][5]["font"] = "SANSSERIF"; +			LLScrollListCell::Params cell_params; +			cell_params.font = LLFontGL::getFontSansSerif(); + +			cell_params.column = "size"; +			cell_params.value = size; +			item_params.columns.add(cell_params); + +			cell_params.column = "urls"; +			cell_params.value = urls; +			item_params.columns.add(cell_params); + +			cell_params.column = "name"; +			cell_params.value = name_buf; +			item_params.columns.add(cell_params); -			list->addElement(element, ADD_SORTED); +			cell_params.column = "owner"; +			cell_params.value = owner_buf; +			item_params.columns.add(cell_params); + +			cell_params.column = "parcel"; +			cell_params.value = parcel_name; +			item_params.columns.add(cell_params); + +			cell_params.column = "location"; +			cell_params.value = has_locations +				? llformat("<%0.1f,%0.1f,%0.1f>", location_x, location_y, location_z) +				: ""; +			item_params.columns.add(cell_params); + +			list->addRow(item_params); +			LLSD element;  			element["owner_id"] = owner_id; + +			element["id"] = task_id;  			element["local_id"] = local_id;  			mObjectListItems.push_back(element);  		} diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp index 2302772803..155e000bb8 100644 --- a/indra/newview/llpanelgroupgeneral.cpp +++ b/indra/newview/llpanelgroupgeneral.cpp @@ -746,7 +746,7 @@ void LLPanelGroupGeneral::updateMembers()  		sSDTime += sd_timer.getElapsedTimeF32();  		element_timer.reset(); -		LLScrollListItem* member_row = mListVisibleMembers->addElement(row);//, ADD_SORTED); +		LLScrollListItem* member_row = mListVisibleMembers->addElement(row);  		if ( member->isOwner() )  		{ diff --git a/indra/newview/llpanelgrouplandmoney.cpp b/indra/newview/llpanelgrouplandmoney.cpp index 1404cfcea2..16d5f8140d 100644 --- a/indra/newview/llpanelgrouplandmoney.cpp +++ b/indra/newview/llpanelgrouplandmoney.cpp @@ -528,7 +528,7 @@ void LLPanelGroupLandMoney::impl::processGroupLand(LLMessageSystem* msg)  			row["columns"][4]["column"] = "hidden";  			row["columns"][4]["value"] = hidden; -			mGroupParcelsp->addElement(row, ADD_SORTED); +			mGroupParcelsp->addElement(row);  		}  	}  } diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp index 7a28d10baf..efc797cfe9 100644 --- a/indra/newview/llpanelgrouproles.cpp +++ b/indra/newview/llpanelgrouproles.cpp @@ -1631,7 +1631,7 @@ void LLPanelGroupMembersSubTab::updateMembers()  			row["columns"][2]["value"] = mMemberProgress->second->getOnlineStatus();  			row["columns"][2]["font"] = "SANSSERIF_SMALL"; -			LLScrollListItem* member = mMembersList->addElement(row);//, ADD_SORTED); +			LLScrollListItem* member = mMembersList->addElement(row);  			LLUUID id = member->getUUID();  			mHasMatch = TRUE; diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index 4b23e63f12..58ed01896a 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -1110,9 +1110,10 @@ void LLPanelLogin::updateServerCombo()  	{  		if (!grid_choice->first.empty())  		{ -			server_choice_combo->add(grid_choice->second, grid_choice->first, ADD_SORTED); +			server_choice_combo->add(grid_choice->second, grid_choice->first);  		}  	} +	server_choice_combo->sortByName();  	server_choice_combo->addSeparator(ADD_TOP); diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp index 9cc775d427..583b41aa57 100644 --- a/indra/newview/llpanelprimmediacontrols.cpp +++ b/indra/newview/llpanelprimmediacontrols.cpp @@ -1178,7 +1178,7 @@ void LLPanelPrimMediaControls::setCurrentURL()  //	if (media_address_combo && mCurrentURL != "about:blank")  //	{  //		media_address_combo->remove(mCurrentURL); -//		media_address_combo->add(mCurrentURL, ADD_SORTED); +//		media_address_combo->add(mCurrentURL);  //		media_address_combo->selectByValue(mCurrentURL);  //	}  #else   // USE_COMBO_BOX_FOR_MEDIA_URL diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 1f3785d733..d89ee13b95 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -2826,25 +2826,18 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla  			LL_DEBUGS("Media") <<  "Media event:  MEDIA_EVENT_CLICK_LINK_HREF, target is \"" << plugin->getClickTarget() << "\", uri is " << plugin->getClickURL() << LL_ENDL;  			// retrieve the event parameters  			std::string url = plugin->getClickURL(); +			std::string target = plugin->getClickTarget();  			U32 target_type = plugin->getClickTargetType(); -			 +  			switch (target_type)  			{ -			case LLPluginClassMedia::TARGET_EXTERNAL: -				// force url to external browser -				LLWeb::loadURLExternal(url); -				break; -			case LLPluginClassMedia::TARGET_BLANK: -				// open in SL media browser or external browser based on user pref -				LLWeb::loadURL(url); -				break;  			case LLPluginClassMedia::TARGET_NONE:  				// ignore this click and let media plugin handle it  				break; -			case LLPluginClassMedia::TARGET_OTHER: -				LL_WARNS("LinkTarget") << "Unsupported link target type" << LL_ENDL; +			default: +				// loadURL now handles distinguishing between _blank, _external, and other named targets. +				LLWeb::loadURL(url, target);  				break; -			default: break;  			}  		};  		break; diff --git a/indra/newview/llweb.cpp b/indra/newview/llweb.cpp index 5c9633c036..b61109d490 100644 --- a/indra/newview/llweb.cpp +++ b/indra/newview/llweb.cpp @@ -84,23 +84,23 @@ void LLWeb::initClass()  // static -void LLWeb::loadURL(const std::string& url) +void LLWeb::loadURL(const std::string& url, const std::string& target)  { -	if (gSavedSettings.getBOOL("UseExternalBrowser")) +	if (gSavedSettings.getBOOL("UseExternalBrowser") || (target == "_external"))  	{  		loadURLExternal(url);  	}  	else  	{ -		loadURLInternal(url); +		loadURLInternal(url, target);  	}  }  // static -void LLWeb::loadURLInternal(const std::string &url) +void LLWeb::loadURLInternal(const std::string &url, const std::string& target)  { -	LLFloaterReg::showInstance("media_browser", url); +	LLFloaterMediaBrowser::create(url, target);  } diff --git a/indra/newview/llweb.h b/indra/newview/llweb.h index 1119b80bb4..20c7391dbf 100644 --- a/indra/newview/llweb.h +++ b/indra/newview/llweb.h @@ -49,11 +49,14 @@ public:  	static void initClass();  	/// Load the given url in the user's preferred web browser -	static void loadURL(const std::string& url); +	static void loadURL(const std::string& url, const std::string& target); +	static void loadURL(const std::string& url) { loadURL(url, LLStringUtil::null); }  	/// Load the given url in the user's preferred web browser	 -	static void loadURL(const char* url) { loadURL( ll_safe_string(url) ); } +	static void loadURL(const char* url, const std::string& target) { loadURL( ll_safe_string(url), target); } +	static void loadURL(const char* url) { loadURL( ll_safe_string(url), LLStringUtil::null ); }  	/// Load the given url in the Second Life internal web browser -	static void loadURLInternal(const std::string &url); +	static void loadURLInternal(const std::string &url, const std::string& target); +	static void loadURLInternal(const std::string &url) { loadURLInternal(url, LLStringUtil::null); }  	/// Load the given url in the operating system's web browser, async if we want to return immediately  	/// before browser has spawned  	static void loadURLExternal(const std::string& url); diff --git a/indra/newview/skins/default/xui/en/floater_media_browser.xml b/indra/newview/skins/default/xui/en/floater_media_browser.xml index c02d607586..18f3b9ab06 100644 --- a/indra/newview/skins/default/xui/en/floater_media_browser.xml +++ b/indra/newview/skins/default/xui/en/floater_media_browser.xml @@ -9,7 +9,7 @@   name="floater_about"   help_topic="floater_about"   save_rect="true" - single_instance="true" + auto_tile="true"   title="MEDIA BROWSER"   width="820">      <floater.string diff --git a/indra/newview/skins/default/xui/en/panel_group_land_money.xml b/indra/newview/skins/default/xui/en/panel_group_land_money.xml index 76f7484c68..1e1d2d18ca 100644 --- a/indra/newview/skins/default/xui/en/panel_group_land_money.xml +++ b/indra/newview/skins/default/xui/en/panel_group_land_money.xml @@ -60,6 +60,8 @@       left="0"       right="-1"       top="0" +     sort_column="0" +     sort_ascending="true"       name="group_parcel_list"       width="313">          <scroll_list.columns diff --git a/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml index 516457dd93..559df5bec9 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml @@ -57,6 +57,8 @@       left="10"       multi_select="true"       name="enabled_popups" +     sort_column="0" +     sort_ascending="true"        width="495" />  	 <button  	 enabled_control="FirstSelectedDisabledPopups" @@ -103,6 +105,8 @@       height="140"       layout="topleft"       left="10" +     sort_column="0" +     sort_ascending="true"       multi_select="true"       name="disabled_popups"       width="495" /> diff --git a/indra/newview/skins/default/xui/en/panel_script_limits_region_memory.xml b/indra/newview/skins/default/xui/en/panel_script_limits_region_memory.xml index 9dff00fa0b..c5e8bf5803 100644 --- a/indra/newview/skins/default/xui/en/panel_script_limits_region_memory.xml +++ b/indra/newview/skins/default/xui/en/panel_script_limits_region_memory.xml @@ -79,6 +79,8 @@       layout="topleft"       left_delta="0"       multi_select="true" +     sort_column="0" +     sort_ascending="true"       name="scripts_list"       top_delta="16"       width="460"> diff --git a/install.xml b/install.xml index 3795fc3757..28f13553d7 100644 --- a/install.xml +++ b/install.xml @@ -185,7 +185,7 @@          <key>copyright</key>          <string>various</string>          <key>description</key> -        <string>A set of portable C++ libraries which provide a wide set of functionality. Used primarily for tokenization. </string> +        <string>A set of portable C++ libraries which provide a wide set of functionality. </string>          <key>license</key>          <string>boost</string>          <key>packages</key> @@ -981,9 +981,9 @@ anguage Infrstructure (CLI) international standard</string>            <key>darwin</key>            <map>              <key>md5sum</key> -            <string>becffca6bd8dcb239de284ea2a8b485b</string> +            <string>093c977ef0ef2396cc235b3620329a87</string>              <key>url</key> -            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-4.6+cookies-darwin-20100617.tar.bz2</uri> +            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-4.6-darwin-20100805.tar.bz2</uri>            </map>            <key>linux</key>            <map>  | 
