Commits

log_linden  committed d79e94c Merge

Merge.

  • Participants
  • Parent commits f77164d, 478aabd

Comments (0)

Files changed (118)

 ac0f1a132d35c02a58861d37cca75b0429ac9137 2.8.3-start
 599677276b227357140dda35bea4a2c18e2e67b5 DRTVWR-75_2.8.3-beta1
 599677276b227357140dda35bea4a2c18e2e67b5 2.8.3-beta1
+fb85792b84bf28428889c4cc966469d92e5dac4c DRTVWR-74_2.8.3-release
+fb85792b84bf28428889c4cc966469d92e5dac4c 2.8.3-release
 46a010f4885a9d223b511eac553ba5720284b1dc 3.0.0-start
+b0be6ce3adfef3a014a2389d360539f8a86c5439 DRTVWR-78_3.0.0-beta1
+b0be6ce3adfef3a014a2389d360539f8a86c5439 3.0.0-beta1
 46a010f4885a9d223b511eac553ba5720284b1dc 3.0.0-start
 6b678ea52f90d5c14181661dcd2546e25bde483e 3.0.0-start
+82a2079ffcb57ecb1b3849cb41376b443e1eb912 3.0.1-start

File doc/contributions.txt

 Zeja Pyle
 ZenMondo Wormser
 Zi Ree
+	SH-489
 	VWR-423
 	VWR-671
 	VWR-682
 	VWR-684
 	VWR-9127
 	VWR-1140
+	VWR-24017
+	VWR-25588
 Zipherius Turas
 	VWR-76
 	VWR-77

File indra/llcommon/llsdserialize.cpp

 LLSDParser::~LLSDParser()
 { }
 
+LLFastTimer::DeclareTimer FTM_SD_PARSE("LLSD Parsing");
 S32 LLSDParser::parse(std::istream& istr, LLSD& data, S32 max_bytes)
 {
+	LLFastTimer _(FTM_SD_PARSE);
 	mCheckLimits = (LLSDSerialize::SIZE_UNLIMITED == max_bytes) ? false : true;
 	mMaxBytesLeft = max_bytes;
 	return doParse(istr, data);

File indra/llcommon/llsdserialize_xml.cpp

 	return count;
 }
 
