diff options
Diffstat (limited to 'indra')
56 files changed, 646 insertions, 498 deletions
diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt index ce068618e2..853f6f173d 100644 --- a/indra/llui/CMakeLists.txt +++ b/indra/llui/CMakeLists.txt @@ -90,6 +90,7 @@ set(llui_SOURCE_FILES      lltextbox.cpp      lltexteditor.cpp      lltextparser.cpp +    lltextvalidate.cpp      lltransutil.cpp      lltoggleablemenu.cpp      lltooltip.cpp @@ -182,6 +183,7 @@ set(llui_HEADER_FILES      lltextbox.h      lltexteditor.h      lltextparser.h +    lltextvalidate.h      lltoggleablemenu.h      lltooltip.h      lltransutil.h diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp index 30b09352d8..483a394bbd 100644 --- a/indra/llui/lllineeditor.cpp +++ b/indra/llui/lllineeditor.cpp @@ -83,19 +83,6 @@ template class LLLineEditor* LLView::getChild<class LLLineEditor>(  // Member functions  // -void LLLineEditor::PrevalidateNamedFuncs::declareValues() -{ -	declare("ascii", LLLineEditor::prevalidateASCII); -	declare("float", LLLineEditor::prevalidateFloat); -	declare("int", LLLineEditor::prevalidateInt); -	declare("positive_s32", LLLineEditor::prevalidatePositiveS32); -	declare("non_negative_s32", LLLineEditor::prevalidateNonNegativeS32); -	declare("alpha_num", LLLineEditor::prevalidateAlphaNum); -	declare("alpha_num_space", LLLineEditor::prevalidateAlphaNumSpace); -	declare("ascii_printable_no_pipe", LLLineEditor::prevalidateASCIIPrintableNoPipe); -	declare("ascii_printable_no_space", LLLineEditor::prevalidateASCIIPrintableNoSpace); -} -  LLLineEditor::Params::Params()  :	max_length_bytes("max_length", 254),      keystroke_callback("keystroke_callback"), @@ -1984,51 +1971,12 @@ void LLLineEditor::setRect(const LLRect& rect)  	}  } -void LLLineEditor::setPrevalidate(LLLinePrevalidateFunc func) +void LLLineEditor::setPrevalidate(LLTextValidate::validate_func_t func)  {  	mPrevalidateFunc = func;  	updateAllowingLanguageInput();  } -// Limits what characters can be used to [1234567890.-] with [-] only valid in the first position. -// Does NOT ensure that the string is a well-formed number--that's the job of post-validation--for -// the simple reasons that intermediate states may be invalid even if the final result is valid. -//  -// static -BOOL LLLineEditor::prevalidateFloat(const LLWString &str) -{ -	LLLocale locale(LLLocale::USER_LOCALE); - -	BOOL success = TRUE; -	LLWString trimmed = str; -	LLWStringUtil::trim(trimmed); -	S32 len = trimmed.length(); -	if( 0 < len ) -	{ -		// May be a comma or period, depending on the locale -		llwchar decimal_point = (llwchar)LLResMgr::getInstance()->getDecimalPoint(); - -		S32 i = 0; - -		// First character can be a negative sign -		if( '-' == trimmed[0] ) -		{ -			i++; -		} - -		for( ; i < len; i++ ) -		{ -			if( (decimal_point != trimmed[i] ) && !LLStringOps::isDigit( trimmed[i] ) ) -			{ -				success = FALSE; -				break; -			} -		} -	}		 - -	return success; -} -  // static  BOOL LLLineEditor::postvalidateFloat(const std::string &str)  { @@ -2088,223 +2036,6 @@ BOOL LLLineEditor::postvalidateFloat(const std::string &str)  	return success;  } -// Limits what characters can be used to [1234567890-] with [-] only valid in the first position. -// Does NOT ensure that the string is a well-formed number--that's the job of post-validation--for -// the simple reasons that intermediate states may be invalid even if the final result is valid. -// -// static -BOOL LLLineEditor::prevalidateInt(const LLWString &str) -{ -	LLLocale locale(LLLocale::USER_LOCALE); - -	BOOL success = TRUE; -	LLWString trimmed = str; -	LLWStringUtil::trim(trimmed); -	S32 len = trimmed.length(); -	if( 0 < len ) -	{ -		S32 i = 0; - -		// First character can be a negative sign -		if( '-' == trimmed[0] ) -		{ -			i++; -		} - -		for( ; i < len; i++ ) -		{ -			if( !LLStringOps::isDigit( trimmed[i] ) ) -			{ -				success = FALSE; -				break; -			} -		} -	}		 - -	return success; -} - -// static -BOOL LLLineEditor::prevalidatePositiveS32(const LLWString &str) -{ -	LLLocale locale(LLLocale::USER_LOCALE); - -	LLWString trimmed = str; -	LLWStringUtil::trim(trimmed); -	S32 len = trimmed.length(); -	BOOL success = TRUE; -	if(0 < len) -	{ -		if(('-' == trimmed[0]) || ('0' == trimmed[0])) -		{ -			success = FALSE; -		} -		S32 i = 0; -		while(success && (i < len)) -		{ -			if(!LLStringOps::isDigit(trimmed[i++])) -			{ -				success = FALSE; -			} -		} -	} -	if (success) -	{ -		S32 val = strtol(wstring_to_utf8str(trimmed).c_str(), NULL, 10); -		if (val <= 0) -		{ -			success = FALSE; -		} -	} -	return success; -} - -BOOL LLLineEditor::prevalidateNonNegativeS32(const LLWString &str) -{ -	LLLocale locale(LLLocale::USER_LOCALE); - -	LLWString trimmed = str; -	LLWStringUtil::trim(trimmed); -	S32 len = trimmed.length(); -	BOOL success = TRUE; -	if(0 < len) -	{ -		if('-' == trimmed[0]) -		{ -			success = FALSE; -		} -		S32 i = 0; -		while(success && (i < len)) -		{ -			if(!LLStringOps::isDigit(trimmed[i++])) -			{ -				success = FALSE; -			} -		} -	} -	if (success) -	{ -		S32 val = strtol(wstring_to_utf8str(trimmed).c_str(), NULL, 10); -		if (val < 0) -		{ -			success = FALSE; -		} -	} -	return success; -} - -BOOL LLLineEditor::prevalidateAlphaNum(const LLWString &str) -{ -	LLLocale locale(LLLocale::USER_LOCALE); - -	BOOL rv = TRUE; -	S32 len = str.length(); -	if(len == 0) return rv; -	while(len--) -	{ -		if( !LLStringOps::isAlnum((char)str[len]) ) -		{ -			rv = FALSE; -			break; -		} -	} -	return rv; -} - -// static -BOOL LLLineEditor::prevalidateAlphaNumSpace(const LLWString &str) -{ -	LLLocale locale(LLLocale::USER_LOCALE); - -	BOOL rv = TRUE; -	S32 len = str.length(); -	if(len == 0) return rv; -	while(len--) -	{ -		if(!(LLStringOps::isAlnum((char)str[len]) || (' ' == str[len]))) -		{ -			rv = FALSE; -			break; -		} -	} -	return rv; -} - -// Used for most names of things stored on the server, due to old file-formats -// that used the pipe (|) for multiline text storage.  Examples include -// inventory item names, parcel names, object names, etc. -// static -BOOL LLLineEditor::prevalidateASCIIPrintableNoPipe(const LLWString &str) -{ -	BOOL rv = TRUE; -	S32 len = str.length(); -	if(len == 0) return rv; -	while(len--) -	{ -		llwchar wc = str[len]; -		if (wc < 0x20 -			|| wc > 0x7f -			|| wc == '|') -		{ -			rv = FALSE; -			break; -		} -		if(!(wc == ' ' -			 || LLStringOps::isAlnum((char)wc) -			 || LLStringOps::isPunct((char)wc) ) ) -		{ -			rv = FALSE; -			break; -		} -	} -	return rv; -} - - -// Used for avatar names -// static -BOOL LLLineEditor::prevalidateASCIIPrintableNoSpace(const LLWString &str) -{ -	BOOL rv = TRUE; -	S32 len = str.length(); -	if(len == 0) return rv; -	while(len--) -	{ -		llwchar wc = str[len]; -		if (wc < 0x20 -			|| wc > 0x7f -			|| LLStringOps::isSpace(wc)) -		{ -			rv = FALSE; -			break; -		} -		if( !(LLStringOps::isAlnum((char)str[len]) || -		      LLStringOps::isPunct((char)str[len]) ) ) -		{ -			rv = FALSE; -			break; -		} -	} -	return rv; -} - - -// static -BOOL LLLineEditor::prevalidateASCII(const LLWString &str) -{ -	BOOL rv = TRUE; -	S32 len = str.length(); -	while(len--) -	{ -		if (str[len] < 0x20 || str[len] > 0x7f) -		{ -			rv = FALSE; -			break; -		} -	} -	return rv; -} -  void LLLineEditor::onMouseCaptureLost()  {  	endSelection(); diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h index f275dfc45a..b62138426b 100644 --- a/indra/llui/lllineeditor.h +++ b/indra/llui/lllineeditor.h @@ -51,27 +51,18 @@  #include "llviewborder.h"  #include "llpreeditor.h" -#include <boost/function.hpp> +#include "lltextvalidate.h"  class LLFontGL;  class LLLineEditorRollback;  class LLButton;  class LLContextMenu; -typedef boost::function<BOOL (const LLWString &wstr)> LLLinePrevalidateFunc; -  class LLLineEditor  : public LLUICtrl, public LLEditMenuHandler, protected LLPreeditor  {  public: -	struct PrevalidateNamedFuncs -	:	public LLInitParam::TypeValuesHelper<LLLinePrevalidateFunc, PrevalidateNamedFuncs> - -	{ -		static void declareValues(); -	}; -	  	typedef boost::function<void (LLLineEditor* caller)> keystroke_callback_t;  	struct Params : public LLInitParam::Block<Params, LLUICtrl::Params> @@ -81,7 +72,7 @@ public:  		Optional<keystroke_callback_t>	keystroke_callback; -		Optional<LLLinePrevalidateFunc, PrevalidateNamedFuncs>	prevalidate_callback; +		Optional<LLTextValidate::validate_func_t, LLTextValidate::ValidateTextNamedFuncs>	prevalidate_callback;  		Optional<LLViewBorder::Params>	border; @@ -236,17 +227,7 @@ public:  	void setTextPadding(S32 left, S32 right);  	// Prevalidation controls which keystrokes can affect the editor -	void			setPrevalidate( LLLinePrevalidateFunc func ); -	static BOOL		prevalidateFloat(const LLWString &str ); -	static BOOL		prevalidateInt(const LLWString &str ); -	static BOOL		prevalidatePositiveS32(const LLWString &str); -	static BOOL		prevalidateNonNegativeS32(const LLWString &str); -	static BOOL		prevalidateAlphaNum(const LLWString &str ); -	static BOOL		prevalidateAlphaNumSpace(const LLWString &str ); -	static BOOL		prevalidateASCIIPrintableNoPipe(const LLWString &str);  -	static BOOL		prevalidateASCIIPrintableNoSpace(const LLWString &str); -	static BOOL		prevalidateASCII(const LLWString &str); - +	void			setPrevalidate( LLTextValidate::validate_func_t func );  	static BOOL		postvalidateFloat(const std::string &str);  	// line history support: @@ -326,7 +307,7 @@ protected:  	S32			mLastSelectionStart;  	S32			mLastSelectionEnd; -	LLLinePrevalidateFunc mPrevalidateFunc; +	LLTextValidate::validate_func_t mPrevalidateFunc;  	LLFrameTimer mKeystrokeTimer;  	LLTimer		mTripleClickTimer; diff --git a/indra/llui/llmultisliderctrl.cpp b/indra/llui/llmultisliderctrl.cpp index f4434a0f78..cb81c39103 100644 --- a/indra/llui/llmultisliderctrl.cpp +++ b/indra/llui/llmultisliderctrl.cpp @@ -138,7 +138,7 @@ LLMultiSliderCtrl::LLMultiSliderCtrl(const LLMultiSliderCtrl::Params& p)  			params.font(p.font);  			params.max_length_bytes(MAX_STRING_LENGTH);  			params.commit_callback.function(LLMultiSliderCtrl::onEditorCommit); -			params.prevalidate_callback(&LLLineEditor::prevalidateFloat); +			params.prevalidate_callback(&LLTextValidate::validateFloat);  			params.follows.flags(FOLLOWS_LEFT | FOLLOWS_BOTTOM);  			mEditor = LLUICtrlFactory::create<LLLineEditor> (params);  			mEditor->setFocusReceivedCallback( boost::bind(LLMultiSliderCtrl::onEditorGainFocus, _1, this) ); diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp index 7f23fe2671..7b406e090a 100644 --- a/indra/llui/llpanel.cpp +++ b/indra/llui/llpanel.cpp @@ -936,7 +936,7 @@ LLPanel *LLPanel::childGetVisiblePanelWithHelp()  	return ::childGetVisiblePanelWithHelp(this);  } -void LLPanel::childSetPrevalidate(const std::string& id, BOOL (*func)(const LLWString &) ) +void LLPanel::childSetPrevalidate(const std::string& id, bool (*func)(const LLWString &) )  {  	LLLineEditor* child = findChild<LLLineEditor>(id);  	if (child) diff --git a/indra/llui/llpanel.h b/indra/llui/llpanel.h index 6de83fe3a7..4e53fd7ea3 100644 --- a/indra/llui/llpanel.h +++ b/indra/llui/llpanel.h @@ -226,7 +226,7 @@ public:  	std::string childGetText(const std::string& id) const { return childGetValue(id).asString(); }  	// LLLineEditor -	void childSetPrevalidate(const std::string& id, BOOL (*func)(const LLWString &) ); +	void childSetPrevalidate(const std::string& id, bool (*func)(const LLWString &) );  	// LLButton  	void childSetAction(const std::string& id, boost::function<void(void*)> function, void* value = NULL); diff --git a/indra/llui/llsliderctrl.cpp b/indra/llui/llsliderctrl.cpp index 01c274bb4e..80ee5d0984 100644 --- a/indra/llui/llsliderctrl.cpp +++ b/indra/llui/llsliderctrl.cpp @@ -141,7 +141,7 @@ LLSliderCtrl::LLSliderCtrl(const LLSliderCtrl::Params& p)  			line_p.rect.setIfNotProvided(text_rect);  			line_p.font.setIfNotProvided(p.font);  			line_p.commit_callback.function(&LLSliderCtrl::onEditorCommit); -			line_p.prevalidate_callback(&LLLineEditor::prevalidateFloat); +			line_p.prevalidate_callback(&LLTextValidate::validateFloat);  			mEditor = LLUICtrlFactory::create<LLLineEditor>(line_p);  			mEditor->setFocusReceivedCallback( boost::bind(&LLSliderCtrl::onEditorGainFocus, _1, this )); diff --git a/indra/llui/llspinctrl.cpp b/indra/llui/llspinctrl.cpp index 28f3788817..491cd7b6f3 100644 --- a/indra/llui/llspinctrl.cpp +++ b/indra/llui/llspinctrl.cpp @@ -127,7 +127,7 @@ LLSpinCtrl::LLSpinCtrl(const LLSpinCtrl::Params& p)  	}  	params.max_length_bytes(MAX_STRING_LENGTH);  	params.commit_callback.function((boost::bind(&LLSpinCtrl::onEditorCommit, this, _2))); -	params.prevalidate_callback(&LLLineEditor::prevalidateFloat); +	params.prevalidate_callback(&LLTextValidate::validateFloat);  	params.follows.flags(FOLLOWS_LEFT | FOLLOWS_BOTTOM);  	mEditor = LLUICtrlFactory::create<LLLineEditor> (params);  	mEditor->setFocusReceivedCallback( boost::bind(&LLSpinCtrl::onEditorGainFocus, _1, this )); diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 2b1e2b8226..a83cc19d36 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -1137,6 +1137,7 @@ void LLTextBase::reflow()  			line_list_t::iterator iter = std::upper_bound(mLineInfoList.begin(), mLineInfoList.end(), start_index, line_end_compare());  			line_start_index = iter->mDocIndexStart;  			line_count = iter->mLineNum; +			cur_top = iter->mRect.mTop;  			getSegmentAndOffset(iter->mDocIndexStart, &seg_iter, &seg_offset);  			mLineInfoList.erase(iter, mLineInfoList.end());  		} diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index ac5a0376fc..ad9f066539 100644 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -237,6 +237,7 @@ private:  ///////////////////////////////////////////////////////////////////  LLTextEditor::Params::Params()  :	default_text("default_text"), +	prevalidate_callback("prevalidate_callback"),  	embedded_items("embedded_items", false),  	ignore_tab("ignore_tab", true),  	handle_edit_keys_directly("handle_edit_keys_directly", false), @@ -244,7 +245,9 @@ LLTextEditor::Params::Params()  	default_color("default_color"),      commit_on_focus_lost("commit_on_focus_lost", false),  	show_context_menu("show_context_menu") -{} +{ +	addSynonym(prevalidate_callback, "text_type"); +}  LLTextEditor::LLTextEditor(const LLTextEditor::Params& p) :  	LLTextBase(p), @@ -259,6 +262,7 @@ LLTextEditor::LLTextEditor(const LLTextEditor::Params& p) :  	mMouseDownX(0),  	mMouseDownY(0),  	mTabsToNextField(p.ignore_tab), +	mPrevalidateFunc(p.prevalidate_callback()),  	mContextMenu(NULL),  	mShowContextMenu(p.show_context_menu)  { @@ -320,6 +324,17 @@ LLTextEditor::~LLTextEditor()  void LLTextEditor::setText(const LLStringExplicit &utf8str, const LLStyle::Params& input_params)  { +	// validate incoming text if necessary +	if (mPrevalidateFunc) +	{ +		LLWString test_text = utf8str_to_wstring(utf8str); +		if (!mPrevalidateFunc(test_text)) +		{ +			// not valid text, nothing to do +			return; +		} +	} +  	blockUndo();  	deselect(); @@ -911,6 +926,21 @@ S32 LLTextEditor::execute( TextCmd* cmd )  		// Push the new command is now on the top (front) of the undo stack.  		mUndoStack.push_front(cmd);  		mLastCmd = cmd; + +		bool need_to_rollback = mPrevalidateFunc  +								&& !mPrevalidateFunc(getViewModel()->getDisplay()); +		if (need_to_rollback) +		{ +			// get rid of this last command and clean up undo stack +			undo(); + +			// remove any evidence of this command from redo history +			mUndoStack.pop_front(); +			delete cmd; + +			// failure, nothing changed +			delta = 0; +		}  	}  	else  	{ @@ -1034,7 +1064,21 @@ S32 LLTextEditor::addChar(S32 pos, llwchar wc)  	if (mLastCmd && mLastCmd->canExtend(pos))  	{  		S32 delta = 0; +		if (mPrevalidateFunc) +		{ +			// get a copy of current text contents +			LLWString test_string(getViewModel()->getDisplay()); + +			// modify text contents as if this addChar succeeded +			llassert(pos <= (S32)test_string.size()); +			test_string.insert(pos, 1, wc); +			if (!mPrevalidateFunc( test_string)) +			{ +				return 0; +			} +		}  		mLastCmd->extendAndExecute(this, pos, wc, &delta); +  		return delta;  	}  	else diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h index d96198d9ce..00c6a8b68a 100644 --- a/indra/llui/lltexteditor.h +++ b/indra/llui/lltexteditor.h @@ -44,6 +44,7 @@  #include "lldarray.h"  #include "llviewborder.h" // for params  #include "lltextbase.h" +#include "lltextvalidate.h"  #include "llpreeditor.h"  #include "llcontrol.h" @@ -63,6 +64,7 @@ public:  	struct Params : public LLInitParam::Block<Params, LLTextBase::Params>  	{  		Optional<std::string>	default_text; +		Optional<LLTextValidate::validate_func_t, LLTextValidate::ValidateTextNamedFuncs>	prevalidate_callback;  		Optional<bool>			embedded_items,  								ignore_tab, @@ -334,6 +336,7 @@ private:  	LLCoordGL		mLastIMEPosition;		// Last position of the IME editor  	keystroke_signal_t mKeystrokeSignal; +	LLTextValidate::validate_func_t mPrevalidateFunc;  	LLContextMenu* mContextMenu;  }; // end class LLTextEditor diff --git a/indra/llui/lltextvalidate.cpp b/indra/llui/lltextvalidate.cpp new file mode 100644 index 0000000000..8b6bc5bd7d --- /dev/null +++ b/indra/llui/lltextvalidate.cpp @@ -0,0 +1,302 @@ +/**  + * @file lltextvalidate.cpp + * @brief Text validation helper functions + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + *  + * Copyright (c) 2001-2009, Linden Research, Inc. + *  + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab.  Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + *  + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + *  + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + *  + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +// Text editor widget to let users enter a single line. + +#include "linden_common.h" +  +#include "lltextvalidate.h" +#include "llresmgr.h" // for LLLocale + +namespace LLTextValidate +{ +	void ValidateTextNamedFuncs::declareValues() +	{ +		declare("ascii", validateASCII); +		declare("float", validateFloat); +		declare("int", validateInt); +		declare("positive_s32", validatePositiveS32); +		declare("non_negative_s32", validateNonNegativeS32); +		declare("alpha_num", validateAlphaNum); +		declare("alpha_num_space", validateAlphaNumSpace); +		declare("ascii_printable_no_pipe", validateASCIIPrintableNoPipe); +		declare("ascii_printable_no_space", validateASCIIPrintableNoSpace); +	} + +	// Limits what characters can be used to [1234567890.-] with [-] only valid in the first position. +	// Does NOT ensure that the string is a well-formed number--that's the job of post-validation--for +	// the simple reasons that intermediate states may be invalid even if the final result is valid. +	//  +	bool validateFloat(const LLWString &str) +	{ +		LLLocale locale(LLLocale::USER_LOCALE); + +		bool success = TRUE; +		LLWString trimmed = str; +		LLWStringUtil::trim(trimmed); +		S32 len = trimmed.length(); +		if( 0 < len ) +		{ +			// May be a comma or period, depending on the locale +			llwchar decimal_point = (llwchar)LLResMgr::getInstance()->getDecimalPoint(); + +			S32 i = 0; + +			// First character can be a negative sign +			if( '-' == trimmed[0] ) +			{ +				i++; +			} + +			for( ; i < len; i++ ) +			{ +				if( (decimal_point != trimmed[i] ) && !LLStringOps::isDigit( trimmed[i] ) ) +				{ +					success = FALSE; +					break; +				} +			} +		}		 + +		return success; +	} + +	// Limits what characters can be used to [1234567890-] with [-] only valid in the first position. +	// Does NOT ensure that the string is a well-formed number--that's the job of post-validation--for +	// the simple reasons that intermediate states may be invalid even if the final result is valid. +	// +	bool validateInt(const LLWString &str) +	{ +		LLLocale locale(LLLocale::USER_LOCALE); + +		bool success = TRUE; +		LLWString trimmed = str; +		LLWStringUtil::trim(trimmed); +		S32 len = trimmed.length(); +		if( 0 < len ) +		{ +			S32 i = 0; + +			// First character can be a negative sign +			if( '-' == trimmed[0] ) +			{ +				i++; +			} + +			for( ; i < len; i++ ) +			{ +				if( !LLStringOps::isDigit( trimmed[i] ) ) +				{ +					success = FALSE; +					break; +				} +			} +		}		 + +		return success; +	} + +	bool validatePositiveS32(const LLWString &str) +	{ +		LLLocale locale(LLLocale::USER_LOCALE); + +		LLWString trimmed = str; +		LLWStringUtil::trim(trimmed); +		S32 len = trimmed.length(); +		bool success = TRUE; +		if(0 < len) +		{ +			if(('-' == trimmed[0]) || ('0' == trimmed[0])) +			{ +				success = FALSE; +			} +			S32 i = 0; +			while(success && (i < len)) +			{ +				if(!LLStringOps::isDigit(trimmed[i++])) +				{ +					success = FALSE; +				} +			} +		} +		if (success) +		{ +			S32 val = strtol(wstring_to_utf8str(trimmed).c_str(), NULL, 10); +			if (val <= 0) +			{ +				success = FALSE; +			} +		} +		return success; +	} + +	bool validateNonNegativeS32(const LLWString &str) +	{ +		LLLocale locale(LLLocale::USER_LOCALE); + +		LLWString trimmed = str; +		LLWStringUtil::trim(trimmed); +		S32 len = trimmed.length(); +		bool success = TRUE; +		if(0 < len) +		{ +			if('-' == trimmed[0]) +			{ +				success = FALSE; +			} +			S32 i = 0; +			while(success && (i < len)) +			{ +				if(!LLStringOps::isDigit(trimmed[i++])) +				{ +					success = FALSE; +				} +			} +		} +		if (success) +		{ +			S32 val = strtol(wstring_to_utf8str(trimmed).c_str(), NULL, 10); +			if (val < 0) +			{ +				success = FALSE; +			} +		} +		return success; +	} + +	bool validateAlphaNum(const LLWString &str) +	{ +		LLLocale locale(LLLocale::USER_LOCALE); + +		bool rv = TRUE; +		S32 len = str.length(); +		if(len == 0) return rv; +		while(len--) +		{ +			if( !LLStringOps::isAlnum((char)str[len]) ) +			{ +				rv = FALSE; +				break; +			} +		} +		return rv; +	} + +	bool validateAlphaNumSpace(const LLWString &str) +	{ +		LLLocale locale(LLLocale::USER_LOCALE); + +		bool rv = TRUE; +		S32 len = str.length(); +		if(len == 0) return rv; +		while(len--) +		{ +			if(!(LLStringOps::isAlnum((char)str[len]) || (' ' == str[len]))) +			{ +				rv = FALSE; +				break; +			} +		} +		return rv; +	} + +	// Used for most names of things stored on the server, due to old file-formats +	// that used the pipe (|) for multiline text storage.  Examples include +	// inventory item names, parcel names, object names, etc. +	bool validateASCIIPrintableNoPipe(const LLWString &str) +	{ +		bool rv = TRUE; +		S32 len = str.length(); +		if(len == 0) return rv; +		while(len--) +		{ +			llwchar wc = str[len]; +			if (wc < 0x20 +				|| wc > 0x7f +				|| wc == '|') +			{ +				rv = FALSE; +				break; +			} +			if(!(wc == ' ' +				 || LLStringOps::isAlnum((char)wc) +				 || LLStringOps::isPunct((char)wc) ) ) +			{ +				rv = FALSE; +				break; +			} +		} +		return rv; +	} + + +	// Used for avatar names +	bool validateASCIIPrintableNoSpace(const LLWString &str) +	{ +		bool rv = TRUE; +		S32 len = str.length(); +		if(len == 0) return rv; +		while(len--) +		{ +			llwchar wc = str[len]; +			if (wc < 0x20 +				|| wc > 0x7f +				|| LLStringOps::isSpace(wc)) +			{ +				rv = FALSE; +				break; +			} +			if( !(LLStringOps::isAlnum((char)str[len]) || +				  LLStringOps::isPunct((char)str[len]) ) ) +			{ +				rv = FALSE; +				break; +			} +		} +		return rv; +	} + +	bool validateASCII(const LLWString &str) +	{ +		bool rv = TRUE; +		S32 len = str.length(); +		while(len--) +		{ +			if (str[len] < 0x20 || str[len] > 0x7f) +			{ +				rv = FALSE; +				break; +			} +		} +		return rv; +	} +} diff --git a/indra/llui/lltextvalidate.h b/indra/llui/lltextvalidate.h new file mode 100644 index 0000000000..ffb4e85e7c --- /dev/null +++ b/indra/llui/lltextvalidate.h @@ -0,0 +1,63 @@ +/**  + * @file lltextbase.h + * @author Martin Reddy + * @brief The base class of text box/editor, providing Url handling support + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + *  + * Copyright (c) 2009, Linden Research, Inc. + *  + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab.  Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + *  + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + *  + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + *  + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLTEXTVALIDATE_H +#define LL_LLTEXTVALIDATE_H + +#include "llstring.h" +#include "llinitparam.h" +#include <boost/function.hpp> + +namespace LLTextValidate +{ +	typedef boost::function<BOOL (const LLWString &wstr)> validate_func_t; + +	struct ValidateTextNamedFuncs +	:	public LLInitParam::TypeValuesHelper<validate_func_t, ValidateTextNamedFuncs> +	{ +		static void declareValues(); +	}; + +	bool	validateFloat(const LLWString &str ); +	bool	validateInt(const LLWString &str ); +	bool	validatePositiveS32(const LLWString &str); +	bool	validateNonNegativeS32(const LLWString &str); +	bool	validateAlphaNum(const LLWString &str ); +	bool	validateAlphaNumSpace(const LLWString &str ); +	bool	validateASCIIPrintableNoPipe(const LLWString &str);  +	bool	validateASCIIPrintableNoSpace(const LLWString &str); +	bool	validateASCII(const LLWString &str); +} + + +#endif diff --git a/indra/llui/lltooltip.h b/indra/llui/lltooltip.h index 7978b6a583..c0811c56c3 100644 --- a/indra/llui/lltooltip.h +++ b/indra/llui/lltooltip.h @@ -129,7 +129,8 @@ private:  class LLInspector : public LLToolTip  {  public: -	struct Params : public LLInitParam::Block<Params, LLToolTip::Params> {}; +	struct Params : public LLInitParam::Block<Params, LLToolTip::Params>  +	{};  };  class LLToolTipMgr : public LLSingleton<LLToolTipMgr> diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index f2b3c7826c..a3720769a1 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -1353,9 +1353,6 @@ bool LLAppViewer::cleanup()  	llinfos << "Cache files removed" << llendflush; - -	cleanup_menus(); -  	// Wait for any pending VFS IO  	while (1)  	{ diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index f046e08827..3aea70d1b4 100644 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -262,7 +262,7 @@ public:  			mSourceType = CHAT_SOURCE_SYSTEM;  		} -		LLTextEditor* userName = getChild<LLTextEditor>("user_name"); +		LLTextBox* userName = getChild<LLTextBox>("user_name");  		userName->setReadOnlyColor(style_params.readonly_color());  		userName->setColor(style_params.color()); @@ -300,7 +300,7 @@ public:  	/*virtual*/ void draw()  	{ -		LLTextEditor* user_name = getChild<LLTextEditor>("user_name"); +		LLTextBox* user_name = getChild<LLTextBox>("user_name");  		LLTextBox* time_box = getChild<LLTextBox>("time_box");  		LLRect user_name_rect = user_name->getRect(); diff --git a/indra/newview/llcurrencyuimanager.cpp b/indra/newview/llcurrencyuimanager.cpp index 00c05445e1..be6c15eab4 100644 --- a/indra/newview/llcurrencyuimanager.cpp +++ b/indra/newview/llcurrencyuimanager.cpp @@ -426,7 +426,7 @@ void LLCurrencyUIManager::Impl::prepare()  	LLLineEditor* lindenAmount = mPanel.getChild<LLLineEditor>("currency_amt");  	if (lindenAmount)  	{ -		lindenAmount->setPrevalidate(LLLineEditor::prevalidateNonNegativeS32); +		lindenAmount->setPrevalidate(LLTextValidate::validateNonNegativeS32);  		lindenAmount->setKeystrokeCallback(onCurrencyKey, this);  	}  } diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp index 9496e94780..ecb6254f8a 100644 --- a/indra/newview/llfloatercamera.cpp +++ b/indra/newview/llfloatercamera.cpp @@ -65,7 +65,7 @@ public:  	LLPanelCameraZoom();  	/* virtual */ BOOL	postBuild(); -	/* virtual */ void	onOpen(const LLSD& key); +	/* virtual */ void	draw();  protected:  	void	onZoomPlusHeldDown(); @@ -73,7 +73,6 @@ protected:  	void	onSliderValueChanged();  private: -	F32			mSavedSliderVal;  	LLButton*	mPlusBtn;  	LLButton*	mMinusBtn;  	LLSlider*	mSlider; @@ -88,8 +87,7 @@ static LLRegisterPanelClassWrapper<LLPanelCameraZoom> t_camera_zoom_panel("camer  LLPanelCameraZoom::LLPanelCameraZoom()  :	mPlusBtn( NULL ),  	mMinusBtn( NULL ), -	mSlider( NULL ), -	mSavedSliderVal(0.f) +	mSlider( NULL )  {  	mCommitCallbackRegistrar.add("Zoom.minus", boost::bind(&LLPanelCameraZoom::onZoomPlusHeldDown, this));  	mCommitCallbackRegistrar.add("Zoom.plus", boost::bind(&LLPanelCameraZoom::onZoomMinusHeldDown, this)); @@ -101,16 +99,13 @@ BOOL LLPanelCameraZoom::postBuild()  	mPlusBtn  = getChild <LLButton> ("zoom_plus_btn");  	mMinusBtn = getChild <LLButton> ("zoom_minus_btn");  	mSlider   = getChild <LLSlider> ("zoom_slider"); -	mSlider->setMinValue(.0f); -	mSlider->setMaxValue(8.f);  	return LLPanel::postBuild();  } -void LLPanelCameraZoom::onOpen(const LLSD& key) +void LLPanelCameraZoom::draw()  { -	LLVector3d to_focus = gAgent.getPosGlobalFromAgent(LLViewerCamera::getInstance()->getOrigin()) - gAgent.calcFocusPositionTargetGlobal(); -	mSavedSliderVal = 8.f - (F32)to_focus.magVec(); // maximum minus current -	mSlider->setValue( mSavedSliderVal ); +	mSlider->setValue(gAgent.getCameraZoomFraction()); +	LLPanel::draw();  }  void LLPanelCameraZoom::onZoomPlusHeldDown() @@ -135,13 +130,8 @@ void LLPanelCameraZoom::onZoomMinusHeldDown()  void  LLPanelCameraZoom::onSliderValueChanged()  { -	F32 val	 = mSlider->getValueF32(); -	F32 rate = val - mSavedSliderVal; - -	gAgent.unlockView(); -	gAgent.cameraOrbitIn(rate); - -	mSavedSliderVal = val; +	F32 zoom_level = mSlider->getValueF32(); +	gAgent.setCameraZoomFraction(zoom_level);  }  void activate_camera_tool() diff --git a/indra/newview/llfloatergodtools.cpp b/indra/newview/llfloatergodtools.cpp index c2b0bd18fa..5294f09e64 100644 --- a/indra/newview/llfloatergodtools.cpp +++ b/indra/newview/llfloatergodtools.cpp @@ -414,17 +414,17 @@ LLPanelRegionTools::LLPanelRegionTools()  BOOL LLPanelRegionTools::postBuild()  {  	getChild<LLLineEditor>("region name")->setKeystrokeCallback(onChangeSimName, this); -	childSetPrevalidate("region name", &LLLineEditor::prevalidateASCIIPrintableNoPipe); -	childSetPrevalidate("estate", &LLLineEditor::prevalidatePositiveS32); -	childSetPrevalidate("parentestate", &LLLineEditor::prevalidatePositiveS32); +	childSetPrevalidate("region name", &LLTextValidate::validateASCIIPrintableNoPipe); +	childSetPrevalidate("estate", &LLTextValidate::validatePositiveS32); +	childSetPrevalidate("parentestate", &LLTextValidate::validatePositiveS32);  	childDisable("parentestate"); -	childSetPrevalidate("gridposx", &LLLineEditor::prevalidatePositiveS32); +	childSetPrevalidate("gridposx", &LLTextValidate::validatePositiveS32);  	childDisable("gridposx"); -	childSetPrevalidate("gridposy", &LLLineEditor::prevalidatePositiveS32); +	childSetPrevalidate("gridposy", &LLTextValidate::validatePositiveS32);  	childDisable("gridposy"); -	childSetPrevalidate("redirectx", &LLLineEditor::prevalidatePositiveS32); -	childSetPrevalidate("redirecty", &LLLineEditor::prevalidatePositiveS32); +	childSetPrevalidate("redirectx", &LLTextValidate::validatePositiveS32); +	childSetPrevalidate("redirecty", &LLTextValidate::validatePositiveS32);  	return TRUE;  } diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 8cd63deebe..26c6db9652 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -353,7 +353,7 @@ BOOL LLPanelLandGeneral::postBuild()  {  	mEditName = getChild<LLLineEditor>("Name");  	mEditName->setCommitCallback(onCommitAny, this);	 -	childSetPrevalidate("Name", LLLineEditor::prevalidateASCIIPrintableNoPipe); +	childSetPrevalidate("Name", LLTextValidate::validateASCIIPrintableNoPipe);  	mEditDesc = getChild<LLTextEditor>("Description");  	mEditDesc->setCommitOnFocusLost(TRUE); @@ -1111,7 +1111,7 @@ BOOL LLPanelLandObjects::postBuild()  	mCleanOtherObjectsTime->setFocusLostCallback(boost::bind(onLostFocus, _1, this));  	mCleanOtherObjectsTime->setCommitCallback(onCommitClean, this); -	childSetPrevalidate("clean other time", LLLineEditor::prevalidateNonNegativeS32); +	childSetPrevalidate("clean other time", LLTextValidate::validateNonNegativeS32);  	mBtnRefresh = getChild<LLButton>("Refresh List");  	mBtnRefresh->setClickedCallback(onClickRefresh, this); diff --git a/indra/newview/llfloaternamedesc.cpp b/indra/newview/llfloaternamedesc.cpp index 810761e034..159ce41b79 100644 --- a/indra/newview/llfloaternamedesc.cpp +++ b/indra/newview/llfloaternamedesc.cpp @@ -111,7 +111,7 @@ BOOL LLFloaterNameDesc::postBuild()  	if (NameEditor)  	{  		NameEditor->setMaxTextLength(DB_INV_ITEM_NAME_STR_LEN); -		NameEditor->setPrevalidate(&LLLineEditor::prevalidateASCIIPrintableNoPipe); +		NameEditor->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe);  	}  	y -= llfloor(PREVIEW_LINE_HEIGHT * 1.2f); @@ -123,7 +123,7 @@ BOOL LLFloaterNameDesc::postBuild()  	if (DescEditor)  	{  		DescEditor->setMaxTextLength(DB_INV_ITEM_DESC_STR_LEN); -		DescEditor->setPrevalidate(&LLLineEditor::prevalidateASCIIPrintableNoPipe); +		DescEditor->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe);  	}  	y -= llfloor(PREVIEW_LINE_HEIGHT * 1.2f); diff --git a/indra/newview/llfloaterpay.cpp b/indra/newview/llfloaterpay.cpp index 00959322e5..51364594e4 100644 --- a/indra/newview/llfloaterpay.cpp +++ b/indra/newview/llfloaterpay.cpp @@ -204,7 +204,7 @@ BOOL LLFloaterPay::postBuild()  	getChild<LLLineEditor>("amount")->setKeystrokeCallback(&LLFloaterPay::onKeystroke, this);  	childSetText("amount", last_amount); -	childSetPrevalidate("amount", LLLineEditor::prevalidateNonNegativeS32); +	childSetPrevalidate("amount", LLTextValidate::validateNonNegativeS32);  	info = new LLGiveMoneyInfo(this, 0);  	mCallbackData.push_back(info); diff --git a/indra/newview/llfloaterproperties.cpp b/indra/newview/llfloaterproperties.cpp index ff9002787c..bde86a4034 100644 --- a/indra/newview/llfloaterproperties.cpp +++ b/indra/newview/llfloaterproperties.cpp @@ -130,9 +130,9 @@ BOOL LLFloaterProperties::postBuild()  {  	// build the UI  	// item name & description -	childSetPrevalidate("LabelItemName",&LLLineEditor::prevalidateASCIIPrintableNoPipe); +	childSetPrevalidate("LabelItemName",&LLTextValidate::validateASCIIPrintableNoPipe);  	getChild<LLUICtrl>("LabelItemName")->setCommitCallback(boost::bind(&LLFloaterProperties::onCommitName,this)); -	childSetPrevalidate("LabelItemDesc",&LLLineEditor::prevalidateASCIIPrintableNoPipe); +	childSetPrevalidate("LabelItemDesc",&LLTextValidate::validateASCIIPrintableNoPipe);  	getChild<LLUICtrl>("LabelItemDesc")->setCommitCallback(boost::bind(&LLFloaterProperties:: onCommitDescription, this));  	// Creator information  	getChild<LLUICtrl>("BtnCreator")->setCommitCallback(boost::bind(&LLFloaterProperties::onClickCreator,this)); diff --git a/indra/newview/llfloatersellland.cpp b/indra/newview/llfloatersellland.cpp index e2b0c4b66f..9895665026 100644 --- a/indra/newview/llfloatersellland.cpp +++ b/indra/newview/llfloatersellland.cpp @@ -163,7 +163,7 @@ BOOL LLFloaterSellLandUI::postBuild()  {  	childSetCommitCallback("sell_to", onChangeValue, this);  	childSetCommitCallback("price", onChangeValue, this); -	childSetPrevalidate("price", LLLineEditor::prevalidateNonNegativeS32); +	childSetPrevalidate("price", LLTextValidate::validateNonNegativeS32);  	childSetCommitCallback("sell_objects", onChangeValue, this);  	childSetAction("sell_to_select_agent", boost::bind( &LLFloaterSellLandUI::doSelectAgent, this));  	childSetAction("cancel_btn", doCancel, this); @@ -268,7 +268,7 @@ void LLFloaterSellLandUI::refreshUI()  	std::string price_str = childGetValue("price").asString();  	bool valid_price = false; -	valid_price = (price_str != "") && LLLineEditor::prevalidateNonNegativeS32(utf8str_to_wstring(price_str)); +	valid_price = (price_str != "") && LLTextValidate::validateNonNegativeS32(utf8str_to_wstring(price_str));  	if (valid_price && mParcelActualArea > 0)  	{ diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index 5c65b2c293..57c7ba8e27 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -225,7 +225,7 @@ LLFolderView::LLFolderView(const Params& p)  	params.font(getLabelFontForStyle(LLFontGL::NORMAL));  	params.max_length_bytes(DB_INV_ITEM_NAME_STR_LEN);  	params.commit_callback.function(boost::bind(&LLFolderView::commitRename, this, _2)); -	params.prevalidate_callback(&LLLineEditor::prevalidateASCIIPrintableNoPipe); +	params.prevalidate_callback(&LLTextValidate::validateASCIIPrintableNoPipe);  	params.commit_on_focus_lost(true);  	params.visible(false);  	mRenamer = LLUICtrlFactory::create<LLLineEditor> (params); diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp index 1e46827c1a..8ca044f72b 100644 --- a/indra/newview/llpanelclassified.cpp +++ b/indra/newview/llpanelclassified.cpp @@ -242,7 +242,7 @@ BOOL LLPanelClassified::postBuild()  	mNameEditor->setCommitOnFocusLost(TRUE);  	mNameEditor->setFocusReceivedCallback(boost::bind(focusReceived, _1, this));  	mNameEditor->setCommitCallback(onCommitAny, this); -	mNameEditor->setPrevalidate( LLLineEditor::prevalidateASCII ); +	mNameEditor->setPrevalidate( LLTextValidate::validateASCII );      mDescEditor = getChild<LLTextEditor>("desc_editor");  	mDescEditor->setCommitOnFocusLost(TRUE); @@ -1072,7 +1072,7 @@ BOOL LLFloaterPriceForListing::postBuild()  	LLLineEditor* edit = getChild<LLLineEditor>("price_edit");  	if (edit)  	{ -		edit->setPrevalidate(LLLineEditor::prevalidateNonNegativeS32); +		edit->setPrevalidate(LLTextValidate::validateNonNegativeS32);  		std::string min_price = llformat("%d", MINIMUM_PRICE_FOR_LISTING);  		edit->setText(min_price);  		edit->selectAll(); diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp index 51fc670d87..3b303eed0f 100644 --- a/indra/newview/llpanelgroupgeneral.cpp +++ b/indra/newview/llpanelgroupgeneral.cpp @@ -214,7 +214,7 @@ void LLPanelGroupGeneral::setupCtrls(LLPanel* panel_group)  	}  	mFounderName = panel_group->getChild<LLNameBox>("founder_name");  	mGroupNameEditor = panel_group->getChild<LLLineEditor>("group_name_editor"); -	mGroupNameEditor->setPrevalidate( LLLineEditor::prevalidateASCII ); +	mGroupNameEditor->setPrevalidate( LLTextValidate::validateASCII );  }  // static diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index 2d5246c409..43f4024bac 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -213,8 +213,8 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,  	}  #if !USE_VIEWER_AUTH -	childSetPrevalidate("first_name_edit", LLLineEditor::prevalidateASCIIPrintableNoSpace); -	childSetPrevalidate("last_name_edit", LLLineEditor::prevalidateASCIIPrintableNoSpace); +	childSetPrevalidate("first_name_edit", LLTextValidate::validateASCIIPrintableNoSpace); +	childSetPrevalidate("last_name_edit", LLTextValidate::validateASCIIPrintableNoSpace);  	childSetCommitCallback("password_edit", mungePassword, this);  	getChild<LLLineEditor>("password_edit")->setKeystrokeCallback(onPassKey, this); diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp index 8b8b1bed37..01b6e8ffad 100644 --- a/indra/newview/llpanelpermissions.cpp +++ b/indra/newview/llpanelpermissions.cpp @@ -142,9 +142,9 @@ LLPanelPermissions::LLPanelPermissions() :  BOOL LLPanelPermissions::postBuild()  {  	childSetCommitCallback("Object Name",LLPanelPermissions::onCommitName,this); -	childSetPrevalidate("Object Name",LLLineEditor::prevalidateASCIIPrintableNoPipe); +	childSetPrevalidate("Object Name",LLTextValidate::validateASCIIPrintableNoPipe);  	childSetCommitCallback("Object Description",LLPanelPermissions::onCommitDesc,this); -	childSetPrevalidate("Object Description",LLLineEditor::prevalidateASCIIPrintableNoPipe); +	childSetPrevalidate("Object Description",LLTextValidate::validateASCIIPrintableNoPipe);  	getChild<LLUICtrl>("button set group")->setCommitCallback(boost::bind(&LLPanelPermissions::onClickGroup,this)); diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp index 2dc3a62637..479769ee20 100644 --- a/indra/newview/llpanelprimmediacontrols.cpp +++ b/indra/newview/llpanelprimmediacontrols.cpp @@ -1036,8 +1036,9 @@ void LLPanelPrimMediaControls::updateZoom()  	}  	if (zoom_padding > 0.0f) -	{ -		LLViewerMediaFocus::setCameraZoom(getTargetObject(), mTargetObjectNormal, zoom_padding); +	{	 +		// since we only zoom into medium for now, always set zoom_in constraint to true +		LLViewerMediaFocus::setCameraZoom(getTargetObject(), mTargetObjectNormal, zoom_padding, true);  	}  	// Remember the object ID/face we zoomed into, so we can update the zoom icon appropriately diff --git a/indra/newview/llpreviewanim.cpp b/indra/newview/llpreviewanim.cpp index 92bd4dc62b..0cc747f789 100644 --- a/indra/newview/llpreviewanim.cpp +++ b/indra/newview/llpreviewanim.cpp @@ -79,7 +79,7 @@ BOOL LLPreviewAnim::postBuild()  	childSetAction("Anim audition btn",auditionAnim, this);  	childSetCommitCallback("desc", LLPreview::onText, this); -	childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe); +	childSetPrevalidate("desc", &LLTextValidate::validateASCIIPrintableNoPipe);  	return LLPreview::postBuild();  } diff --git a/indra/newview/llpreviewgesture.cpp b/indra/newview/llpreviewgesture.cpp index 53e351e66e..57a8ca3d12 100644 --- a/indra/newview/llpreviewgesture.cpp +++ b/indra/newview/llpreviewgesture.cpp @@ -472,7 +472,7 @@ BOOL LLPreviewGesture::postBuild()  	edit = getChild<LLLineEditor>("wait_time_editor");  	edit->setEnabled(FALSE);  	edit->setVisible(FALSE); -	edit->setPrevalidate(LLLineEditor::prevalidateFloat); +	edit->setPrevalidate(LLTextValidate::validateFloat);  //	edit->setKeystrokeCallback(onKeystrokeCommit, this);  	edit->setCommitOnFocusLost(TRUE);  	edit->setCommitCallback(onCommitWaitTime, this); @@ -504,10 +504,10 @@ BOOL LLPreviewGesture::postBuild()  	if (item)   	{  		childSetText("desc", item->getDescription()); -		childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe); +		childSetPrevalidate("desc", &LLTextValidate::validateASCIIPrintableNoPipe);  		childSetText("name", item->getName()); -		childSetPrevalidate("name", &LLLineEditor::prevalidateASCIIPrintableNoPipe); +		childSetPrevalidate("name", &LLTextValidate::validateASCIIPrintableNoPipe);  	}  	return LLPreview::postBuild(); diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp index cc70360528..ee8e3f1db6 100644 --- a/indra/newview/llpreviewnotecard.cpp +++ b/indra/newview/llpreviewnotecard.cpp @@ -95,7 +95,7 @@ BOOL LLPreviewNotecard::postBuild()  	childSetCommitCallback("desc", LLPreview::onText, this);  	if (item)  		childSetText("desc", item->getDescription()); -	childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe); +	childSetPrevalidate("desc", &LLTextValidate::validateASCIIPrintableNoPipe);  	return LLPreview::postBuild();  } diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp index 7bcbe334ff..a8feaf690d 100644 --- a/indra/newview/llpreviewscript.cpp +++ b/indra/newview/llpreviewscript.cpp @@ -955,7 +955,7 @@ BOOL LLPreviewLSL::postBuild()  	childSetCommitCallback("desc", LLPreview::onText, this);  	childSetText("desc", item->getDescription()); -	childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe); +	childSetPrevalidate("desc", &LLTextValidate::validateASCIIPrintableNoPipe);  	return LLPreview::postBuild();  } diff --git a/indra/newview/llpreviewsound.cpp b/indra/newview/llpreviewsound.cpp index d7fd252fb6..44b828854b 100644 --- a/indra/newview/llpreviewsound.cpp +++ b/indra/newview/llpreviewsound.cpp @@ -75,7 +75,7 @@ BOOL	LLPreviewSound::postBuild()  	button->setSoundFlags(LLView::SILENT);  	childSetCommitCallback("desc", LLPreview::onText, this); -	childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe);	 +	childSetPrevalidate("desc", &LLTextValidate::validateASCIIPrintableNoPipe);	  	return LLPreview::postBuild();  } diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp index dfc67d0126..0ed6bea74f 100644 --- a/indra/newview/llpreviewtexture.cpp +++ b/indra/newview/llpreviewtexture.cpp @@ -126,7 +126,7 @@ BOOL LLPreviewTexture::postBuild()  		{  			childSetCommitCallback("desc", LLPreview::onText, this);  			childSetText("desc", item->getDescription()); -			childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe); +			childSetPrevalidate("desc", &LLTextValidate::validateASCIIPrintableNoPipe);  		}  	} diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp index 94fe95d215..44348ba429 100644 --- a/indra/newview/llsidepaneliteminfo.cpp +++ b/indra/newview/llsidepaneliteminfo.cpp @@ -109,9 +109,9 @@ BOOL LLSidepanelItemInfo::postBuild()  {  	LLSidepanelInventorySubpanel::postBuild(); -	childSetPrevalidate("LabelItemName",&LLLineEditor::prevalidateASCIIPrintableNoPipe); +	childSetPrevalidate("LabelItemName",&LLTextValidate::validateASCIIPrintableNoPipe);  	getChild<LLUICtrl>("LabelItemName")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitName,this)); -	childSetPrevalidate("LabelItemDesc",&LLLineEditor::prevalidateASCIIPrintableNoPipe); +	childSetPrevalidate("LabelItemDesc",&LLTextValidate::validateASCIIPrintableNoPipe);  	getChild<LLUICtrl>("LabelItemDesc")->setCommitCallback(boost::bind(&LLSidepanelItemInfo:: onCommitDescription, this));  	// Creator information  	getChild<LLUICtrl>("BtnCreator")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onClickCreator,this)); diff --git a/indra/newview/llsidepaneltaskinfo.cpp b/indra/newview/llsidepaneltaskinfo.cpp index 0b8f66c5f3..0630981d7e 100644 --- a/indra/newview/llsidepaneltaskinfo.cpp +++ b/indra/newview/llsidepaneltaskinfo.cpp @@ -104,9 +104,9 @@ BOOL LLSidepanelTaskInfo::postBuild()  	mLabelGroupName = getChild<LLNameBox>("Group Name Proxy");  	childSetCommitCallback("Object Name",						LLSidepanelTaskInfo::onCommitName,this); -	childSetPrevalidate("Object Name",							LLLineEditor::prevalidateASCIIPrintableNoPipe); +	childSetPrevalidate("Object Name",							LLTextValidate::validateASCIIPrintableNoPipe);  	childSetCommitCallback("Object Description",				LLSidepanelTaskInfo::onCommitDesc,this); -	childSetPrevalidate("Object Description",					LLLineEditor::prevalidateASCIIPrintableNoPipe); +	childSetPrevalidate("Object Description",					LLTextValidate::validateASCIIPrintableNoPipe);  	getChild<LLUICtrl>("button set group")->setCommitCallback(boost::bind(&LLSidepanelTaskInfo::onClickGroup,this));  	childSetCommitCallback("checkbox share with group",			&LLSidepanelTaskInfo::onCommitGroupShare,this);  	childSetAction("button deed",								&LLSidepanelTaskInfo::onClickDeedToGroup,this); diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp index a0ac9c2091..f508a3462a 100644 --- a/indra/newview/llviewermediafocus.cpp +++ b/indra/newview/llviewermediafocus.cpp @@ -157,7 +157,6 @@ void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 fac  			mFocusedObjectFace = 0;  		}  	} -	  }  void LLViewerMediaFocus::clearFocus() @@ -198,7 +197,7 @@ bool LLViewerMediaFocus::getFocus()  }  // This function selects an ideal viewing distance based on the focused object, pick normal, and padding value -void LLViewerMediaFocus::setCameraZoom(LLViewerObject* object, LLVector3 normal, F32 padding_factor) +void LLViewerMediaFocus::setCameraZoom(LLViewerObject* object, LLVector3 normal, F32 padding_factor, bool zoom_in_only)  {  	if (object)  	{ @@ -269,7 +268,16 @@ void LLViewerMediaFocus::setCameraZoom(LLViewerObject* object, LLVector3 normal,              camera_pos += 0.01 * len * delta;          } +		// If we are not allowing zooming out and the old camera position is closer to  +		// the center then the new intended camera position, don't move camera and return +		if (zoom_in_only && +		    (dist_vec_squared(gAgent.getCameraPositionGlobal(), target_pos) < dist_vec_squared(camera_pos, target_pos))) +		{ +			return; +		} +  		gAgent.setCameraPosAndFocusGlobal(camera_pos, target_pos, object->getID() ); +  	}  	else  	{ diff --git a/indra/newview/llviewermediafocus.h b/indra/newview/llviewermediafocus.h index 89ee0ae283..002044ea2e 100644 --- a/indra/newview/llviewermediafocus.h +++ b/indra/newview/llviewermediafocus.h @@ -66,7 +66,7 @@ public:  	void update(); -	static void setCameraZoom(LLViewerObject* object, LLVector3 normal, F32 padding_factor); +	static void setCameraZoom(LLViewerObject* object, LLVector3 normal, F32 padding_factor, bool zoom_in_only = false);  	static F32 getBBoxAspectRatio(const LLBBox& bbox, const LLVector3& normal, F32* height, F32* width, F32* depth);  	bool isFocusedOnFace(LLPointer<LLViewerObject> objectp, S32 face); diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index a075a706e1..07c8867e26 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -1762,6 +1762,12 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use  						{  							optionally_start_music(music_url);  						} +						else +						{ +							llinfos << "Stopping parcel music (invalid audio stream URL)" << llendl; +							// clears the URL  +							gAudiop->startInternetStream(LLStringUtil::null);  +						}  					}  					else if (!gAudiop->getInternetStreamURL().empty())  					{ diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 315b7c52cf..4a86e1ca41 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1726,7 +1726,11 @@ void LLViewerWindow::shutdownViews()  	// destroy the nav bar, not currently part of gViewerWindow  	// *TODO: Make LLNavigationBar part of gViewerWindow  	delete LLNavigationBar::getInstance(); -	 + +	// destroy menus after instantiating navbar above, as it needs +	// access to gMenuHolder +	cleanup_menus(); +  	// Delete all child views.  	delete mRootView;  	mRootView = NULL; diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index a5815df20a..b5f0ec7176 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -565,7 +565,7 @@ public:  	void 			updateMeshData();  protected:  	void 			releaseMeshData(); -	/*virtual*/ void restoreMeshData(); +	virtual void restoreMeshData();  private:  	BOOL 			mDirtyMesh;  	BOOL			mMeshTexturesDirty; diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index ccf49f6a9f..309c2a5f30 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -143,12 +143,12 @@ with the same filename but different name    <texture name="DownArrow" file_name="bottomtray/DownArrow.png" preload="false" /> -  <texture name="DropDown_Disabled" file_name="widgets/DropDown_Disabled.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> -  <texture name="DropDown_Over" file_name="widgets/DropDown_Over.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> -  <texture name="DropDown_Press" file_name="widgets/DropDown_Press.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> -  <texture name="DropDown_Selected" file_name="widgets/DropDown_Selected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> -  <texture name="DropDown_On" file_name="widgets/DropDown_On.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> -  <texture name="DropDown_Off" file_name="widgets/DropDown_Off.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> +  <texture name="DropDown_Disabled" file_name="widgets/DropDown_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" /> +  <texture name="DropDown_Over" file_name="widgets/DropDown_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" /> +  <texture name="DropDown_Press" file_name="widgets/DropDown_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" /> +  <texture name="DropDown_Selected" file_name="widgets/DropDown_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" /> +  <texture name="DropDown_On" file_name="widgets/DropDown_On.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" /> +  <texture name="DropDown_Off" file_name="widgets/DropDown_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" />    <texture name="DropTarget" file_name="widgets/DropTarget.png" preload="false" /> @@ -265,8 +265,8 @@ with the same filename but different name    <texture name="Linden_Dollar_Alert" file_name="widgets/Linden_Dollar_Alert.png"/>    <texture name="Linden_Dollar_Background" file_name="widgets/Linden_Dollar_Background.png"/> -  <texture name="ListItem_Select" file_name="widgets/ListItem_Select.png" preload="true" /> -  <texture name="ListItem_Over" file_name="widgets/ListItem_Over.png" preload="true" /> +  <texture name="ListItem_Select" file_name="widgets/ListItem_Select.png" preload="true" scale.left="2" scale.bottom="2" scale.top="22" scale.right="278" /> +  <texture name="ListItem_Over" file_name="widgets/ListItem_Over.png" preload="true" scale.left="2" scale.bottom="2" scale.top="22" scale.right="278" />    <texture name="Lock" file_name="icons/Lock.png" preload="false" />    <texture name="Lock2" file_name="navbar/Lock.png" preload="false" /> diff --git a/indra/newview/skins/default/xui/en/floater_camera.xml b/indra/newview/skins/default/xui/en/floater_camera.xml index a797d54749..2bd8420925 100644 --- a/indra/newview/skins/default/xui/en/floater_camera.xml +++ b/indra/newview/skins/default/xui/en/floater_camera.xml @@ -82,6 +82,8 @@                orientation="vertical"                tool_tip="Zoom camera toward focus"                top_pad="0" +              min_val="0" +              max_val="1"                 width="18">               <commit_callback function="Slider.value_changed"/>             </slider_bar> diff --git a/indra/newview/skins/default/xui/en/floater_test_text_editor.xml b/indra/newview/skins/default/xui/en/floater_test_text_editor.xml index dc8f00d5f3..b730f0e511 100644 --- a/indra/newview/skins/default/xui/en/floater_test_text_editor.xml +++ b/indra/newview/skins/default/xui/en/floater_test_text_editor.xml @@ -28,4 +28,17 @@     width="200">      This contains long text and should scroll horizontally to the right    </text_editor> +  <text_editor +   height="50" +   follows="top|left|bottom" +   font="SansSerif" +   left="10" +   name="numeric_text_editor" +   tool_tip="text editor for numeric text entry only" +   top_pad="10" +   text_type="int" +   width="200"> +    This is text that is NOT a number, so shouldn't appear +  </text_editor> +  </floater> diff --git a/indra/newview/skins/default/xui/en/panel_chat_header.xml b/indra/newview/skins/default/xui/en/panel_chat_header.xml index 89d632c4c6..51e2256a7d 100644 --- a/indra/newview/skins/default/xui/en/panel_chat_header.xml +++ b/indra/newview/skins/default/xui/en/panel_chat_header.xml @@ -19,7 +19,7 @@           name="avatar_icon"           top="3"           width="18" /> -    <text_editor +    <text        allow_scroll="false"        v_pad = "7"        read_only = "true" diff --git a/indra/newview/skins/default/xui/en/panel_classified_info.xml b/indra/newview/skins/default/xui/en/panel_classified_info.xml index 31719aad20..34c1923582 100644 --- a/indra/newview/skins/default/xui/en/panel_classified_info.xml +++ b/indra/newview/skins/default/xui/en/panel_classified_info.xml @@ -29,7 +29,7 @@       layout="topleft"       name="back_btn"       picture_style="true" -     left="10" +     left="11"       tab_stop="false"       top="2"       width="23" /> @@ -40,7 +40,7 @@       layout="topleft"       left_pad="10"       name="title" -     text_color="white" +     text_color="LtGray"       top="0"       value="Classified Info"       use_ellipses="true" @@ -49,13 +49,13 @@       color="DkGray2"       opaque="true"       follows="all" -     height="500" +     height="502"       layout="topleft" -     left="10" +     left="9"       top_pad="10"       name="profile_scroll"       reserve_scroll_corner="false" -     width="313"> +     width="310">      <panel       name="scroll_content_panel"       follows="left|top" @@ -65,16 +65,16 @@       background_visible="false"       height="500"       left="0" -     width="295"> +     width="285">          <texture_picker           enabled="false" -         follows="left|top" +         follows="left|top|right"           height="197"           layout="topleft" -         left="10" +         left="11"           name="classified_snapshot" -         top="20" -         width="290" /> +         top="10" +         width="286" />          <text_editor           allow_scroll="false"           bg_visible="false" @@ -181,37 +181,35 @@      </scroll_container>      <panel       follows="left|right|bottom" -     height="20" +     height="35"       layout="topleft" -     top_pad="8" -     left="10" +     top_pad="5" +     left="9"       name="buttons">          <button           follows="bottom|left" -         height="19" +         height="23"           label="Teleport"           layout="topleft"           left="0"           name="teleport_btn"           top="0" -         width="90" /> +         width="101" />          <button           follows="bottom|left" -         height="19" +         height="23"           label="Map"           layout="topleft" -         left_pad="10" +         left_pad="3"           name="show_on_map_btn" -         top="0" -         width="90" /> +         width="100" />          <button           follows="bottom|left" -         height="19" +         height="23"           label="Edit"           layout="topleft" -         right="-1"           name="edit_btn" -         top="0" -         width="90" /> +         left_pad="3" +         width="101" />      </panel>  </panel> diff --git a/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml b/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml index 9518151b72..1375eb87d9 100644 --- a/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml +++ b/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml @@ -76,6 +76,6 @@       left_pad="5"       right="-8"       name="info_chevron" -     top_delta="15" +     top_delta="24"       width="20" />  </panel> diff --git a/indra/newview/skins/default/xui/en/panel_edit_classified.xml b/indra/newview/skins/default/xui/en/panel_edit_classified.xml index 188ded3dab..a357ba1d97 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_classified.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_classified.xml @@ -23,7 +23,7 @@       layout="topleft"       name="back_btn"       picture_style="true" -     left="10" +     left="11"       tab_stop="false"       top="2"       width="23" /> @@ -31,27 +31,27 @@       type="string"       length="1"       follows="top" -     font="SansSerifHuge" -     height="15" +     font="SansSerifHugeBold" +     height="26"       layout="topleft"       left_pad="10"       name="title" -     text_color="white" -     top="5" +     text_color="LtGray" +     top="0"       width="250">          Edit Classified      </text>     <scroll_container       color="DkGray2"       follows="all" -     height="510" +     height="502"       layout="topleft" -     left="10" +     left="9"       top_pad="10"       name="profile_scroll"       reserve_scroll_corner="false"       opaque="true" -     width="313"> +     width="310">      <panel       name="scroll_content_panel"       follows="left|top" @@ -65,10 +65,10 @@      <texture_picker       follows="left|top|right"       height="197" -     width="290" +     width="286"       layout="topleft" -     top="20" -     left="10" +     top="10" +     left="11"       name="classified_snapshot" />            <icon             height="18" @@ -78,7 +78,7 @@             name="edit_icon"             label=""             tool_tip="Click to select an image" -           top="27" +           top="17"             width="18" />          <text           type="string" @@ -165,29 +165,29 @@          </text>          <button           follows="left|top" -         height="20" +         height="23"           label="Set to Current Location"           layout="topleft" -         left="8" +         left="10"           top_pad="5"           name="set_to_curr_location_btn" -         width="200" /> +         width="156" />          <combo_box           follows="left|top"  -         height="18"  +         height="23"            label=""  	     left="10"            name="category"            top_pad="5" -         width="200" /> +         width="156" />          <combo_box            allow_text_entry="false"            follows="left|top"  -         height="18"  +         height="23"            left="10"           name="content_type"            top_pad="5" -         width="200"> +         width="156">           <combo_item             name="mature_ci"             value="Mature"> @@ -203,10 +203,11 @@           decimal_digits="0"           follows="left|top"           halign="left" -         height="16" +         height="23"           increment="1"           label_width="20"           label="L$" +         v_pad="10"           layout="topleft"           left="10"           value="50" @@ -228,30 +229,29 @@      </scroll_container>      <panel       follows="left|right|bottom" -     height="20" +     height="23"       label="bottom_panel"       layout="topleft" -     left="10" +     left="9"       name="bottom_panel"       top_pad="5"       width="303">          <button           follows="bottom|left" -         height="19" +         height="23"           label="Save"           layout="topleft"           name="save_changes_btn"           left="0"           top="0" -         width="130" /> +         width="152" />          <button           follows="bottom|left" -         height="19" +         height="23"           label="Cancel"           layout="topleft"           name="cancel_btn" -         left_pad="5" -         right="-1" -         width="130" /> +         left_pad="3" +         width="152" />      </panel>  </panel> diff --git a/indra/newview/skins/default/xui/en/panel_edit_pick.xml b/indra/newview/skins/default/xui/en/panel_edit_pick.xml index 8e39697a16..6ef762dc1d 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_pick.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_pick.xml @@ -18,7 +18,7 @@       image_overlay="BackArrow_Off"       layout="topleft"       name="back_btn" -     left="10" +     left="11"       tab_stop="false"       top="2"       width="23" /> @@ -26,26 +26,26 @@       type="string"       length="1"       follows="top" -     font="SansSerifHuge" -     height="15" +     font="SansSerifHugeBold" +     height="26"       layout="topleft"       left_pad="10"       name="title" -     text_color="white" -     top="5" +     text_color="LtGray" +     top="0"       width="250">          Edit Pick      </text>     <scroll_container       color="DkGray2"       follows="all" -     height="500" +     height="502"       layout="topleft" -     left="10" +     left="9"       top_pad="10"       name="profile_scroll"       opaque="true" -     width="313"> +     width="310">      <panel       name="scroll_content_panel"       follows="left|top|right" @@ -59,11 +59,11 @@      <texture_picker       follows="left|top|right"       height="197" -     width="280" +     width="272"       layout="topleft"       no_commit_on_selection="true" -     top="20" -     left="10" +     top="10" +     left="11"       name="pick_snapshot" />            <icon             height="18" @@ -73,7 +73,7 @@             name="edit_icon"             label=""             tool_tip="Click to select an image" -           top="27" +           top="17"             width="18" />          <text           type="string" @@ -100,7 +100,7 @@           max_length="63"           name="pick_name"           text_color="black" -         width="280" /> +         width="273" />          <text           type="string"           length="1" @@ -119,7 +119,7 @@          <text_editor           follows="left|top|right"           height="100" -         width="280" +         width="273"           hide_scrollbar="false"           layout="topleft"           left="10" @@ -158,41 +158,40 @@          </text>          <button           follows="left|top" -         height="20" +         height="23"           label="Set to Current Location"           layout="topleft"           left="8"           top_pad="0"           name="set_to_curr_location_btn" -         width="200" /> +         width="156" />      </panel>      </scroll_container>      <panel       follows="left|right|bottom" -     height="20" +     height="23"       label="bottom_panel"       layout="topleft" -     left="10" +     left="9"       name="bottom_panel"       top_pad="5"       width="303">          <button           follows="bottom|left" -         height="19" +         height="23"           label="Save [WHAT]"           layout="topleft"           name="save_changes_btn"           left="0"           top="0" -         width="130" /> +         width="152" />          <button           follows="bottom|left" -         height="19" +         height="23"           label="Cancel"           layout="topleft"           name="cancel_btn" -         left_pad="5" -         right="-1" -         width="130" /> +         left_pad="3" +        width="152" />      </panel>  </panel> diff --git a/indra/newview/skins/default/xui/en/panel_pick_info.xml b/indra/newview/skins/default/xui/en/panel_pick_info.xml index 375f369ba7..097813131f 100644 --- a/indra/newview/skins/default/xui/en/panel_pick_info.xml +++ b/indra/newview/skins/default/xui/en/panel_pick_info.xml @@ -16,7 +16,7 @@       image_overlay="BackArrow_Off"       layout="topleft"       name="back_btn" -     left="10" +     left="11"       tab_stop="false"       top="2"       width="23" /> @@ -27,7 +27,7 @@       layout="topleft"       left_pad="10"       name="title" -     text_color="white" +     text_color="LtGray"       top="0"       value="Pick Info"       use_ellipses="true" @@ -36,12 +36,12 @@       color="DkGray2"       opaque="true"       follows="all" -     height="500" +     height="502"       layout="topleft" -     left="10" -     top_pad="5" +     left="9" +     top_pad="10"       name="profile_scroll" -     width="313"> +     width="310">      <panel       name="scroll_content_panel"       follows="left|top|right" @@ -57,10 +57,10 @@           follows="left|top|right"           height="197"           layout="topleft" -         left="10" +         left="11"           name="pick_snapshot" -         top="20" -         width="280" /> +         top="10" +         width="272" />          <text_editor           allow_scroll="false"           bg_visible="false" @@ -115,8 +115,8 @@       follows="left|right|bottom"       height="35"       layout="topleft" -     top_pad="8" -     left="10" +     top_pad="5" +     left="9"       name="buttons">          <button           follows="bottom|left" @@ -126,24 +126,22 @@           left="0"           name="teleport_btn"           top="0" -         width="90" /> +         width="101" />          <button           follows="bottom|left"           height="23"           label="Map"           layout="topleft" -         left_pad="10" +         left_pad="3"           name="show_on_map_btn" -         top="0" -         width="90" /> +         width="100" />          <button           follows="bottom|left"           height="23"           label="Edit"           layout="topleft" -         right="-1"           name="edit_btn" -         top="0" -         width="90" /> +         left_pad="3" +         width="101" />      </panel>  </panel> diff --git a/indra/newview/skins/default/xui/en/panel_pick_list_item.xml b/indra/newview/skins/default/xui/en/panel_pick_list_item.xml index 9bcce1685e..8b25fb5d2a 100644 --- a/indra/newview/skins/default/xui/en/panel_pick_list_item.xml +++ b/indra/newview/skins/default/xui/en/panel_pick_list_item.xml @@ -76,6 +76,6 @@       left_pad="5"       right="-8"       name="info_chevron" -     top_delta="15" +     top_delta="24"       width="20" />  </panel> diff --git a/indra/newview/skins/default/xui/en/panel_picks.xml b/indra/newview/skins/default/xui/en/panel_picks.xml index d31f4d039f..887a89d518 100644 --- a/indra/newview/skins/default/xui/en/panel_picks.xml +++ b/indra/newview/skins/default/xui/en/panel_picks.xml @@ -1,5 +1,8 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <panel +bg_opaque_color="DkGray2" +       background_visible="true" +       background_opaque="true"   follows="all"   height="540"   label="Picks" @@ -70,13 +73,15 @@      </accordion_tab>   </accordion>     <panel -         background_visible="true" +bg_opaque_color="DkGray2" +       background_visible="true" +       background_opaque="true"           bevel_style="none"           enabled="false"           auto_resize="false"           follows="bottom" -         left="0" -         height="18" +         left="1" +         height="27"           label="bottom_panel"           layout="topleft"           name="edit_panel" @@ -90,9 +95,9 @@               image_unselected="OptionsMenu_Off"                image_disabled="OptionsMenu_Disabled"               layout="topleft" -             left="0" +             left="10"               name="gear_menu_btn" -             top="5" +             top="9"               width="18" />              <button               follows="bottom|left" @@ -104,7 +109,7 @@               left_pad="15"               name="new_btn"               tool_tip="Create a new pick or classified at the current location" -             top="5" +             top="9"               width="18" />              <button               follows="bottom|right" @@ -115,14 +120,17 @@               layout="topleft"               name="trash_btn"               right="-10" -             top="5" +             top="9"               width="18" />          </panel>          <panel + bg_opaque_color="DkGray" +       background_visible="true" +       background_opaque="true"           layout="topleft"           left="0"           height="30" -         top_pad="10" +         top_pad="7"           name="buttons_cucks"           width="313">         <button @@ -131,35 +139,33 @@           height="23"           label="Info"           layout="topleft" -         left="5" +         left="2"           name="info_btn"           tab_stop="false"           tool_tip="Show pick information" -         top="0" -         width="55" /> +         top="5" +         width="95" />          <button           enabled="false"           follows="bottom|left"           height="23"           label="Teleport"           layout="topleft" -         left_pad="5" +         left_pad="3"           name="teleport_btn"           tab_stop="false"           tool_tip="Teleport to the corresponding area" -         top="0" -         width="77" /> +         width="117" />          <button           enabled="false"           follows="bottom|left"           height="23"           label="Map"           layout="topleft" -         left_pad="5" +         left_pad="3"           name="show_on_map_btn"           tab_stop="false"           tool_tip="Show the corresponding area on the World Map" -         top="0" -         width="50" /> +         width="90" />          </panel>  </panel> diff --git a/indra/newview/skins/default/xui/en/widgets/inspector.xml b/indra/newview/skins/default/xui/en/widgets/inspector.xml index 8ec206023e..23f32253b6 100644 --- a/indra/newview/skins/default/xui/en/widgets/inspector.xml +++ b/indra/newview/skins/default/xui/en/widgets/inspector.xml @@ -1,10 +1,9 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<!-- See also settings.xml UIFloater* settings for configuration -->  <inspector name="inspector" -          bg_opaque_color="DkGray_66" -          background_visible="true" -          bg_opaque_image="none" -          background_opaque="true" -          bg_alpha_image="none" -		  text_color="InspectorTipTextColor" - /> +           bg_opaque_color="DkGray_66" +           background_visible="true" +           bg_opaque_image="none" +           background_opaque="true" +           bg_alpha_image="none" +           mouse_opaque="true"  +           text_color="InspectorTipTextColor"/> diff --git a/indra/newview/skins/default/xui/en/widgets/tool_tip.xml b/indra/newview/skins/default/xui/en/widgets/tool_tip.xml index a19201f7c3..9ca15ae50d 100644 --- a/indra/newview/skins/default/xui/en/widgets/tool_tip.xml +++ b/indra/newview/skins/default/xui/en/widgets/tool_tip.xml @@ -1,12 +1,11 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<!-- See also settings.xml UIFloater* settings for configuration -->  <tool_tip name="tooltip"            max_width="200"            padding="4"            wrap="true"            font="SansSerif" +          mouse_opaque="false"             bg_opaque_image="Tooltip"            background_opaque="true"            background_visible="true" -		  text_color="ToolTipTextColor" - /> +		      text_color="ToolTipTextColor"/>  | 