+LLFastTimer::DeclareTimer FTM_SD_PARSE_READ_STREAM("LLSD Read Stream");
 S32 LLSDXMLParser::Impl::parse(std::istream& input, LLSD& data)
 {
 	XML_Status status;
 		{
 			break;
 		}
-		count = get_till_eol(input, (char *)buffer, BUFFER_SIZE);
-		if (!count)
-		{
-			break;
+		{ LLFastTimer _(FTM_SD_PARSE_READ_STREAM);
+		
+			count = get_till_eol(input, (char *)buffer, BUFFER_SIZE);
+			if (!count)
+			{
+				break;
+			}
 		}
 		status = XML_ParseBuffer(mParser, count, false);
 

File indra/llcommon/llsys.cpp

 #	include <sys/utsname.h>
 #	include <stdint.h>
 #	include <Carbon/Carbon.h>
-#   include <sys/wait.h>
-#   include <string.h>
 #   include <stdexcept>
+#	include <mach/host_info.h>
+#	include <mach/mach_host.h>
+#	include <mach/task.h>
+#	include <mach/task_info.h>
 #elif LL_LINUX
 #	include <errno.h>
 #	include <sys/utsname.h>
 	stats.add("PrivateUsage KB",               pmem.PrivateUsage/1024);
 
 #elif LL_DARWIN
-	uint64_t phys = 0;
 
-	size_t len = sizeof(phys);	
+	const vm_size_t pagekb(vm_page_size / 1024);
 	
-	if (sysctlbyname("hw.memsize", &phys, &len, NULL, 0) == 0)
+	//
+	// Collect the vm_stat's
+	//
+	
 	{
-		stats.add("Total Physical KB", phys/1024);
+		vm_statistics_data_t vmstat;
+		mach_msg_type_number_t vmstatCount = HOST_VM_INFO_COUNT;
+
+		if (host_statistics(mach_host_self(), HOST_VM_INFO, (host_info_t) &vmstat, &vmstatCount) != KERN_SUCCESS)
+	{
+			LL_WARNS("LLMemoryInfo") << "Unable to collect memory information" << LL_ENDL;
+		}
+		else
+		{
+			stats.add("Pages free KB",		pagekb * vmstat.free_count);
+			stats.add("Pages active KB",	pagekb * vmstat.active_count);
+			stats.add("Pages inactive KB",	pagekb * vmstat.inactive_count);
+			stats.add("Pages wired KB",		pagekb * vmstat.wire_count);
+
+			stats.add("Pages zero fill",		vmstat.zero_fill_count);
+			stats.add("Page reactivations",		vmstat.reactivations);
+			stats.add("Page-ins",				vmstat.pageins);
+			stats.add("Page-outs",				vmstat.pageouts);
+			
+			stats.add("Faults",					vmstat.faults);
+			stats.add("Faults copy-on-write",	vmstat.cow_faults);
+			
+			stats.add("Cache lookups",			vmstat.lookups);
+			stats.add("Cache hits",				vmstat.hits);
+			
+			stats.add("Page purgeable count",	vmstat.purgeable_count);
+			stats.add("Page purges",			vmstat.purges);
+			
+			stats.add("Page speculative reads",	vmstat.speculative_count);
+		}
 	}
-	else
-	{
-		LL_WARNS("LLMemoryInfo") << "Unable to collect hw.memsize memory information" << LL_ENDL;
+
+	//
+	// Collect the misc task info
+	//
+
+		{
+		task_events_info_data_t taskinfo;
+		unsigned taskinfoSize = sizeof(taskinfo);
+		
+		if (task_info(mach_task_self(), TASK_EVENTS_INFO, (task_info_t) &taskinfo, &taskinfoSize) != KERN_SUCCESS)
+					{
+			LL_WARNS("LLMemoryInfo") << "Unable to collect task information" << LL_ENDL;
+			}
+			else
+			{
+			stats.add("Task page-ins",					taskinfo.pageins);
+			stats.add("Task copy-on-write faults",		taskinfo.cow_faults);
+			stats.add("Task messages sent",				taskinfo.messages_sent);
+			stats.add("Task messages received",			taskinfo.messages_received);
+			stats.add("Task mach system call count",	taskinfo.syscalls_mach);
+			stats.add("Task unix system call count",	taskinfo.syscalls_unix);
+			stats.add("Task context switch count",		taskinfo.csw);
+			}
+	}	
+	
+	//
+	// Collect the basic task info
+	//
+
+		{
+		task_basic_info_64_data_t taskinfo;
+		unsigned taskinfoSize = sizeof(taskinfo);
+		
+		if (task_info(mach_task_self(), TASK_BASIC_INFO_64, (task_info_t) &taskinfo, &taskinfoSize) != KERN_SUCCESS)
+			{
+			LL_WARNS("LLMemoryInfo") << "Unable to collect task information" << LL_ENDL;
+				}
+				else
+				{
+			stats.add("Basic suspend count",					taskinfo.suspend_count);
+			stats.add("Basic virtual memory KB",				taskinfo.virtual_size / 1024);
+			stats.add("Basic resident memory KB",				taskinfo.resident_size / 1024);
+			stats.add("Basic new thread policy",				taskinfo.policy);
+		}
 	}
 
 #elif LL_SOLARIS

File indra/llcommon/llversionviewer.h

 
 const S32 LL_VERSION_MAJOR = 3;
 const S32 LL_VERSION_MINOR = 0;
-const S32 LL_VERSION_PATCH = 1;
+const S32 LL_VERSION_PATCH = 2;
 const S32 LL_VERSION_BUILD = 0;
 
 const char * const LL_CHANNEL = "Second Life Developer";

File indra/llinventory/llinventory.cpp

 	sd[INV_CREATION_DATE_LABEL] = (S32) mCreationDate;
 }
 
+LLFastTimer::DeclareTimer FTM_INVENTORY_SD_DESERIALIZE("Inventory SD Deserialize");
+
 bool LLInventoryItem::fromLLSD(const LLSD& sd)
 {
+	LLFastTimer _(FTM_INVENTORY_SD_DESERIALIZE);
 	mInventoryType = LLInventoryType::IT_NONE;
 	mAssetUUID.setNull();
 	std::string w;

File indra/llplugin/llpluginprocesschild.cpp

 			}
 			else if(message_name == "sleep_time")
 			{
-				mSleepTime = parsed.getValueReal("time");
+				mSleepTime = llmax(parsed.getValueReal("time"), 1.0 / 100.0); // clamp to maximum of 100Hz
 			}
 			else if(message_name == "crash")
 			{

File indra/llplugin/llpluginprocessparent.cpp

 				}
 				
 				// Send initial sleep time
+				llassert_always(mSleepTime != 0.f);
 				setSleepTime(mSleepTime, true);			
 
 				setState(STATE_RUNNING);

File indra/llrender/llfontgl.cpp

 	origin.mV[VX] -= llround((F32)sCurOrigin.mX) - (sCurOrigin.mX);
 	origin.mV[VY] -= llround((F32)sCurOrigin.mY) - (sCurOrigin.mY);
 
+	// Depth translation, so that floating text appears 'inworld'
+	// and is correclty occluded.
+	gGL.translatef(0.f,0.f,sCurOrigin.mZ);
 
 	S32 chars_drawn = 0;
 	S32 i;

File indra/llui/llmenubutton.cpp

 
 static LLDefaultChildRegistry::Register<LLMenuButton> r("menu_button");
 
+void LLMenuButton::MenuPositions::declareValues()
+{
+	declare("topleft", MP_TOP_LEFT);
+	declare("topright", MP_TOP_RIGHT);
+	declare("bottomleft", MP_BOTTOM_LEFT);
+}
 
 LLMenuButton::Params::Params()
-:	menu_filename("menu_filename")
+:	menu_filename("menu_filename"),
+	position("position", MP_BOTTOM_LEFT)
 {
 }
 
 LLMenuButton::LLMenuButton(const LLMenuButton::Params& p)
 :	LLButton(p),
 	mIsMenuShown(false),
-	mMenuPosition(MP_BOTTOM_LEFT)
+	mMenuPosition(p.position)
 {
 	std::string menu_filename = p.menu_filename;
 

File indra/llui/llmenubutton.h

 : public LLButton
 {
 public:
-	struct Params 
-	:	public LLInitParam::Block<Params, LLButton::Params>
-	{
-		// filename for it's toggleable menu
-		Optional<std::string>	menu_filename;
-	
-		Params();
-	};
-
 	typedef enum e_menu_position
 	{
 		MP_TOP_LEFT,
 		MP_TOP_RIGHT,
 		MP_BOTTOM_LEFT
 	} EMenuPosition;
+
+	struct MenuPositions
+		:	public LLInitParam::TypeValuesHelper<EMenuPosition, MenuPositions>
+	{
+		static void declareValues();
+	};
+
+	struct Params 
+	:	public LLInitParam::Block<Params, LLButton::Params>
+	{
+		// filename for it's toggleable menu
+		Optional<std::string>	menu_filename;
+		Optional<EMenuPosition>	position;
+	
+		Params();
+	};
+
+
 	
 	boost::signals2::connection setMouseDownCallback( const mouse_signal_t::slot_type& cb );
 

File indra/llui/llurlentry.cpp

 //
 LLUrlEntryNoLink::LLUrlEntryNoLink()
 {
-	mPattern = boost::regex("<nolink>[^<]*</nolink>",
+	mPattern = boost::regex("<nolink>.*?</nolink>",
 							boost::regex::perl|boost::regex::icase);
 }
 

File indra/llui/llview.cpp

 
 BOOL LLView::childHasKeyboardFocus( const std::string& childname ) const
 {
-	LLView *child = findChildView(childname, TRUE);
-	if (child)
+	LLView *focus = dynamic_cast<LLView *>(gFocusMgr.getKeyboardFocus());
+	
+	while (focus != NULL)
 	{
-		return gFocusMgr.childHasKeyboardFocus(child);
+		if (focus->getName() == childname)
+		{
+			return TRUE;
+		}
+		
+		focus = focus->getParent();
 	}
-	else
-	{
-		return FALSE;
-	}
+	
+	return FALSE;
 }
 
 //-----------------------------------------------------------------------------

File indra/newview/app_settings/settings.xml

       <key>Type</key>
       <string>String</string>
       <key>Value</key>
-      <string>http://search-beta.secondlife.com/viewer/[CATEGORY]/?q=[QUERY]&amp;p=[AUTH_TOKEN]&amp;r=[MATURITY]&amp;lang=[LANGUAGE]&amp;g=[GODLIKE]&amp;sid=[SESSION_ID]&amp;rid=[REGION_ID]&amp;pid=[PARCEL_ID]&amp;channel=[CHANNEL]&amp;version=[VERSION]&amp;major=[VERSION_MAJOR]&amp;minor=[VERSION_MINOR]&amp;patch=[VERSION_PATCH]&amp;build=[VERSION_BUILD]</string>
+      <string>http://search-beta.secondlife.com/viewer/[CATEGORY]/?q=[QUERY]</string>
     </map>
     <key>WebProfileURL</key>
     <map>

File indra/newview/llavataractions.cpp

 	if (inventory_selected_uuids.empty())
 	{
 		LLSidepanelInventory * sidepanel_inventory = LLSideTray::getInstance()->getPanel<LLSidepanelInventory>("sidepanel_inventory");
-		LLInventoryPanel * inbox = sidepanel_inventory->findChild<LLInventoryPanel>("inventory_inbox");
-		if (inbox)
-		{
-			inventory_selected_uuids = inbox->getRootFolder()->getSelectionList();
-		}
 
+		inventory_selected_uuids = sidepanel_inventory->getInboxOrOutboxSelectionList();
 	}
 
 	return inventory_selected_uuids;

File indra/newview/llfeaturemanager.cpp

 		return mFeatures[name].mAvailable;
 	}
 
-	LL_WARNS("RenderInit") << "Feature " << name << " not on feature list!" << LL_ENDL;
+	LL_WARNS_ONCE("RenderInit") << "Feature " << name << " not on feature list!" << LL_ENDL;
 	
 	// changing this to TRUE so you have to explicitly disable 
 	// something for it to be disabled
 		return mFeatures[name].mRecommendedLevel;
 	}
 
-	LL_WARNS("RenderInit") << "Feature " << name << " not on feature list or not available!" << LL_ENDL;
+	LL_WARNS_ONCE("RenderInit") << "Feature " << name << " not on feature list or not available!" << LL_ENDL;
 	return 0;
 }
 

File indra/newview/llfloatersearch.cpp

 
 #include "llviewerprecompiledheaders.h"
 
+#include "llappviewer.h"
+#include "llbase64.h"
 #include "llcommandhandler.h"
 #include "llfloaterreg.h"
 #include "llfloatersearch.h"
 #include "llmediactrl.h"
 #include "llnotificationsutil.h"
+#include "llparcel.h"
+#include "llplugincookiestore.h"
 #include "lllogininstance.h"
 #include "lluri.h"
 #include "llagent.h"
+#include "llsdserialize.h"
 #include "llui.h"
 #include "llviewercontrol.h"
+#include "llviewerregion.h"
+#include "llversioninfo.h"
+#include "llviewermedia.h"
+#include "llviewernetwork.h"
+#include "llviewerparcelmgr.h"
 #include "llweb.h"
 
 // support secondlife:///app/search/{CATEGORY}/{QUERY} SLapps
 
 	// add the permissions token that login.cgi gave us
 	// We use "search_token", and fallback to "auth_token" if not present.
+	LLSD search_cookie;
+
 	LLSD search_token = LLLoginInstance::getInstance()->getResponse("search_token");
 	if (search_token.asString().empty())
 	{
 		search_token = LLLoginInstance::getInstance()->getResponse("auth_token");
 	}
-	subs["AUTH_TOKEN"] = search_token.asString();
+	search_cookie["AUTH_TOKEN"] = search_token.asString();
 
 	// add the user's preferred maturity (can be changed via prefs)
 	std::string maturity;
 	{
 		maturity = "13";  // PG
 	}
-	subs["MATURITY"] = maturity;
+	search_cookie["MATURITY"] = maturity;
 
 	// add the user's god status
-	subs["GODLIKE"] = gAgent.isGodlike() ? "1" : "0";
+	search_cookie["GODLIKE"] = gAgent.isGodlike() ? "1" : "0";
+	search_cookie["VERSION"] = LLVersionInfo::getVersion();
+	search_cookie["VERSION_MAJOR"] = LLVersionInfo::getMajor();
+	search_cookie["VERSION_MINOR"] = LLVersionInfo::getMinor();
+	search_cookie["VERSION_PATCH"] = LLVersionInfo::getPatch();
+	search_cookie["VERSION_BUILD"] = LLVersionInfo::getBuild();
+	search_cookie["CHANNEL"] = LLVersionInfo::getChannel();
+	search_cookie["GRID"] = LLGridManager::getInstance()->getGridLabel();
+	search_cookie["OS"] = LLAppViewer::instance()->getOSInfo().getOSStringSimple();
+	search_cookie["SESSION_ID"] = gAgent.getSessionID();
+	search_cookie["FIRST_LOGIN"] = gAgent.isFirstLogin();
+
+	std::string lang = LLUI::getLanguage();
+	if (lang == "en-us")
+	{
+		lang = "en";
+	}
+	search_cookie["LANGUAGE"] = lang;
+
+	// find the region ID
+	LLUUID region_id;
+	LLViewerRegion *region = gAgent.getRegion();
+	if (region)
+	{
+		region_id = region->getRegionID();
+	}
+	search_cookie["REGION_ID"] = region_id;
+
+	// find the parcel local ID
+	S32 parcel_id = 0;
+	LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
+	if (parcel)
+	{
+		parcel_id = parcel->getLocalID();
+	}
+	search_cookie["PARCEL_ID"] = llformat("%d", parcel_id);
+
+	std::stringstream cookie_string_stream;
+	LLSDSerialize::toXML(search_cookie, cookie_string_stream);
+	std::string cookie_string = cookie_string_stream.str();
+
+	U8* cookie_string_buffer = (U8*)cookie_string.c_str();
+	std::string cookie_value = LLBase64::encode(cookie_string_buffer, cookie_string.size());
+
+	// for staging services
+	LLViewerMedia::getCookieStore()->setCookiesFromHost(std::string("viewer_session_info=") + cookie_value, ".lindenlab.com");
+	// for live services
+	LLViewerMedia::getCookieStore()->setCookiesFromHost(std::string("viewer_session_info=") + cookie_value, ".secondlife.com");
 
 	// get the search URL and expand all of the substitutions
 	// (also adds things like [LANGUAGE], [VERSION], [OS], etc.)

File indra/newview/llfloaterworldmap.cpp

 
 LLFloaterWorldMap::LLFloaterWorldMap(const LLSD& key)
 :	LLFloater(key),
-mInventory(NULL),
-mInventoryObserver(NULL),
-mFriendObserver(NULL),
-mCompletingRegionName(),
-mCompletingRegionPos(),
-mWaitingForTracker(FALSE),
-mIsClosing(FALSE),
-mSetToUserPosition(TRUE),
-mTrackedLocation(0,0,0),
-mTrackedStatus(LLTracker::TRACKING_NOTHING)
+	mInventory(NULL),
+	mInventoryObserver(NULL),
+	mFriendObserver(NULL),
+	mCompletingRegionName(),
+	mCompletingRegionPos(),
+	mWaitingForTracker(FALSE),
+	mIsClosing(FALSE),
+	mSetToUserPosition(TRUE),
+	mTrackedLocation(0,0,0),
+	mTrackedStatus(LLTracker::TRACKING_NOTHING),
+	mListFriendCombo(NULL),
+	mListLandmarkCombo(NULL),
+	mListSearchResults(NULL)
 {
 	gFloaterWorldMap = this;
 	
 	avatar_combo->selectFirstItem();
 	avatar_combo->setPrearrangeCallback( boost::bind(&LLFloaterWorldMap::onAvatarComboPrearrange, this) );
 	avatar_combo->setTextEntryCallback( boost::bind(&LLFloaterWorldMap::onComboTextEntry, this) );
+	mListFriendCombo = dynamic_cast<LLCtrlListInterface *>(avatar_combo);
 	
 	LLSearchEditor *location_editor = getChild<LLSearchEditor>("location");
 	location_editor->setFocusChangedCallback(boost::bind(&LLFloaterWorldMap::onLocationFocusChanged, this, _1));
 	location_editor->setKeystrokeCallback( boost::bind(&LLFloaterWorldMap::onSearchTextEntry, this));
 	
 	getChild<LLScrollListCtrl>("search_results")->setDoubleClickCallback( boost::bind(&LLFloaterWorldMap::onClickTeleportBtn, this));
+	mListSearchResults = childGetListInterface("search_results");
 	
 	LLComboBox *landmark_combo = getChild<LLComboBox>( "landmark combo");
 	landmark_combo->selectFirstItem();
 	landmark_combo->setPrearrangeCallback( boost::bind(&LLFloaterWorldMap::onLandmarkComboPrearrange, this) );
 	landmark_combo->setTextEntryCallback( boost::bind(&LLFloaterWorldMap::onComboTextEntry, this) );
+	mListLandmarkCombo = dynamic_cast<LLCtrlListInterface *>(landmark_combo);
 	
 	mCurZoomVal = log(LLWorldMapView::sMapScale)/log(2.f);
 	getChild<LLUICtrl>("zoom slider")->setValue(LLWorldMapView::sMapScale);
 // No longer really builds a list.  Instead, just updates mAvatarCombo.
 void LLFloaterWorldMap::buildAvatarIDList()
 {
-	LLCtrlListInterface *list = childGetListInterface("friend combo");
+	LLCtrlListInterface *list = mListFriendCombo;
 	if (!list) return;
 	
     // Delete all but the "None" entry
 
 void LLFloaterWorldMap::buildLandmarkIDLists()
 {
-	LLCtrlListInterface *list = childGetListInterface("landmark combo");
+	LLCtrlListInterface *list = mListLandmarkCombo;
 	if (!list) return;
 	
     // Delete all but the "None" entry
 
 void LLFloaterWorldMap::clearLocationSelection(BOOL clear_ui)
 {
-	LLCtrlListInterface *list = childGetListInterface("search_results");
+	LLCtrlListInterface *list = mListSearchResults;
 	if (list)
 	{
 		list->operateOnAll(LLCtrlListInterface::OP_DELETE);
 {
 	if (clear_ui || !childHasKeyboardFocus("landmark combo"))
 	{
-		LLCtrlListInterface *list = childGetListInterface("landmark combo");
+		LLCtrlListInterface *list = mListLandmarkCombo;
 		if (list)
 		{
 			list->selectByValue( "None" );
 	if (clear_ui || !childHasKeyboardFocus("friend combo"))
 	{
 		mTrackedStatus = LLTracker::TRACKING_NOTHING;
-		LLCtrlListInterface *list = childGetListInterface("friend combo");
+		LLCtrlListInterface *list = mListFriendCombo;
 		if (list)
 		{
 			list->selectByValue( "None" );
 		return;
 	}
 	
-	LLCtrlListInterface *list = childGetListInterface("landmark combo");
+	LLCtrlListInterface *list = mListLandmarkCombo;
 	if (!list) return;
 	
 	LLUUID current_choice = list->getCurrentID();
 		return;
 	}
 	
-	LLCtrlListInterface *list = childGetListInterface("landmark combo");
+	LLCtrlListInterface *list = mListLandmarkCombo;
 	if (!list) return;
 	
 	LLUUID asset_id;
 		return;
 	}
 	
-	LLCtrlListInterface *list = childGetListInterface("friend combo");
+	LLCtrlListInterface *list = mListFriendCombo;
 	if (!list) return;
 	
 	LLUUID current_choice;
 		return;
 	}
 	
-	LLCtrlListInterface *list = childGetListInterface("friend combo");
+	LLCtrlListInterface *list = mListFriendCombo;
 	if (!list) return;
 	
 	const LLUUID& new_avatar_id = list->getCurrentID();
 
 void LLFloaterWorldMap::onCommitSearchResult()
 {
-	LLCtrlListInterface *list = childGetListInterface("search_results");
+	LLCtrlListInterface *list = mListSearchResults;
 	if (!list) return;
 	
 	LLSD selected_value = list->getSelectedValue();

File indra/newview/llfloaterworldmap.h

 #include "lltracker.h"
 #include "llslurl.h"
 
+class LLCtrlListInterface;
 class LLFriendObserver;
 class LLInventoryModel;
 class LLInventoryObserver;
 	std::string				mTrackedSimName;
 	std::string				mTrackedAvatarName;
 	LLSLURL  				mSLURL;
+
+	LLCtrlListInterface *	mListFriendCombo;
+	LLCtrlListInterface *	mListLandmarkCombo;
+	LLCtrlListInterface *	mListSearchResults;
 };
 
 extern LLFloaterWorldMap* gFloaterWorldMap;

File indra/newview/llfolderview.cpp

 	arrangeAll();
 }
 
-void LLFolderView::openFolder(const std::string& foldername)
-{
-	LLFolderViewFolder* inv = findChild<LLFolderViewFolder>(foldername);
-	if (inv)
-	{
-		setSelection(inv, FALSE, FALSE);
-		inv->setOpen(TRUE);
-	}
-}
-
 void LLFolderView::openTopLevelFolders()
 {
 	for (folders_t::iterator iter = mFolders.begin();
 	mSignalSelectCallback = SIGNAL_KEYBOARD_FOCUS;
 }
 
+static LLFastTimer::DeclareTimer FTM_SANITIZE_SELECTION("Sanitize Selection");
 void LLFolderView::sanitizeSelection()
 {
+	LLFastTimer _(FTM_SANITIZE_SELECTION);
 	// store off current item in case it is automatically deselected
 	// and we want to preserve context
 	LLFolderViewItem* original_selected_item = getCurSelectedItem();
 		}
 		else
 		{
-		handled = mFolders.front()->handleDragAndDropFromChild(mask,drop,cargo_type,cargo_data,accept,tooltip_msg);
-	}
+			handled = mFolders.front()->handleDragAndDropFromChild(mask,drop,cargo_type,cargo_data,accept,tooltip_msg);
+		}
 	}
 
 	if (handled)
 	mItemMap.erase(id);
 }
 
+LLFastTimer::DeclareTimer FTM_GET_ITEM_BY_ID("Get FolderViewItem by ID");
 LLFolderViewItem* LLFolderView::getItemByID(const LLUUID& id)
 {
+	LLFastTimer _(FTM_GET_ITEM_BY_ID);
 	if (id == getListener()->getUUID())
 	{
 		return this;

File indra/newview/llfolderview.h

 
 	// Close all folders in the view
 	void closeAllFolders();
-	void openFolder(const std::string& foldername);
 	void openTopLevelFolders();
 
 	virtual void toggleOpen() {};

File indra/newview/llfolderviewitem.h

 	virtual BOOL handleMouseUp( S32 x, S32 y, MASK mask );
 	virtual BOOL handleDoubleClick( S32 x, S32 y, MASK mask );
 
+	virtual LLView* findChildView(const std::string& name, BOOL recurse) const { return NULL; }
+
 	//	virtual void handleDropped();
 	virtual void draw();
 	virtual BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,

File indra/newview/llinventorypanel.cpp

 			&& fchild->getListener()
 				&& fchild->getListener()->getUUID() == gInventory.getRootFolderID())
 		{
-			const std::string& child_name = child->getName();
-			mFolderRoot->openFolder(child_name);
-			mFolderRoot->clearSelection();	// No need to keep it selected though!
+			fchild->setOpen(TRUE);
 			break;
 		}
 	}

File indra/newview/lllogininstance.cpp

 	else
 	{
 		requested_options.append("basic-mode");
+		requested_options.append("inventory-basic");
 	}
 
 #endif

File indra/newview/llpanellogin.cpp

 	}
 	updateLocationCombo(false);
 
-	LLUICtrl& mode_combo = getChildRef<LLUICtrl>("mode_combo");
-	mode_combo.setValue(gSavedSettings.getString("SessionSettingsFile"));
-	mode_combo.setCommitCallback(boost::bind(&LLPanelLogin::onModeChange, this, getChild<LLUICtrl>("mode_combo")->getValue(), _2));
-
 	LLComboBox* server_choice_combo = sInstance->getChild<LLComboBox>("server_combo");
 	server_choice_combo->setCommitCallback(onSelectServer, NULL);
 	server_choice_combo->setFocusLostCallback(boost::bind(onServerComboLostFocus, _1));
 	sInstance->getChildView("forgot_password_text")->setVisible( system_grid);
 }
 
-void LLPanelLogin::onModeChange(const LLSD& original_value, const LLSD& new_value)
-{
-	if (original_value.asString() != new_value.asString())
-	{
-		LLNotificationsUtil::add("ModeChange", LLSD(), LLSD(), boost::bind(&LLPanelLogin::onModeChangeConfirm, this, original_value, new_value, _1, _2));
-	}
-}
-
-void LLPanelLogin::onModeChangeConfirm(const LLSD& original_value, const LLSD& new_value, const LLSD& notification, const LLSD& response)
-{
-	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
-	switch (option)
-	{
-	case 0:
-		gSavedSettings.getControl("SessionSettingsFile")->set(new_value);
-		LLAppViewer::instance()->forceQuit();
-		break;
-	case 1:
-		// revert to original value
-		getChild<LLUICtrl>("mode_combo")->setValue(original_value);
-		break;
-	default:
-		break;
-	}
-}
-
 std::string canonicalize_username(const std::string& name)
 {
 	std::string cname = name;

File indra/newview/llpanellogin.h

 	static void onServerComboLostFocus(LLFocusableElement*);
 	static void updateServerCombo();
 	static void updateStartSLURL();
-	void onModeChange(const LLSD& original_value, const LLSD& new_value);
-	void onModeChangeConfirm(const LLSD& original_value, const LLSD& new_value, const LLSD& notification, const LLSD& response);
 	
 	static void updateLoginPanelLinks();
 

File indra/newview/llpanelmaininventory.cpp

 	{
 		text = getString("ItemcountUnknown");
 	}
+	
+	// *TODO: Cache the LLUICtrl* for the ItemcountText control
 	getChild<LLUICtrl>("ItemcountText")->setValue(text);
 }
 
 void LLPanelMainInventory::onFocusReceived()
 {
 	LLSidepanelInventory * sidepanel_inventory = LLSideTray::getInstance()->getPanel<LLSidepanelInventory>("sidepanel_inventory");
-
-	LLInventoryPanel * inbox_panel = sidepanel_inventory->findChild<LLInventoryPanel>("inventory_inbox");
-
-	if (inbox_panel)
-	{
-		inbox_panel->clearSelection();
-	}
-
-	LLInventoryPanel * outbox_panel = sidepanel_inventory->findChild<LLInventoryPanel>("inventory_outbox");
-
-	if (outbox_panel)
-	{
-		outbox_panel->clearSelection();
-	}
-
-	sidepanel_inventory->updateVerbs();
+	
+	sidepanel_inventory->clearSelections(false, true, true);
 }
 
 void LLPanelMainInventory::setFilterTextFromFilter() 

File indra/newview/llpanelmarketplaceinbox.cpp

 	LLSideTray::getInstance()->setTabButtonBadgeDriver("sidebar_inventory", this);
 }
 
-void LLPanelMarketplaceInbox::setupInventoryPanel()
+LLInventoryPanel * LLPanelMarketplaceInbox::setupInventoryPanel()
 {
 	LLView * inbox_inventory_placeholder = getChild<LLView>("inbox_inventory_placeholder");
 	LLView * inbox_inventory_parent = inbox_inventory_placeholder->getParent();
 	
 	// Hide the placeholder text
 	inbox_inventory_placeholder->setVisible(FALSE);
+	
+	return mInventoryPanel;
 }
 
 void LLPanelMarketplaceInbox::onFocusReceived()
 {
 	LLSidepanelInventory * sidepanel_inventory = LLSideTray::getInstance()->getPanel<LLSidepanelInventory>("sidepanel_inventory");
 
-	if (sidepanel_inventory)
-	{
-		LLInventoryPanel * inv_panel = sidepanel_inventory->getActivePanel();
-
-		if (inv_panel)
-		{
-			inv_panel->clearSelection();
-		}
-	
-		LLInventoryPanel * outbox_panel = sidepanel_inventory->findChild<LLInventoryPanel>("inventory_outbox");
-
-		if (outbox_panel)
-		{
-			outbox_panel->clearSelection();
-		}
-		
-		sidepanel_inventory->updateVerbs();
-	}
+	sidepanel_inventory->clearSelections(true, false, true);
 }
 
 BOOL LLPanelMarketplaceInbox::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type, void *cargo_data, EAcceptance *accept, std::string& tooltip_msg)

File indra/newview/llpanelmarketplaceinbox.h

 
 	/*virtual*/ void draw();
 	
-	void setupInventoryPanel();
+	LLInventoryPanel * setupInventoryPanel();
 
 	U32 getFreshItemCount() const;
 	U32 getTotalItemCount() const;

File indra/newview/llpanelmarketplaceoutbox.cpp

 void LLPanelMarketplaceOutbox::onFocusReceived()
 {
 	LLSidepanelInventory * sidepanel_inventory = LLSideTray::getInstance()->getPanel<LLSidepanelInventory>("sidepanel_inventory");
-
-	if (sidepanel_inventory)
-	{
-		LLInventoryPanel * inv_panel = sidepanel_inventory->getActivePanel();
-
-		if (inv_panel)
-		{
-			inv_panel->clearSelection();
-		}
-
-		LLInventoryPanel * inbox_panel = sidepanel_inventory->findChild<LLInventoryPanel>("inventory_inbox");
-
-		if (inbox_panel)
-		{
-			inbox_panel->clearSelection();
-		}
-		
-		sidepanel_inventory->updateVerbs();
-	}
+	
+	sidepanel_inventory->clearSelections(true, true, false);
 }
 
 void LLPanelMarketplaceOutbox::onSelectionChange()
 	sidepanel_inventory->updateVerbs();
 }
 
-void LLPanelMarketplaceOutbox::setupInventoryPanel()
+LLInventoryPanel * LLPanelMarketplaceOutbox::setupInventoryPanel()
 {
 	LLView * outbox_inventory_placeholder = getChild<LLView>("outbox_inventory_placeholder");
 	LLView * outbox_inventory_parent = outbox_inventory_placeholder->getParent();
 	
 	// Hide the placeholder text
 	outbox_inventory_placeholder->setVisible(FALSE);
+	
+	return mInventoryPanel;
 }
 
 bool LLPanelMarketplaceOutbox::isOutboxEmpty() const

File indra/newview/llpanelmarketplaceoutbox.h

 
 	/*virtual*/ BOOL postBuild();
 
-	void setupInventoryPanel();
+	LLInventoryPanel * setupInventoryPanel();
 
 	bool isOutboxEmpty() const;
 	bool isSyncInProgress() const;

File indra/newview/llsecapi.h

 // base class for a list of certificates.
 
 
-class LLCertificateVector : public LLRefCount
+class LLCertificateVector : public LLThreadSafeRefCount
 {
 	
 public:

File indra/newview/llsechandler_basic.cpp

 		// with the product
 		std::string ca_file_path = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "CA.pem");
 		llinfos << "app path " << ca_file_path << llendl;
-		LLBasicCertificateStore app_ca_store = LLBasicCertificateStore(ca_file_path);	
+		LLPointer<LLBasicCertificateStore> app_ca_store = new LLBasicCertificateStore(ca_file_path);
 		
 		// push the applicate CA files into the store, therefore adding any new CA certs that 
 		// updated
-		for(LLCertificateVector::iterator i = app_ca_store.begin();
-			i != app_ca_store.end();
+		for(LLCertificateVector::iterator i = app_ca_store->begin();
+			i != app_ca_store->end();
 			i++)
 		{
 			mStore->add(*i);

File indra/newview/llsidepanelinventory.cpp

 LLSidepanelInventory::LLSidepanelInventory()
 	: LLPanel()
 	, mItemPanel(NULL)
+	, mInventoryPanelInbox(NULL)
+	, mInventoryPanelOutbox(NULL)
 	, mPanelMainInventory(NULL)
 	, mInboxEnabled(false)
 	, mOutboxEnabled(false)
 	//
 	
 	LLPanelMarketplaceInbox * inbox = getChild<LLPanelMarketplaceInbox>(MARKETPLACE_INBOX_PANEL);
-	inbox->setupInventoryPanel();
+	mInventoryPanelInbox = inbox->setupInventoryPanel();
 }
 
 
 	//
 	
 	LLPanelMarketplaceOutbox * outbox = getChild<LLPanelMarketplaceOutbox>(MARKETPLACE_OUTBOX_PANEL);
-	outbox->setupInventoryPanel();
+	mInventoryPanelOutbox = outbox->setupInventoryPanel();
 }
 
 void LLSidepanelInventory::enableInbox(bool enabled)
 
 void LLSidepanelInventory::performActionOnSelection(const std::string &action)
 {
-	LLPanelMainInventory *panel_main_inventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory");
-	LLFolderViewItem* current_item = panel_main_inventory->getActivePanel()->getRootFolder()->getCurSelectedItem();
+	LLFolderViewItem* current_item = mPanelMainInventory->getActivePanel()->getRootFolder()->getCurSelectedItem();
 	if (!current_item)
 	{
-		LLInventoryPanel* inbox = findChild<LLInventoryPanel>("inventory_inbox");
-		if (inbox)
+		if (mInventoryPanelInbox)
 		{
-			current_item = inbox->getRootFolder()->getCurSelectedItem();
+			current_item = mInventoryPanelInbox->getRootFolder()->getCurSelectedItem();
 		}
 
 		if (!current_item)
 		}
 	}
 
-	current_item->getListener()->performAction(panel_main_inventory->getActivePanel()->getModel(), action);
+	current_item->getListener()->performAction(mPanelMainInventory->getActivePanel()->getModel(), action);
 }
 
 void LLSidepanelInventory::onWearButtonClicked()
 
 bool LLSidepanelInventory::canShare()
 {
-	LLPanelMainInventory* panel_main_inventory =
-		mInventoryPanel->findChild<LLPanelMainInventory>("panel_main_inventory");
-
-	LLInventoryPanel* inbox = findChild<LLInventoryPanel>("inventory_inbox");
+	LLInventoryPanel* inbox = mInventoryPanelInbox;
 
 	// Avoid flicker in the Recent tab while inventory is being loaded.
 	if ( (!inbox || inbox->getRootFolder()->getSelectionList().empty())
-		&& (panel_main_inventory && !panel_main_inventory->getActivePanel()->getRootFolder()->hasVisibleChildren()) )
+		&& (mPanelMainInventory && !mPanelMainInventory->getActivePanel()->getRootFolder()->hasVisibleChildren()) )
 	{
 		return false;
 	}
 
-	return ( (panel_main_inventory ? LLAvatarActions::canShareSelectedItems(panel_main_inventory->getActivePanel()) : false)
+	return ( (mPanelMainInventory ? LLAvatarActions::canShareSelectedItems(mPanelMainInventory->getActivePanel()) : false)
 			|| (inbox ? LLAvatarActions::canShareSelectedItems(inbox) : false) );
 }
 
 
 LLInventoryItem *LLSidepanelInventory::getSelectedItem()
 {
-	LLPanelMainInventory *panel_main_inventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory");
-	LLFolderViewItem* current_item = panel_main_inventory->getActivePanel()->getRootFolder()->getCurSelectedItem();
+	LLFolderViewItem* current_item = mPanelMainInventory->getActivePanel()->getRootFolder()->getCurSelectedItem();
+	
 	if (!current_item)
 	{
-		LLInventoryPanel* inbox = findChild<LLInventoryPanel>("inventory_inbox");
-		if (inbox)
+		if (mInventoryPanelInbox)
 		{
-			current_item = inbox->getRootFolder()->getCurSelectedItem();
+			current_item = mInventoryPanelInbox->getRootFolder()->getCurSelectedItem();
 		}
 
 		if (!current_item)
 {
 	int count = 0;
 
-	LLPanelMainInventory *panel_main_inventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory");
-	std::set<LLUUID> selection_list = panel_main_inventory->getActivePanel()->getRootFolder()->getSelectionList();
+	std::set<LLUUID> selection_list = mPanelMainInventory->getActivePanel()->getRootFolder()->getSelectionList();
 	count += selection_list.size();
 
-	LLInventoryPanel* inbox = findChild<LLInventoryPanel>("inventory_inbox");
-	if (inbox)
+	if ((count == 0) && mInboxEnabled && (mInventoryPanelInbox != NULL))
 	{
-		selection_list = inbox->getRootFolder()->getSelectionList();
+		selection_list = mInventoryPanelInbox->getRootFolder()->getSelectionList();
+
+	count += selection_list.size();
+	}
+
+	if ((count == 0) && mOutboxEnabled && (mInventoryPanelOutbox != NULL))
+	{
+		selection_list = mInventoryPanelOutbox->getRootFolder()->getSelectionList();
+		
 		count += selection_list.size();
 	}
 
 {
 	return mInventoryPanel->getVisible();
 }
+
+void LLSidepanelInventory::clearSelections(bool clearMain, bool clearInbox, bool clearOutbox)
+{
+	if (clearMain)
+	{
+		LLInventoryPanel * inv_panel = getActivePanel();
+		
+		if (inv_panel)
+		{
+			inv_panel->clearSelection();
+		}
+	}
+	
+	if (clearInbox && mInboxEnabled && (mInventoryPanelInbox != NULL))
+	{
+		mInventoryPanelInbox->clearSelection();
+	}
+	
+	if (clearOutbox && mOutboxEnabled && (mInventoryPanelOutbox != NULL))
+	{
+		mInventoryPanelOutbox->clearSelection();
+	}
+	
+	updateVerbs();
+}
+
+std::set<LLUUID> LLSidepanelInventory::getInboxOrOutboxSelectionList()
+{
+	std::set<LLUUID> inventory_selected_uuids;
+	
+	if (mInboxEnabled && (mInventoryPanelInbox != NULL))
+	{
+		inventory_selected_uuids = mInventoryPanelInbox->getRootFolder()->getSelectionList();
+	}
+	
+	if (inventory_selected_uuids.empty() && mOutboxEnabled && (mInventoryPanelOutbox != NULL))
+	{
+		inventory_selected_uuids = mInventoryPanelOutbox->getRootFolder()->getSelectionList();
+	}
+	
+	return inventory_selected_uuids;
+}

File indra/newview/llsidepanelinventory.h

 	LLInventoryPanel* getActivePanel(); // Returns an active inventory panel, if any.
 	LLPanelMainInventory* getMainInventoryPanel() const { return mPanelMainInventory; }
 	BOOL isMainInventoryPanelActive() const;
+	
+	void clearSelections(bool clearMain, bool clearInbox, bool clearOutbox);
+	std::set<LLUUID> getInboxOrOutboxSelectionList();
 
 	void showItemInfoPanel();
 	void showTaskInfoPanel();
 	//
 private:
 	LLPanel*					mInventoryPanel; // Main inventory view
+	LLInventoryPanel*			mInventoryPanelInbox;
+	LLInventoryPanel*			mInventoryPanelOutbox;
 	LLSidepanelItemInfo*		mItemPanel; // Individual item view
 	LLSidepanelTaskInfo*		mTaskPanel; // Individual in-world object view
 	LLPanelMainInventory*		mPanelMainInventory;

File indra/newview/llstartup.cpp

 
 		timeout_count = 0;
 
+		// Login screen needs menus for preferences, but we can enter
+		// this startup phase more than once.
+		if (gLoginMenuBarView == NULL)
+		{
 		initialize_edit_menu();
+			init_menus();
+		}
 
 		if (show_connect_box)
 		{
 			LLStartUp::setStartupState( STATE_LOGIN_CLEANUP );
 		}
 
-		// *NOTE: This is where LLViewerParcelMgr::getInstance() used to get allocated before becoming LLViewerParcelMgr::getInstance().
-
-		// *NOTE: This is where gHUDManager used to bet allocated before becoming LLHUDManager::getInstance().
-
-		// *NOTE: This is where gMuteList used to get allocated before becoming LLMuteList::getInstance().
-
-		// Login screen needs menus for preferences, but we can enter
-		// this startup phase more than once.
-		if (gLoginMenuBarView == NULL)
-		{
-			init_menus();
-		}
-		
 		gViewerWindow->setNormalControlsVisible( FALSE );	
 		gLoginMenuBarView->setVisible( TRUE );
 		gLoginMenuBarView->setEnabled( TRUE );
  			}
  		}
 
+		LLSD inv_basic = response["inventory-basic"];
+ 		if(inv_basic.isDefined())
+ 		{
+			llinfos << "Basic inventory root folder id is " << inv_basic["folder_id"] << llendl;
+ 		}
+
 		LLSD buddy_list = response["buddy-list"];
  		if(buddy_list.isDefined())
  		{

File indra/newview/llviewermenu.cpp

 };
 
 
-class LLAdvancedToggleFeature : public view_listener_t{
+class LLAdvancedToggleFeature : public view_listener_t
+{
 	bool handleEvent(const LLSD& userdata)
 	{
 		U32 feature = feature_from_string( userdata.asString() );
 };
 
 class LLAdvancedCheckFeature : public view_listener_t
-{bool handleEvent(const LLSD& userdata)
+{
+	bool handleEvent(const LLSD& userdata)
 {
 	U32 feature = feature_from_string( userdata.asString() );
 	bool new_value = false;
 	}
 };
 
+class LLCheckSessionsSettings : public view_listener_t
+{
+	bool handleEvent(const LLSD& userdata)
+	{
+		std::string expected = userdata.asString();
+		return gSavedSettings.getString("SessionSettingsFile") == expected;
+	}
+};
+
+class LLChangeMode : public view_listener_t
+{
+	bool handleEvent(const LLSD& userdata)
+	{
+		std::string mode = userdata.asString();
+		if (mode == "basic")
+		{
+			if (gSavedSettings.getString("SessionSettingsFile") != "settings_minimal.xml")
+			{
+				LLNotificationsUtil::add("ModeChange", LLSD(), LLSD(), boost::bind(onModeChangeConfirm, "settings_minimal.xml", _1, _2));
+			}
+			return true;
+		}
+		else if (mode == "advanced")
+		{
+			if (gSavedSettings.getString("SessionSettingsFile") != "")
+			{
+				LLNotificationsUtil::add("ModeChange", LLSD(), LLSD(), boost::bind(onModeChangeConfirm, "", _1, _2));
+			}
+			return true;
+		}
+		return false;
+	}	
+	
+	static void onModeChangeConfirm(const std::string& new_session_settings_file, const LLSD& notification, const LLSD& response)
+	{
+		S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+		switch (option)
+		{
+		case 0:
+			gSavedSettings.getControl("SessionSettingsFile")->set(new_session_settings_file);
+			LLAppViewer::instance()->requestQuit();
+			break;
+		case 1:
+		default:
+			break;
+		}
+	}
+};
+
 void LLUploadCostCalculator::calculateCost()
 {
 	S32 upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
 	view_listener_t::addMenu(new LLEditableSelectedMono(), "EditableSelectedMono");
 
 	view_listener_t::addMenu(new LLToggleUIHints(), "ToggleUIHints");
+	view_listener_t::addMenu(new LLCheckSessionsSettings(), "CheckSessionSettings");
+	view_listener_t::addMenu(new LLChangeMode(), "ChangeMode");
 
 	commit.add("Destination.show", boost::bind(&toggle_destination_and_avatar_picker, 0));
 	commit.add("Avatar.show", boost::bind(&toggle_destination_and_avatar_picker, 1));

File indra/newview/skins/default/xui/de/floater_build_options.xml

 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="build options floater" title="RASTER-OPTIONEN">
-	<spinner label="Raster-Einheiten (Meter)" name="GridResolution"/>
-	<spinner label="Rastergröße (Meter)" name="GridDrawSize"/>
+	<floater.string name="grid_screen_text">
+		Bildschirm
+	</floater.string>
+	<floater.string name="grid_local_text">
+		Lokal
+	</floater.string>
+	<floater.string name="grid_world_text">
+		Welt
+	</floater.string>
+	<floater.string name="grid_reference_text">
+		Referenz
+	</floater.string>
+	<floater.string name="grid_attachment_text">
+		Anhang
+	</floater.string>
+	<text name="grid_mode_label" tool_tip="Rasteropazität">
+		Modus
+	</text>
+	<combo_box name="combobox grid mode" tool_tip="Wählen Sie das gewünschte Rasterlineal zum Positionieren des Objekts aus.">
+		<combo_box.item label="Globales Raster" name="World"/>
+		<combo_box.item label="Lokales Raster" name="Local"/>
+		<combo_box.item label="Referenzraster" name="Reference"/>
+	</combo_box>
+	<spinner label="Einheiten (m)" name="GridResolution"/>
+	<spinner label="Rastergröße (meter)" name="GridDrawSize"/>
 	<check_box label="An Untereinheiten ausrichten" name="GridSubUnit"/>
 	<check_box label="Überschneidungen anzeigen" name="GridCrossSection"/>
 	<text name="grid_opacity_label" tool_tip="Raster-Deckkraft">

File indra/newview/skins/default/xui/de/floater_model_preview.xml

 	<string name="simplifying">
 		Vereinfachung läuft...
 	</string>
+	<string name="tbd">
+		noch nicht festgelegt
+	</string>
 	<text name="name_label">
 		Name:
 	</text>
 			Detailstufe: Niedrigste
 		</combo_item>
 	</combo_box>
-	<panel>
-		<text name="streaming cost">
-			Ressourcenkosten: [COST]
-		</text>
-		<text name="physics cost">
-			Physikkosten: [COST]
-		</text>
-		<text name="upload fee">
-			Gebühr für Hochladen: --
-		</text>
-	</panel>
-	<text name="status">
-		[STATUS]
+	<text name="warning_title">
+		ACHTUNG:
 	</text>
-	<button label="Standardwerte" name="reset_btn" tool_tip="Standardwerte wiederherstellen"/>
-	<button label="Hochladen" name="ok_btn" tool_tip="An Simulator hochladen"/>
-	<button label="Abbrechen" name="cancel_btn"/>
+	<text name="warning_message">
+		Sie können dieses Modell nicht auf die Second Life-Server hochladen. [[VURL] Weitere Infos], wie Sie das Hochladen von Netzmodellen freischalten können.
+	</text>
+	<text name="weights_text">
+		Herunterladen:
+Physik:
+Server:
+
+Prim-Äquivalenz:
+	</text>
+	<text name="weights">
+		[ST]
+[PH]
+[SIM]
+
+[EQ]
+	</text>
 	<tab_container name="import_tab">
 		<panel label="Detailstufe" name="lod_panel">
 			<text name="lod_table_header">
 			<spinner name="pelvis_offset" value="0,0"/>
 		</panel>
 	</tab_container>
+	<text name="upload_fee">
+		Gebühr für Hochladen: [FEE] L$
+	</text>
+	<button label="Auf Standardwerte setzen" name="reset_btn" tool_tip="Auf Standardwerte setzen"/>
+	<button label="Gewichte und Gebühr berechnen" name="calculate_btn" tool_tip="Gewichte und Gebühr berechnen"/>
+	<button label="Hochladen" name="ok_btn" tool_tip="An Simulator hochladen"/>
+	<button label="Abbrechen" name="cancel_btn"/>
 </floater>

File indra/newview/skins/default/xui/de/floater_model_wizard.xml

 <floater name="Model Wizard" title="ASSISTENT ZUM HOCHLADEN VON MODELLEN">
 	<button label="5. Hochladen" name="upload_btn"/>
 	<button label="4. Überprüfen" name="review_btn"/>
-	<button label="3. Physik" name="physics2_btn"/>
 	<button label="3. Physik" name="physics_btn"/>
 	<button label="2. Optimieren" name="optimize_btn"/>
 	<button label="1. Datei auswählen" name="choose_file_btn"/>
 	<panel name="choose_file_panel">
-		<panel name="header_panel">
-			<text name="header_text">
-				Modell hochladen
+		<panel name="choose_file_header_panel">
+			<text name="choose_file_header_text">
+				Modelldatei auswählen
 			</text>
 		</panel>
-		<text name="description">
-			Mit diesem Assistenten können Sie Netzmodelle in Second Life hochladen.  Geben Sie zuerst die Datei mit dem zu importierenden Modell an.  Second Life unterstützt COLLADA-Dateien (.dae).
-		</text>
-		<panel name="content">
-			<text name="Cache location">
-				Dateiname:
+		<panel name="choose_file_content_panel">
+			<text name="advanced_users_text">
+				Fortgeschrittene Benutzer: Wenn Sie bereits mit Tools zur Erstellung von 3D-Inhalten vertraut sind, können Sie den erweiterten Uploader verwenden.
+			</text>
+			<button label="Auf Erweitert wechseln" name="switch_to_advanced"/>
+			<text name="choose_model_file_label">
+				Hochzuladende Modelldatei auswählen
 			</text>
 			<button label="Durchsuchen..." label_selected="Durchsuchen..." name="browse"/>
+			<text name="support_collada_text">
+				Second Life unterstützt COLLADA-Dateien (.dae).
+			</text>
+			<text name="dimensions_label">
+				Abmessungen (m):
+			</text>
 			<text name="dimensions">
-				X:         Y:         Z:
+				X         Y         Z
 			</text>
-			<text name="dimension_dividers">
-				|               |
+			<text name="warning_label">
+				ACHTUNG:
+			</text>
+			<text name="warning_text">
+				Sie können den letzten Schritt nicht abschließen (Modell auf Second Life-Server hochladen). [secondlife:///app/floater/learn_more Weitere Infos], wie Sie Ihr Konto zum Hochladen von Netzmodellen einrichten.
 			</text>
 		</panel>
 	</panel>
 	<panel name="optimize_panel">
-		<panel name="header_panel">
-			<text name="header_text">
-				Optimieren
+		<panel name="optimize_header_panel">
+			<text name="optimize_header_text">
+				Modell optimieren
 			</text>
 		</panel>
-		<text name="description">
-			Dieser Assistent hat Ihr Modell optimiert, um die Leistung zu erhöhen. Sie können die Optimierungsergebnisse unten ändern oder zum Fortfahren auf „Weiter“ klicken.
+		<text name="optimize_hint">
+			Wir haben das Modell auf Leistung optimiert. Sie können es bei Bedarf weiter anpassen.
 		</text>
-		<panel name="content">
+		<panel name="optimize_content_panel">
+			<text name="generating_lod_label">
+				Detailstufe generieren
+			</text>
 			<text name="high_detail_text">
 				Detailstufe generieren: Hoch
 			</text>
 			</text>
 		</panel>
 		<panel name="content2">
-			<text name="lod_label">
-				Modellvorschau:
+			<text name="optimize_performance_text">
+				Leistung
+			</text>
+			<text name="optimize_faster_rendering_text">
+				Schnellere Darstellung
+Weniger Details
+Niedrigeres Prim-Gewicht
+			</text>
+			<text name="optimize_accuracy_text">
+				Genauigkeit
+			</text>
+			<text name="optimize_slower_rendering_text">
+				Langsamere Darstellung
+Mehr Details
+Höheres Prim-Gewicht
+			</text>
+			<text name="accuracy_slider_mark1">
+				&apos;
+			</text>
+			<text name="accuracy_slider_mark2">
+				&apos;
+			</text>
+			<text name="accuracy_slider_mark3">
+				&apos;
+			</text>
+			<button label="Geometrie neu berechnen" name="recalculate_geometry_btn"/>
+			<text name="geometry_preview_label">
+				Geometrievorschau
+			</text>
+			<combo_box name="preview_lod_combo" tool_tip="Detailstufe zur Anzeige in Vorschaudarstellung">
+				<combo_item name="preview_lod_high">
+					Viel Details
+				</combo_item>
+				<combo_item name="preview_lod_medium">
+					Mittlere Details
+				</combo_item>
+				<combo_item name="preview_lod_low">
+					Wenig Details
+				</combo_item>
+				<combo_item name="preview_lod_lowest">
+					Wenigste Details
+				</combo_item>
+			</combo_box>
+		</panel>
+	</panel>
+	<panel name="physics_panel">
+		<panel name="physics_header_panel">
+			<text name="physics_header_text">
+				Physik anpassen
+			</text>
+		</panel>
+		<text name="physics_hint">
+			Wir erstellen eine Form für die Außenhülle des Modells. Passen Sie die Detailstufe der Form wie für den beabsichtigten Zweck erforderlich an.
+		</text>
+		<panel name="physics_content_panel">
+			<text name="physics_performance_text">
+				Leistung
+			</text>
+			<text name="physics_faster_rendering_text">
+				Schnellere Darstellung
+Weniger Details
+Niedrigeres Prim-Gewicht
+			</text>
+			<text name="physics_accuracy_text">
+				Genauigkeit
+			</text>
+			<text name="physics_slower_dendering_text">
+				Langsamere Darstellung
+Mehr Details
+Höheres Prim-Gewicht
+			</text>
+			<text name="physics_example_1">
+				Beispiele:
+Mobile Objekte
+Fliegende Objekte
+Fahrzeuge
+			</text>
+			<text name="physics_example_2">
+				Beispiele:
+Kleine statische Objekte
+Objekte mit weniger Details
+Einfache Möbel
+			</text>
+			<text name="physics_example_3">
+				Beispiele:
+Statische Objekte
+Objekte mit viel Details
+Gebäude
+			</text>
+			<button label="Physik neu berechnen" name="recalculate_physics_btn"/>
+			<button label="Neu berechnen..." name="recalculating_physics_btn"/>
+			<text name="physics_preview_label">
+				Physikvorschau
 			</text>
 			<combo_box name="preview_lod_combo2" tool_tip="Detailstufe zur Anzeige in Vorschaudarstellung">
-				<combo_item name="high">
-					Hoch
+				<combo_item name="preview_lod2_high">
+					Viel Details
 				</combo_item>
-				<combo_item name="medium">
-					Mittel
+				<combo_item name="preview_lod2_medium">
+					Mittlere Details
 				</combo_item>
-				<combo_item name="low">
-					Niedrig
+				<combo_item name="preview_lod2_low">
+					Wenig Details
 				</combo_item>
-				<combo_item name="lowest">
-					Niedrigste
+				<combo_item name="preview_lod2_lowest">
+					Wenigste Details
 				</combo_item>
 			</combo_box>
-			<text name="streaming cost">
-				Ressourcenkosten:    [COST]
+		</panel>
+	</panel>
+	<panel name="review_panel">
+		<panel name="review_header_panel">
+			<text name="review_header_text">
+				Überprüfen
 			</text>
-			<text name="dimensions">
-				X:         Y:         Z:
+		</panel>
+		<panel name="review_content_panel">
+			<text name="review_prim_equiv">
+				Auswirkung auf Parzelle/Region: Prim-Äquivalenzwert [EQUIV]
 			</text>
-			<text name="dimension_dividers">
-				|               |
+			<text name="review_fee">
+				Die für das Hochladen anfallende Gebühr in Höhe von [FEE] L$ wird von Ihrem Konto abgebucht.
+			</text>
+			<text name="review_confirmation">
+				Durch Klicken auf „Hochladen“ bestätigen Sie, dass Sie die erforderlichen Rechte für das im Modell enthaltene Material besitzen.
 			</text>
 		</panel>
 	</panel>
-	<panel name="physics_panel">
-		<panel name="header_panel">
-			<text name="header_text">
-				Physik
-			</text>
-		</panel>
-		<text name="description">
-			Der Assistent erstellt eine physische Form, die die Interaktionen des Objekts mit anderen Objekten und Avataren bestimmt. Setzen Sie den Schieber auf die Detailstufe, die für Ihr Objekt am besten geeignet ist:
-		</text>
-		<panel name="content">
-			<text name="streaming cost">
-				Ressourcenkosten:       [COST]
-			</text>
-		</panel>
-	</panel>
-	<panel name="physics2_panel">
-		<panel name="header_panel">
-			<text name="header_text">
-				Physik
-			</text>
-		</panel>
-		<text name="description">
-			Überprüfen Sie die physische Form unten und klicken Sie dann auf „Weiter“.  Um die physische Form zu ändern, klicken Sie auf „Zurück“.
-		</text>
-		<panel name="content">
-			<text name="lod_label">
-				Modellvorschau:
-			</text>
-			<combo_box name="preview_lod_combo3" tool_tip="Detailstufe zur Anzeige in Vorschaudarstellung">
-				<combo_item name="high">
-					Hoch
-				</combo_item>
-				<combo_item name="medium">
-					Mittel
-				</combo_item>
-				<combo_item name="low">
-					Niedrig
-				</combo_item>
-				<combo_item name="lowest">
-					Niedrigste
-				</combo_item>
-			</combo_box>
-			<text name="dimensions">
-				X:         Y:         Z:
-			</text>
-			<text name="dimension_dividers">
-				|               |
-			</text>
-			<text name="streaming cost">
-				Ressourcenkosten:       [COST]
-			</text>
-		</panel>
-	</panel>
-	<panel name="review_panel">
-		<panel name="header_panel">
-			<text name="header_text">
-				Überprüfen
-			</text>
-		</panel>
-		<text name="description">
-			Überprüfen Sie die Details unten und klicken Sie dann auf „Hochladen“, um das Modell hochzuladen. Die Kosten werden von Ihrem L$-Kontostand abgezogen.
-		</text>
-		<panel name="content">
-			<text name="lod_label">
-				Modellvorschau:
-			</text>
-			<combo_box name="preview_lod_combo" tool_tip="Detailstufe zur Anzeige in Vorschaudarstellung">
-				<combo_item name="high">
-					Hoch
-				</combo_item>
-				<combo_item name="medium">
-					Mittel
-				</combo_item>
-				<combo_item name="low">
-					Niedrig
-				</combo_item>
-				<combo_item name="lowest">
-					Niedrigste
-				</combo_item>
-			</combo_box>
-			<text name="dimensions">
-				X:         Y:         Z:
-			</text>
-			<text name="dimension_dividers">
-				|               |
-			</text>
-		</panel>
-		<text name="streaming cost">
-			Ressourcenkosten:         [COST]
-		</text>
-		<text name="physics cost">
-			Physikkosten:        [COST]