From 1f79bee86ee65a2eb3800db6be1853dd79d7a49d Mon Sep 17 00:00:00 2001
From: Richard Linden <none@none>
Date: Fri, 9 Jul 2010 14:26:56 -0700
Subject: EXT-8237 FIX Opening up Edit Outfit- Add More->Shirt causes FPS to
 drop from 60fps to 18fps for a really long time EXT-8235 FIX HUGE long delay
 when reopening and/or closing edit outfit sidepanel if "Add More..." is
 active EXT-7695 FIX UI lockup after add wearable, right click av -> Change
 Outfit

reviewed by Vir
---
 indra/llui/llbutton.cpp                            |   1 +
 indra/llui/llflatlistview.cpp                      |  21 ++-
 indra/llui/llflatlistview.h                        |  11 +-
 indra/llui/lltextbase.cpp                          |  56 ++++--
 indra/llui/lltextbase.h                            |  18 +-
 indra/llui/lltexteditor.cpp                        |   2 -
 indra/llui/lluictrl.cpp                            |   7 +-
 indra/llui/lluictrlfactory.h                       |   2 +-
 indra/llui/lluistring.cpp                          |  13 +-
 indra/llui/llview.h                                |   7 +-
 indra/llui/llviewquery.cpp                         |  14 +-
 indra/llui/llviewquery.h                           |   2 +-
 indra/newview/llcofwearables.cpp                   |   2 +-
 indra/newview/lldndbutton.cpp                      |   2 +-
 indra/newview/lldndbutton.h                        |   2 +-
 indra/newview/llinspectobject.cpp                  |   3 +-
 indra/newview/llinventoryitemslist.cpp             |   8 +-
 indra/newview/llinventorylistitem.cpp              |  93 +++++++---
 indra/newview/llinventorylistitem.h                |  31 ++--
 indra/newview/llsidetray.cpp                       |  14 +-
 indra/newview/llsidetray.h                         |  14 +-
 indra/newview/llwearableitemslist.cpp              | 196 ++++++++++++++++-----
 indra/newview/llwearableitemslist.h                |  58 ++++--
 indra/newview/llwindebug.cpp                       |   2 +-
 .../default/xui/en/panel_body_parts_list_item.xml  | 105 -----------
 .../default/xui/en/panel_clothing_list_item.xml    | 137 --------------
 .../xui/en/panel_deletable_wearable_list_item.xml  |  73 --------
 .../xui/en/panel_dummy_clothing_list_item.xml      |  83 ---------
 .../default/xui/en/widgets/bodyparts_list_item.xml |  73 ++++++++
 .../default/xui/en/widgets/clothing_list_item.xml  |  93 ++++++++++
 .../en/widgets/deletable_wearable_list_item.xml    |  43 +++++
 .../xui/en/widgets/dummy_clothing_list_item.xml    |  52 ++++++
 .../default/xui/en/widgets/inventory_list_item.xml |  35 +++-
 33 files changed, 696 insertions(+), 577 deletions(-)
 delete mode 100644 indra/newview/skins/default/xui/en/panel_body_parts_list_item.xml
 delete mode 100644 indra/newview/skins/default/xui/en/panel_clothing_list_item.xml
 delete mode 100644 indra/newview/skins/default/xui/en/panel_deletable_wearable_list_item.xml
 delete mode 100644 indra/newview/skins/default/xui/en/panel_dummy_clothing_list_item.xml
 create mode 100644 indra/newview/skins/default/xui/en/widgets/bodyparts_list_item.xml
 create mode 100644 indra/newview/skins/default/xui/en/widgets/clothing_list_item.xml
 create mode 100644 indra/newview/skins/default/xui/en/widgets/deletable_wearable_list_item.xml
 create mode 100644 indra/newview/skins/default/xui/en/widgets/dummy_clothing_list_item.xml

diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp
index 39e46a7ccb..aeedf62379 100644
--- a/indra/llui/llbutton.cpp
+++ b/indra/llui/llbutton.cpp
@@ -1,3 +1,4 @@
+
 /** 
  * @file llbutton.cpp
  * @brief LLButton base class
diff --git a/indra/llui/llflatlistview.cpp b/indra/llui/llflatlistview.cpp
index b87851490d..209bc6925f 100644
--- a/indra/llui/llflatlistview.cpp
+++ b/indra/llui/llflatlistview.cpp
@@ -157,7 +157,7 @@ bool LLFlatListView::insertItemAfter(LLPanel* after_item, LLPanel* item_to_add,
 }
 
 
-bool LLFlatListView::removeItem(LLPanel* item)
+bool LLFlatListView::removeItem(LLPanel* item, bool rearrange)
 {
 	if (!item) return false;
 	if (item->getParent() != mItemsPanel) return false;
@@ -165,22 +165,22 @@ bool LLFlatListView::removeItem(LLPanel* item)
 	item_pair_t* item_pair = getItemPair(item);
 	if (!item_pair) return false;
 
-	return removeItemPair(item_pair);
+	return removeItemPair(item_pair, rearrange);
 }
 
-bool LLFlatListView::removeItemByValue(const LLSD& value)
+bool LLFlatListView::removeItemByValue(const LLSD& value, bool rearrange)
 {
 	if (value.isUndefined()) return false;
 	
 	item_pair_t* item_pair = getItemPair(value);
 	if (!item_pair) return false;
 
-	return removeItemPair(item_pair);
+	return removeItemPair(item_pair, rearrange);
 }
 
-bool LLFlatListView::removeItemByUUID(const LLUUID& uuid)
+bool LLFlatListView::removeItemByUUID(const LLUUID& uuid, bool rearrange)
 {
-	return removeItemByValue(LLSD(uuid));
+	return removeItemByValue(LLSD(uuid), rearrange);
 }
 
 LLPanel* LLFlatListView::getItemByValue(const LLSD& value) const
@@ -970,7 +970,7 @@ bool LLFlatListView::isSelected(item_pair_t* item_pair) const
 	return std::find(mSelectedItemPairs.begin(), it_end, item_pair) != it_end;
 }
 
-bool LLFlatListView::removeItemPair(item_pair_t* item_pair)
+bool LLFlatListView::removeItemPair(item_pair_t* item_pair, bool rearrange)
 {
 	llassert(item_pair);
 
@@ -1002,8 +1002,11 @@ bool LLFlatListView::removeItemPair(item_pair_t* item_pair)
 	item_pair->first->die();
 	delete item_pair;
 
-	rearrangeItems();
-	notifyParentItemsRectChanged();
+	if (rearrange)
+	{
+		rearrangeItems();
+		notifyParentItemsRectChanged();
+	}
 
 	return true;
 }
diff --git a/indra/llui/llflatlistview.h b/indra/llui/llflatlistview.h
index ded46d8122..29b6b718af 100644
--- a/indra/llui/llflatlistview.h
+++ b/indra/llui/llflatlistview.h
@@ -117,6 +117,9 @@ public:
 		Params();
 	};
 	
+	// disable traversal when finding widget to hand focus off to
+	/*virtual*/ BOOL canFocusChildren() const { return FALSE; }
+
 	/**
 	 * Connects callback to signal called when Return key is pressed.
 	 */
@@ -149,19 +152,19 @@ public:
 	 * Remove specified item
 	 * @return true if the item was removed, false otherwise 
 	 */
-	virtual bool removeItem(LLPanel* item);
+	virtual bool removeItem(LLPanel* item, bool rearrange = true);
 
 	/** 
 	 * Remove an item specified by value
 	 * @return true if the item was removed, false otherwise 
 	 */
-	virtual bool removeItemByValue(const LLSD& value);
+	virtual bool removeItemByValue(const LLSD& value, bool rearrange = true);
 
 	/** 
 	 * Remove an item specified by uuid
 	 * @return true if the item was removed, false otherwise 
 	 */
-	virtual bool removeItemByUUID(const LLUUID& uuid);
+	virtual bool removeItemByUUID(const LLUUID& uuid, bool rearrange = true);
 
 	/** 
 	 * Get an item by value 
@@ -349,7 +352,7 @@ protected:
 
 	virtual bool isSelected(item_pair_t* item_pair) const;
 
-	virtual bool removeItemPair(item_pair_t* item_pair);
+	virtual bool removeItemPair(item_pair_t* item_pair, bool rearrange);
 
 	/**
 	 * Notify parent about changed size of internal controls with "size_changes" action
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 223998569b..ed03645944 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -66,7 +66,10 @@ bool LLTextBase::compare_segment_end::operator()(const LLTextSegmentPtr& a, cons
 	{
 		return a->getStart() < b->getStart();
 	}
-	return a->getEnd() < b->getEnd();
+	else
+	{
+		return a->getEnd() < b->getEnd();
+	}
 }
 
 
@@ -174,7 +177,7 @@ LLTextBase::Params::Params()
 
 LLTextBase::LLTextBase(const LLTextBase::Params &p) 
 :	LLUICtrl(p, LLTextViewModelPtr(new LLTextViewModel)),
-	mURLClickSignal(),
+	mURLClickSignal(NULL),
 	mMaxTextByteLength( p.max_text_length ),
 	mDefaultFont(p.font),
 	mFontShadow(p.font_shadow),
@@ -209,7 +212,8 @@ LLTextBase::LLTextBase(const LLTextBase::Params &p)
 	mParseHTML(p.allow_html),
 	mParseHighlights(p.parse_highlights),
 	mBGVisible(p.bg_visible),
-	mScroller(NULL)
+	mScroller(NULL),
+	mStyleDirty(true)
 {
 	if(p.allow_scroll)
 	{
@@ -248,9 +252,8 @@ LLTextBase::LLTextBase(const LLTextBase::Params &p)
 
 LLTextBase::~LLTextBase()
 {
-	// Menu, like any other LLUICtrl, is deleted by its parent - gMenuHolder
-
 	mSegments.clear();
+	delete mURLClickSignal;
 }
 
 void LLTextBase::initFromParams(const LLTextBase::Params& p)
@@ -296,13 +299,18 @@ bool LLTextBase::truncate()
 	return did_truncate;
 }
 
-LLStyle::Params LLTextBase::getDefaultStyleParams()
+const LLStyle::Params& LLTextBase::getDefaultStyleParams()
 {
-	return LLStyle::Params()
-		.color(LLUIColor(&mFgColor))
-		.readonly_color(LLUIColor(&mReadOnlyFgColor))
-		.font(mDefaultFont)
-		.drop_shadow(mFontShadow);
+	if (mStyleDirty)
+	{
+		  mDefaultStyle
+				  .color(LLUIColor(&mFgColor))
+				  .readonly_color(LLUIColor(&mReadOnlyFgColor))
+				  .font(mDefaultFont)
+				  .drop_shadow(mFontShadow);
+		  mStyleDirty = false;
+	}
+	return mDefaultStyle;
 }
 
 void LLTextBase::onValueChange(S32 start, S32 end)
@@ -861,11 +869,12 @@ BOOL LLTextBase::handleMouseUp(S32 x, S32 y, MASK mask)
 	if (cur_segment && cur_segment->handleMouseUp(x, y, mask))
 	{
 		// Did we just click on a link?
-		if (cur_segment->getStyle()
+		if (mURLClickSignal
+			&& cur_segment->getStyle()
 		    && cur_segment->getStyle()->isLink())
 		{
 			// *TODO: send URL here?
-			mURLClickSignal(this, LLSD() );
+			(*mURLClickSignal)(this, LLSD() );
 		}
 		return TRUE;
 	}
@@ -1039,12 +1048,14 @@ void LLTextBase::draw()
 void LLTextBase::setColor( const LLColor4& c )
 {
 	mFgColor = c;
+	mStyleDirty = true;
 }
 
 //virtual 
 void LLTextBase::setReadOnlyColor(const LLColor4 &c)
 {
 	mReadOnlyFgColor = c;
+	mStyleDirty = true;
 }
 
 //virtual
@@ -1488,12 +1499,22 @@ void LLTextBase::getSegmentAndOffset( S32 startpos, segment_set_t::iterator* seg
 
 LLTextBase::segment_set_t::iterator LLTextBase::getSegIterContaining(S32 index)
 {
+	if (index > getLength()) { return mSegments.end(); }
+
+	// when there are no segments, we return the end iterator, which must be checked by caller
+	if (mSegments.size() <= 1) { return mSegments.begin(); }
+
 	segment_set_t::iterator it = mSegments.upper_bound(new LLIndexSegment(index));
 	return it;
 }
 
 LLTextBase::segment_set_t::const_iterator LLTextBase::getSegIterContaining(S32 index) const
 {
+	if (index > getLength()) { return mSegments.end(); }
+
+	// when there are no segments, we return the end iterator, which must be checked by caller
+	if (mSegments.size() <= 1) { return mSegments.begin(); }
+
 	LLTextBase::segment_set_t::const_iterator it =  mSegments.upper_bound(new LLIndexSegment(index));
 	return it;
 }
@@ -2324,6 +2345,15 @@ LLRect LLTextBase::getVisibleDocumentRect() const
 	}
 }
 
+boost::signals2::connection LLTextBase::setURLClickedCallback(const commit_signal_t::slot_type& cb)
+{
+	if (!mURLClickSignal)
+	{
+		mURLClickSignal = new commit_signal_t();
+	}
+	return mURLClickSignal->connect(cb);
+}
+
 //
 // LLTextSegment
 //
diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h
index 300ee0f05f..4b0eeeb7d6 100644
--- a/indra/llui/lltextbase.h
+++ b/indra/llui/lltextbase.h
@@ -361,10 +361,7 @@ public:
 	virtual void			appendLineBreakSegment(const LLStyle::Params& style_params);
 	virtual void			appendImageSegment(const LLStyle::Params& style_params);
 	virtual void			appendWidget(const LLInlineViewSegment::Params& params, const std::string& text, bool allow_undo);
-
-public:
-	// Fired when a URL link is clicked
-	commit_signal_t mURLClickSignal;
+	boost::signals2::connection setURLClickedCallback(const commit_signal_t::slot_type& cb);
 
 protected:
 	// helper structs
@@ -457,7 +454,7 @@ protected:
 	void							createDefaultSegment();
 	virtual void					updateSegments();
 	void							insertSegment(LLTextSegmentPtr segment_to_insert);
-	LLStyle::Params					getDefaultStyleParams();
+	const LLStyle::Params&			getDefaultStyleParams();
 
 	//  manage lines
 	S32								getLineStart( S32 line ) const;
@@ -497,6 +494,12 @@ protected:
 	LLRect						mVisibleTextRect;			// The rect in which text is drawn.  Excludes borders.
 	LLRect						mTextBoundingRect;
 
+	// default text style
+	LLStyle::Params				mDefaultStyle;
+	bool						mStyleDirty;
+	const LLFontGL* const		mDefaultFont;		// font that is used when none specified, can only be set by constructor
+	const LLFontGL::ShadowType	mFontShadow;		// shadow style, can only be set by constructor
+
 	// colors
 	LLUIColor					mCursorColor;
 	LLUIColor					mFgColor;
@@ -523,8 +526,6 @@ protected:
 	LLFontGL::VAlign			mVAlign;
 	F32							mLineSpacingMult;	// multiple of line height used as space for a single line of text (e.g. 1.5 to get 50% padding)
 	S32							mLineSpacingPixels;	// padding between lines
-	const LLFontGL*				mDefaultFont;		// font that is used when none specified
-	LLFontGL::ShadowType		mFontShadow;
 	bool						mBorderVisible;
 	bool                		mParseHTML;			// make URLs interactive
 	bool						mParseHighlights;	// highlight user-defined keywords
@@ -547,6 +548,9 @@ protected:
 	bool						mScrollNeeded;		// need to change scroll region because of change to cursor position
 	S32							mScrollIndex;		// index of first character to keep visible in scroll region
 
+	// Fired when a URL link is clicked
+	commit_signal_t*			mURLClickSignal;
+
 };
 
 #endif
diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp
index c9474d66b7..130cda3784 100644
--- a/indra/llui/lltexteditor.cpp
+++ b/indra/llui/lltexteditor.cpp
@@ -264,8 +264,6 @@ LLTextEditor::LLTextEditor(const LLTextEditor::Params& p) :
 	mContextMenu(NULL),
 	mShowContextMenu(p.show_context_menu)
 {
-	mDefaultFont = p.font;
-
 	mSourceID.generate();
 
 	//FIXME: use image?
diff --git a/indra/llui/lluictrl.cpp b/indra/llui/lluictrl.cpp
index 3ade46d367..ff330f863a 100644
--- a/indra/llui/lluictrl.cpp
+++ b/indra/llui/lluictrl.cpp
@@ -675,7 +675,7 @@ BOOL LLUICtrl::getIsChrome() const
 class CompareByDefaultTabGroup: public LLCompareByTabOrder
 {
 public:
-	CompareByDefaultTabGroup(LLView::child_tab_order_t order, S32 default_tab_group):
+	CompareByDefaultTabGroup(const LLView::child_tab_order_t& order, S32 default_tab_group):
 			LLCompareByTabOrder(order),
 			mDefaultTabGroup(default_tab_group) {}
 private:
@@ -699,13 +699,16 @@ class LLUICtrl::DefaultTabGroupFirstSorter : public LLQuerySorter, public LLSing
 {
 public:
 	/*virtual*/ void operator() (LLView * parent, viewList_t &children) const
-	{
+	{	
 		children.sort(CompareByDefaultTabGroup(parent->getCtrlOrder(), parent->getDefaultTabGroup()));
 	}
 };
 
+LLFastTimer::DeclareTimer FTM_FOCUS_FIRST_ITEM("Focus First Item");
+
 BOOL LLUICtrl::focusFirstItem(BOOL prefer_text_fields, BOOL focus_flash)
 {
+	LLFastTimer _(FTM_FOCUS_FIRST_ITEM);
 	// try to select default tab group child
 	LLCtrlQuery query = getTabOrderQuery();
 	// sort things such that the default tab group is at the front
diff --git a/indra/llui/lluictrlfactory.h b/indra/llui/lluictrlfactory.h
index c99acee48e..ff99712c5f 100644
--- a/indra/llui/lluictrlfactory.h
+++ b/indra/llui/lluictrlfactory.h
@@ -182,7 +182,7 @@ public:
 	void popFactoryFunctions();
 
 	template<typename T>
-	static T* createWidget(typename T::Params& params, LLView* parent = NULL)
+	static T* createWidget(typename const T::Params& params, LLView* parent = NULL)
 	{
 		T* widget = NULL;
 
diff --git a/indra/llui/lluistring.cpp b/indra/llui/lluistring.cpp
index f7a53e87de..ac9e71665f 100644
--- a/indra/llui/lluistring.cpp
+++ b/indra/llui/lluistring.cpp
@@ -135,9 +135,16 @@ void LLUIString::updateResult() const
 	mResult = mOrig;
 	
 	// get the defailt args + local args
-	LLStringUtil::format_map_t combined_args = LLTrans::getDefaultArgs();
-	combined_args.insert(mArgs.begin(), mArgs.end());
-	LLStringUtil::format(mResult, combined_args);
+	if (mArgs.empty())
+	{
+		LLStringUtil::format(mResult, LLTrans::getDefaultArgs());
+	}
+	else
+	{
+		LLStringUtil::format_map_t combined_args = LLTrans::getDefaultArgs();
+		combined_args.insert(mArgs.begin(), mArgs.end());
+		LLStringUtil::format(mResult, combined_args);
+	}
 }
 
 void LLUIString::updateWResult() const
diff --git a/indra/llui/llview.h b/indra/llui/llview.h
index aba6c310f1..8e705ed701 100644
--- a/indra/llui/llview.h
+++ b/indra/llui/llview.h
@@ -265,7 +265,7 @@ public:
 
 	virtual BOOL	postBuild() { return TRUE; }
 
-	child_tab_order_t getCtrlOrder() const		{ return mCtrlOrder; }
+	const child_tab_order_t& getCtrlOrder() const		{ return mCtrlOrder; }
 	ctrl_list_t getCtrlList() const;
 	ctrl_list_t getCtrlListSorted() const;
 	
@@ -620,12 +620,13 @@ public:
 class LLCompareByTabOrder
 {
 public:
-	LLCompareByTabOrder(LLView::child_tab_order_t order) : mTabOrder(order) {}
+	LLCompareByTabOrder(const LLView::child_tab_order_t& order) : mTabOrder(order) {}
 	virtual ~LLCompareByTabOrder() {}
 	bool operator() (const LLView* const a, const LLView* const b) const;
 private:
 	virtual bool compareTabOrders(const LLView::tab_order_t & a, const LLView::tab_order_t & b) const { return a < b; }
-	LLView::child_tab_order_t mTabOrder;
+	// ok to store a reference, as this should only be allocated on stack during view query operations
+	const LLView::child_tab_order_t& mTabOrder;
 };
 
 template <class T> T* LLView::getChild(const std::string& name, BOOL recurse) const
diff --git a/indra/llui/llviewquery.cpp b/indra/llui/llviewquery.cpp
index bdb3d223a6..1b44cc528e 100644
--- a/indra/llui/llviewquery.cpp
+++ b/indra/llui/llviewquery.cpp
@@ -95,8 +95,8 @@ viewList_t LLViewQuery::run(LLView* view) const
 		if (pre.first)
 		{
 			post = runFilters(view, filtered_children, mPostFilters);
+			}
 		}
-	}
 
 	if(pre.first && post.first) 
 	{
@@ -119,12 +119,12 @@ void LLViewQuery::filterChildren(LLView * view, viewList_t & filtered_children)
 		(*mSorterp)(view, views); // sort the children per the sorter
 	}
 	for(LLView::child_list_iter_t iter = views.begin();
-			iter != views.end();
-			iter++)
-		{
-			viewList_t indiv_children = this->run(*iter);
-			filtered_children.insert(filtered_children.end(), indiv_children.begin(), indiv_children.end());
-		}
+		iter != views.end();
+		iter++)
+	{
+		viewList_t indiv_children = this->run(*iter);
+		filtered_children.splice(filtered_children.end(), indiv_children);
+	}
 }
 
 filterResult_t LLViewQuery::runFilters(LLView * view, const viewList_t children, const filterList_t filters) const
diff --git a/indra/llui/llviewquery.h b/indra/llui/llviewquery.h
index 98d9bf8796..68af31933d 100644
--- a/indra/llui/llviewquery.h
+++ b/indra/llui/llviewquery.h
@@ -122,7 +122,7 @@ public:
 	viewList_t operator () (LLView * view) const { return run(view); }
 
 	// override this method to provide iteration over other types of children
-	virtual void filterChildren(LLView * view, viewList_t & filtered_children) const;
+	virtual void filterChildren(LLView * view, viewList_t& filtered_children) const;
 
 private:
 
diff --git a/indra/newview/llcofwearables.cpp b/indra/newview/llcofwearables.cpp
index f278fb6a7b..48ad762965 100644
--- a/indra/newview/llcofwearables.cpp
+++ b/indra/newview/llcofwearables.cpp
@@ -463,7 +463,7 @@ LLPanelClothingListItem* LLCOFWearables::buildClothingListItem(LLViewerInventory
 	item_panel->childSetAction("btn_edit", mCOFCallbacks.mEditWearable);
 	
 	//turning on gray separator line for the last item in the items group of the same wearable type
-	item_panel->childSetVisible("wearable_type_separator_icon", last);
+	item_panel->setSeparatorVisible(last);
 
 	return item_panel;
 }
diff --git a/indra/newview/lldndbutton.cpp b/indra/newview/lldndbutton.cpp
index 22f2bb1d16..4f4c7dead7 100644
--- a/indra/newview/lldndbutton.cpp
+++ b/indra/newview/lldndbutton.cpp
@@ -42,7 +42,7 @@ LLDragAndDropButton::Params::Params()
 
 }
 
-LLDragAndDropButton::LLDragAndDropButton(Params& params)
+LLDragAndDropButton::LLDragAndDropButton(const Params& params)
 : LLButton(params)
 {
 
diff --git a/indra/newview/lldndbutton.h b/indra/newview/lldndbutton.h
index c888268187..433b3f7ff5 100644
--- a/indra/newview/lldndbutton.h
+++ b/indra/newview/lldndbutton.h
@@ -54,7 +54,7 @@ public:
 		Params();
 	};
 
-	LLDragAndDropButton(Params& params);
+	LLDragAndDropButton(const Params& params);
 
 	typedef boost::function<bool (
 		S32 /*x*/, S32 /*y*/, MASK /*mask*/, BOOL /*drop*/,
diff --git a/indra/newview/llinspectobject.cpp b/indra/newview/llinspectobject.cpp
index a2b5ffbac4..cb7b338e95 100644
--- a/indra/newview/llinspectobject.cpp
+++ b/indra/newview/llinspectobject.cpp
@@ -161,8 +161,7 @@ BOOL LLInspectObject::postBuild(void)
 
 	// Hide floater when name links clicked
 	LLTextBox* textbox = getChild<LLTextBox>("object_creator");
-	textbox->mURLClickSignal.connect(
-		boost::bind(&LLInspectObject::closeFloater, this, false) );
+	textbox->setURLClickedCallback(boost::bind(&LLInspectObject::closeFloater, this, false) );
 
 	// Hook up functionality
 	getChild<LLUICtrl>("buy_btn")->setCommitCallback(
diff --git a/indra/newview/llinventoryitemslist.cpp b/indra/newview/llinventoryitemslist.cpp
index fbb3774917..e01f05c0f2 100644
--- a/indra/newview/llinventoryitemslist.cpp
+++ b/indra/newview/llinventoryitemslist.cpp
@@ -107,9 +107,12 @@ void LLInventoryItemsList::idle(void* user_data)
 	}
 }
 
+LLFastTimer::DeclareTimer FTM_INVENTORY_ITEMS_REFRESH("Inventory List Refresh");
+
 void LLInventoryItemsList::refresh()
 {
-	static const unsigned ADD_LIMIT = 50;
+	LLFastTimer _(FTM_INVENTORY_ITEMS_REFRESH);
+	static const unsigned ADD_LIMIT = 20;
 
 	uuid_vec_t added_items;
 	uuid_vec_t removed_items;
@@ -140,7 +143,8 @@ void LLInventoryItemsList::refresh()
 	it = removed_items.begin();
 	for( ; removed_items.end() != it; ++it)
 	{
-		removeItemByUUID(*it);
+		// don't filter items right away
+		removeItemByUUID(*it, false);
 	}
 
 	// Filter, rearrange and notify parent about shape changes
diff --git a/indra/newview/llinventorylistitem.cpp b/indra/newview/llinventorylistitem.cpp
index c487aa10a7..e4a7a158a3 100644
--- a/indra/newview/llinventorylistitem.cpp
+++ b/indra/newview/llinventorylistitem.cpp
@@ -51,7 +51,12 @@ static const S32 WIDGET_SPACING = 3;
 
 LLPanelInventoryListItemBase::Params::Params()
 :	default_style("default_style"),
-	worn_style("worn_style")
+	worn_style("worn_style"),
+	hover_image("hover_image"),
+	selected_image("selected_image"),
+	separator_image("separator_image"),
+	item_icon("item_icon"),
+	item_name("item_name")
 {};
 
 LLPanelInventoryListItemBase* LLPanelInventoryListItemBase::create(LLViewerInventoryItem* item)
@@ -59,8 +64,10 @@ LLPanelInventoryListItemBase* LLPanelInventoryListItemBase::create(LLViewerInven
 	LLPanelInventoryListItemBase* list_item = NULL;
 	if (item)
 	{
-		list_item = new LLPanelInventoryListItemBase(item);
-		list_item->init();
+		const LLPanelInventoryListItemBase::Params& params = LLUICtrlFactory::getDefaultParams<LLPanelInventoryListItemBase>();
+		list_item = new LLPanelInventoryListItemBase(item, params);
+		list_item->initFromParams(params);
+		list_item->postBuild();
 	}
 	return list_item;
 }
@@ -76,6 +83,25 @@ void LLPanelInventoryListItemBase::draw()
 		}
 		setNeedsRefresh(false);
 	}
+
+	if (mHovered && mHoverImage)
+	{
+		mHoverImage->draw(getLocalRect());
+	}
+
+	if (mSelected && mSelectedImage)
+	{
+		mSelectedImage->draw(getLocalRect());
+	}
+
+	if (mSeparatorVisible && mSeparatorImage)
+	{
+		// stretch along bottom of listitem, using image height
+		LLRect separator_rect = getLocalRect();
+		separator_rect.mTop = mSeparatorImage->getHeight();
+		mSeparatorImage->draw(separator_rect);
+	}
+	
 	LLPanel::draw();
 }
 
@@ -134,9 +160,6 @@ void LLPanelInventoryListItemBase::setShowWidget(LLUICtrl* ctrl, bool show)
 
 BOOL LLPanelInventoryListItemBase::postBuild()
 {
-	setIconCtrl(getChild<LLIconCtrl>("item_icon"));
-	setTitleCtrl(getChild<LLTextBox>("item_name"));
-
 	LLViewerInventoryItem* inv_item = getItem();
 	if (inv_item)
 	{
@@ -156,18 +179,18 @@ void LLPanelInventoryListItemBase::setValue(const LLSD& value)
 {
 	if (!value.isMap()) return;
 	if (!value.has("selected")) return;
-	childSetVisible("selected_icon", value["selected"]);
+	mSelected = value["selected"];
 }
 
 void LLPanelInventoryListItemBase::onMouseEnter(S32 x, S32 y, MASK mask)
 {
-	childSetVisible("hovered_icon", true);
+	mHovered = true;
 	LLPanel::onMouseEnter(x, y, mask);
 }
 
 void LLPanelInventoryListItemBase::onMouseLeave(S32 x, S32 y, MASK mask)
 {
-	childSetVisible("hovered_icon", false);
+	mHovered = false;
 	LLPanel::onMouseLeave(x, y, mask);
 }
 
@@ -244,21 +267,47 @@ S32 LLPanelInventoryListItemBase::notify(const LLSD& info)
 	return rv;
 }
 
-LLPanelInventoryListItemBase::LLPanelInventoryListItemBase(LLViewerInventoryItem* item)
-: LLPanel()
-, mInventoryItemUUID(item ? item->getUUID() : LLUUID::null)
-, mIconCtrl(NULL)
-, mTitleCtrl(NULL)
-, mWidgetSpacing(WIDGET_SPACING)
-, mLeftWidgetsWidth(0)
-, mRightWidgetsWidth(0)
-, mNeedsRefresh(false)
+LLPanelInventoryListItemBase::LLPanelInventoryListItemBase(LLViewerInventoryItem* item, const LLPanelInventoryListItemBase::Params& params)
+:	LLPanel(params),
+	mInventoryItemUUID(item ? item->getUUID() : LLUUID::null),
+	mIconCtrl(NULL),
+	mTitleCtrl(NULL),
+	mWidgetSpacing(WIDGET_SPACING),
+	mLeftWidgetsWidth(0),
+	mRightWidgetsWidth(0),
+	mNeedsRefresh(false),
+	mHovered(false),
+	mSelected(false),
+	mSeparatorVisible(false),
+	mHoverImage(params.hover_image),
+	mSelectedImage(params.selected_image),
+	mSeparatorImage(params.separator_image)
 {
-}
+	LLIconCtrl::Params icon_params(params.item_icon);
+	applyXUILayout(icon_params, this);
 
-void LLPanelInventoryListItemBase::init()
-{
-	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_inventory_item.xml");
+	mIconCtrl = LLUICtrlFactory::create<LLIconCtrl>(icon_params);
+	if (mIconCtrl)
+	{
+		addChild(mIconCtrl);
+	}
+	else
+	{
+		mIconCtrl = dynamic_cast<LLIconCtrl*>(LLUICtrlFactory::createDefaultWidget<LLIconCtrl>("item_icon"));
+	}
+
+	LLTextBox::Params text_params(params.item_name);
+	applyXUILayout(text_params, this);
+
+	mTitleCtrl = LLUICtrlFactory::create<LLTextBox>(text_params);
+	if (mTitleCtrl)
+	{
+		addChild(mTitleCtrl);
+	}
+	else
+	{
+		mTitleCtrl = dynamic_cast<LLTextBox*>(LLUICtrlFactory::createDefaultWidget<LLTextBox>("item_title"));
+	}
 }
 
 class WidgetVisibilityChanger
diff --git a/indra/newview/llinventorylistitem.h b/indra/newview/llinventorylistitem.h
index f29d92d51c..575f6aec19 100644
--- a/indra/newview/llinventorylistitem.h
+++ b/indra/newview/llinventorylistitem.h
@@ -41,12 +41,12 @@
 // llui
 #include "llpanel.h"
 #include "llstyle.h"
+#include "lliconctrl.h"
+#include "lltextbox.h"
 
 // newview
 #include "llwearabletype.h"
 
-class LLIconCtrl;
-class LLTextBox;
 class LLViewerInventoryItem;
 
 /**
@@ -70,6 +70,11 @@ public:
 	{
 		Optional<LLStyle::Params>	default_style,
 									worn_style;
+		Optional<LLUIImage*>		hover_image,
+									selected_image,
+									separator_image;
+		Optional<LLIconCtrl::Params>	item_icon;
+		Optional<LLTextBox::Params>		item_name;
 		Params();
 	};
 
@@ -149,30 +154,22 @@ public:
 	/** Get the associated inventory item */
 	LLViewerInventoryItem* getItem() const;
 
+	void setSeparatorVisible(bool visible) { mSeparatorVisible = visible; }
+
 	virtual ~LLPanelInventoryListItemBase(){}
 
 protected:
 
-	LLPanelInventoryListItemBase(LLViewerInventoryItem* item);
+	LLPanelInventoryListItemBase(LLViewerInventoryItem* item, const Params& params);
 
 	typedef std::vector<LLUICtrl*> widget_array_t;
 
-	/**
-	 * Use it from a factory function to build panel, do not build panel in constructor
-	 */
-	virtual void init();
-
 	/**
 	 * Called after inventory item was updated, update panel widgets to reflect inventory changes.
 	 */
 	virtual void updateItem(const std::string& name,
 							EItemState item_state = IS_DEFAULT);
 
-	/** setter for mIconCtrl */
-	void setIconCtrl(LLIconCtrl* icon) { mIconCtrl = icon; }
-	/** setter for MTitleCtrl */
-	void setTitleCtrl(LLTextBox* tb) { mTitleCtrl = tb; }
-
 	void setLeftWidgetsWidth(S32 width) { mLeftWidgetsWidth = width; }
 	void setRightWidgetsWidth(S32 width) { mRightWidgetsWidth = width; }
 
@@ -221,6 +218,14 @@ private:
 	LLTextBox*		mTitleCtrl;
 
 	LLUIImagePtr	mIconImage;
+	LLUIImagePtr	mHoverImage;
+	LLUIImagePtr	mSelectedImage;
+	LLUIImagePtr	mSeparatorImage;
+
+	bool			mHovered;
+	bool			mSelected;
+	bool			mSeparatorVisible;
+
 	std::string		mHighlightedText;
 
 	widget_array_t	mLeftSideWidgets;
diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp
index 98282c1673..7104f3934d 100644
--- a/indra/newview/llsidetray.cpp
+++ b/indra/newview/llsidetray.cpp
@@ -230,15 +230,15 @@ LLSideTrayTab*  LLSideTrayTab::createInstance	()
 
 LLSideTray::Params::Params()
 :	collapsed("collapsed",false),
-	tab_btn_image_normal("tab_btn_image","sidebar_tab_left.tga"),
-	tab_btn_image_selected("tab_btn_image_selected","button_enabled_selected_32x128.tga"),
+	tab_btn_image_normal("tab_btn_image",LLUI::getUIImage("sidebar_tab_left.tga")),
+	tab_btn_image_selected("tab_btn_image_selected",LLUI::getUIImage("button_enabled_selected_32x128.tga")),
 	default_button_width("tab_btn_width",32),
 	default_button_height("tab_btn_height",32),
 	default_button_margin("tab_btn_margin",0)
 {}
 
 //virtual 
-LLSideTray::LLSideTray(Params& params)
+LLSideTray::LLSideTray(const Params& params)
 	   : LLPanel(params)
 	    ,mActiveTab(0)
 		,mCollapsed(false)
@@ -373,10 +373,10 @@ LLButton* LLSideTray::createButton	(const std::string& name,const std::string& i
 	bparams.follows.flags (FOLLOWS_LEFT | FOLLOWS_TOP);
 	bparams.rect (rect);
 	bparams.tab_stop(false);
-	bparams.image_unselected.name(sidetray_params.tab_btn_image_normal);
-	bparams.image_selected.name(sidetray_params.tab_btn_image_selected);
-	bparams.image_disabled.name(sidetray_params.tab_btn_image_normal);
-	bparams.image_disabled_selected.name(sidetray_params.tab_btn_image_selected);
+	bparams.image_unselected(sidetray_params.tab_btn_image_normal);
+	bparams.image_selected(sidetray_params.tab_btn_image_selected);
+	bparams.image_disabled(sidetray_params.tab_btn_image_normal);
+	bparams.image_disabled_selected(sidetray_params.tab_btn_image_selected);
 
 	LLButton* button = LLUICtrlFactory::create<LLButton> (bparams);
 	button->setLabel(name);
diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h
index 3a8d308425..406cdc9055 100644
--- a/indra/newview/llsidetray.h
+++ b/indra/newview/llsidetray.h
@@ -54,13 +54,13 @@ public:
 	:	public LLInitParam::Block<Params, LLPanel::Params>
 	{
 		// initial state
-		Optional<bool>		collapsed;
-		Optional<std::string>		tab_btn_image_normal;
-		Optional<std::string>		tab_btn_image_selected;
+		Optional<bool>				collapsed;
+		Optional<LLUIImage*>		tab_btn_image_normal,
+									tab_btn_image_selected;
 		
-		Optional<S32>				default_button_width;
-		Optional<S32>				default_button_height;
-		Optional<S32>				default_button_margin;
+		Optional<S32>				default_button_width,
+									default_button_height,
+									default_button_margin;
 		
 		Params();
 	};
@@ -68,7 +68,7 @@ public:
 	static LLSideTray*	getInstance		();
 	static bool			instanceCreated	();
 protected:
-	LLSideTray(Params& params);
+	LLSideTray(const Params& params);
 	typedef std::vector<LLSideTrayTab*> child_vector_t;
 	typedef child_vector_t::iterator					child_vector_iter_t;
 	typedef child_vector_t::const_iterator  			child_vector_const_iter_t;
diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp
index 9f9a9bef35..973ffc2e07 100644
--- a/indra/newview/llwearableitemslist.cpp
+++ b/indra/newview/llwearableitemslist.cpp
@@ -85,8 +85,8 @@ void LLPanelWearableListItem::onMouseLeave(S32 x, S32 y, MASK mask)
 	reshapeWidgets();
 }
 
-LLPanelWearableListItem::LLPanelWearableListItem(LLViewerInventoryItem* item)
-: LLPanelInventoryListItemBase(item)
+LLPanelWearableListItem::LLPanelWearableListItem(LLViewerInventoryItem* item, const LLPanelWearableListItem::Params& params)
+: LLPanelInventoryListItemBase(item, params)
 {
 }
 
@@ -101,15 +101,19 @@ LLPanelWearableOutfitItem* LLPanelWearableOutfitItem::create(LLViewerInventoryIt
 	LLPanelWearableOutfitItem* list_item = NULL;
 	if (item)
 	{
-		list_item = new LLPanelWearableOutfitItem(item, worn_indication_enabled);
-		list_item->init();
+		const LLPanelInventoryListItemBase::Params& params = LLUICtrlFactory::getDefaultParams<LLPanelInventoryListItemBase>();
+
+		list_item = new LLPanelWearableOutfitItem(item, worn_indication_enabled, params);
+		list_item->initFromParams(params);
+		list_item->postBuild();
 	}
 	return list_item;
 }
 
 LLPanelWearableOutfitItem::LLPanelWearableOutfitItem(LLViewerInventoryItem* item,
-													 bool worn_indication_enabled)
-: LLPanelInventoryListItemBase(item)
+													 bool worn_indication_enabled,
+													 const LLPanelWearableOutfitItem::Params& params)
+: LLPanelInventoryListItemBase(item, params)
 , mWornIndicationEnabled(worn_indication_enabled)
 {
 }
@@ -132,6 +136,17 @@ void LLPanelWearableOutfitItem::updateItem(const std::string& name,
 //////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////
+static LLWidgetNameRegistry::StaticRegistrar sRegisterPanelClothingListItem(&typeid(LLPanelClothingListItem::Params), "clothing_list_item");
+
+
+LLPanelClothingListItem::Params::Params()
+:	up_btn("up_btn"),
+	down_btn("down_btn"),
+	edit_btn("edit_btn"),
+	lock_panel("lock_panel"),
+	edit_panel("edit_panel"),
+	lock_icon("lock_icon")
+{}
 
 // static
 LLPanelClothingListItem* LLPanelClothingListItem::create(LLViewerInventoryItem* item)
@@ -139,24 +154,54 @@ LLPanelClothingListItem* LLPanelClothingListItem::create(LLViewerInventoryItem*
 	LLPanelClothingListItem* list_item = NULL;
 	if(item)
 	{
-		list_item = new LLPanelClothingListItem(item);
-		list_item->init();
+		const LLPanelClothingListItem::Params& params = LLUICtrlFactory::getDefaultParams<LLPanelClothingListItem>();
+		list_item = new LLPanelClothingListItem(item, params);
+		list_item->initFromParams(params);
+		list_item->postBuild();
 	}
 	return list_item;
 }
 
-LLPanelClothingListItem::LLPanelClothingListItem(LLViewerInventoryItem* item)
- : LLPanelDeletableWearableListItem(item)
+LLPanelClothingListItem::LLPanelClothingListItem(LLViewerInventoryItem* item, const LLPanelClothingListItem::Params& params)
+ : LLPanelDeletableWearableListItem(item, params)
 {
-}
+	LLButton::Params button_params = params.up_btn;
+	applyXUILayout(button_params, this);
+	addChild(LLUICtrlFactory::create<LLButton>(button_params));
 
-LLPanelClothingListItem::~LLPanelClothingListItem()
-{
+	button_params = params.down_btn;
+	applyXUILayout(button_params, this);
+	addChild(LLUICtrlFactory::create<LLButton>(button_params));
+
+	LLPanel::Params panel_params = params.lock_panel;
+	applyXUILayout(panel_params, this);
+	LLPanel* lock_panelp = LLUICtrlFactory::create<LLPanel>(panel_params);
+	addChild(lock_panelp);
+
+	panel_params = params.edit_panel;
+	applyXUILayout(panel_params, this);
+	LLPanel* edit_panelp = LLUICtrlFactory::create<LLPanel>(panel_params);
+	addChild(edit_panelp);
+
+	if (lock_panelp)
+	{
+		LLIconCtrl::Params icon_params = params.lock_icon;
+		applyXUILayout(icon_params, this);
+		lock_panelp->addChild(LLUICtrlFactory::create<LLIconCtrl>(icon_params));
+	}
+
+	if (edit_panelp)
+	{
+		button_params = params.edit_btn;
+		applyXUILayout(button_params, this);
+		edit_panelp->addChild(LLUICtrlFactory::create<LLButton>(button_params));
+	}
+
+	setSeparatorVisible(false);
 }
 
-void LLPanelClothingListItem::init()
+LLPanelClothingListItem::~LLPanelClothingListItem()
 {
-	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_clothing_list_item.xml");
 }
 
 BOOL LLPanelClothingListItem::postBuild()
@@ -178,30 +223,62 @@ BOOL LLPanelClothingListItem::postBuild()
 //////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////
 
+static LLWidgetNameRegistry::StaticRegistrar sRegisterPanelBodyPartsListItem(&typeid(LLPanelBodyPartsListItem::Params), "bodyparts_list_item");
+
+
+LLPanelBodyPartsListItem::Params::Params()
+:	edit_btn("edit_btn"),
+	edit_panel("edit_panel"),
+	lock_panel("lock_panel"),
+	lock_icon("lock_icon")
+{}
+
 // static
 LLPanelBodyPartsListItem* LLPanelBodyPartsListItem::create(LLViewerInventoryItem* item)
 {
 	LLPanelBodyPartsListItem* list_item = NULL;
 	if(item)
 	{
-		list_item = new LLPanelBodyPartsListItem(item);
-		list_item->init();
+		const Params& params = LLUICtrlFactory::getDefaultParams<LLPanelBodyPartsListItem>();
+		list_item = new LLPanelBodyPartsListItem(item, params);
+		list_item->initFromParams(params);
+		list_item->postBuild();
 	}
 	return list_item;
 }
 
-LLPanelBodyPartsListItem::LLPanelBodyPartsListItem(LLViewerInventoryItem* item)
-: LLPanelWearableListItem(item)
+LLPanelBodyPartsListItem::LLPanelBodyPartsListItem(LLViewerInventoryItem* item, const LLPanelBodyPartsListItem::Params& params)
+: LLPanelWearableListItem(item, params)
 {
-}
+	LLPanel::Params panel_params = params.edit_panel;
+	applyXUILayout(panel_params, this);
+	LLPanel* edit_panelp = LLUICtrlFactory::create<LLPanel>(panel_params);
+	addChild(edit_panelp);
 
-LLPanelBodyPartsListItem::~LLPanelBodyPartsListItem()
-{
+	panel_params = params.lock_panel;
+	applyXUILayout(panel_params, this);
+	LLPanel* lock_panelp = LLUICtrlFactory::create<LLPanel>(panel_params);
+	addChild(lock_panelp);
+	
+	if (edit_panelp)
+	{
+		LLButton::Params btn_params = params.edit_btn;
+		applyXUILayout(btn_params, this);
+		edit_panelp->addChild(LLUICtrlFactory::create<LLButton>(btn_params));
+	}
+
+	if (lock_panelp)
+	{
+		LLIconCtrl::Params icon_params = params.lock_icon;
+		applyXUILayout(icon_params, this);
+		lock_panelp->addChild(LLUICtrlFactory::create<LLIconCtrl>(icon_params));
+	}
+
+	setSeparatorVisible(true);
 }
 
-void LLPanelBodyPartsListItem::init()
+LLPanelBodyPartsListItem::~LLPanelBodyPartsListItem()
 {
-	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_body_parts_list_item.xml");
 }
 
 BOOL LLPanelBodyPartsListItem::postBuild()
@@ -214,6 +291,11 @@ BOOL LLPanelBodyPartsListItem::postBuild()
 	return TRUE;
 }
 
+static LLWidgetNameRegistry::StaticRegistrar sRegisterPanelDeletableWearableListItem(&typeid(LLPanelDeletableWearableListItem::Params), "deletable_wearable_list_item");
+
+LLPanelDeletableWearableListItem::Params::Params()
+:	delete_btn("delete_btn")
+{}
 
 // static
 LLPanelDeletableWearableListItem* LLPanelDeletableWearableListItem::create(LLViewerInventoryItem* item)
@@ -221,20 +303,22 @@ LLPanelDeletableWearableListItem* LLPanelDeletableWearableListItem::create(LLVie
 	LLPanelDeletableWearableListItem* list_item = NULL;
 	if(item)
 	{
-		list_item = new LLPanelDeletableWearableListItem(item);
-		list_item->init();
+		const Params& params = LLUICtrlFactory::getDefaultParams<LLPanelDeletableWearableListItem>();
+		list_item = new LLPanelDeletableWearableListItem(item, params);
+		list_item->initFromParams(params);
+		list_item->postBuild();
 	}
 	return list_item;
 }
 
-LLPanelDeletableWearableListItem::LLPanelDeletableWearableListItem(LLViewerInventoryItem* item)
-: LLPanelWearableListItem(item)
+LLPanelDeletableWearableListItem::LLPanelDeletableWearableListItem(LLViewerInventoryItem* item, const LLPanelDeletableWearableListItem::Params& params)
+: LLPanelWearableListItem(item, params)
 {
-}
+	LLButton::Params button_params = params.delete_btn;
+	applyXUILayout(button_params, this);
+	addChild(LLUICtrlFactory::create<LLButton>(button_params));
 
-void LLPanelDeletableWearableListItem::init()
-{
-	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_deletable_wearable_list_item.xml");
+	setSeparatorVisible(true);
 }
 
 BOOL LLPanelDeletableWearableListItem::postBuild()
@@ -260,8 +344,11 @@ LLPanelAttachmentListItem* LLPanelAttachmentListItem::create(LLViewerInventoryIt
 	LLPanelAttachmentListItem* list_item = NULL;
 	if(item)
 	{
-		list_item = new LLPanelAttachmentListItem(item);
-		list_item->init();
+		const Params& params = LLUICtrlFactory::getDefaultParams<LLPanelDeletableWearableListItem>();
+
+		list_item = new LLPanelAttachmentListItem(item, params);
+		list_item->initFromParams(params);
+		list_item->postBuild();
 	}
 	return list_item;
 }
@@ -284,27 +371,32 @@ void LLPanelAttachmentListItem::updateItem(const std::string& name,
 //////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////
+static LLWidgetNameRegistry::StaticRegistrar sRegisterPanelDummyClothingListItem(&typeid(LLPanelDummyClothingListItem::Params), "dummy_clothing_list_item");
+
+LLPanelDummyClothingListItem::Params::Params()
+:	add_panel("add_panel"),
+	add_btn("add_btn")
+{}
 
 LLPanelDummyClothingListItem* LLPanelDummyClothingListItem::create(LLWearableType::EType w_type)
 {
-	LLPanelDummyClothingListItem* list_item = new LLPanelDummyClothingListItem(w_type);
-	list_item->init();
+	const Params& params = LLUICtrlFactory::getDefaultParams<LLPanelDummyClothingListItem>();
+
+	LLPanelDummyClothingListItem* list_item = new LLPanelDummyClothingListItem(w_type, params);
+	list_item->initFromParams(params);
+	list_item->postBuild();
 	return list_item;
 }
 
 BOOL LLPanelDummyClothingListItem::postBuild()
 {
-	LLIconCtrl* icon = getChild<LLIconCtrl>("item_icon");
-	setIconCtrl(icon);
-	setTitleCtrl(getChild<LLTextBox>("item_name"));
-
 	addWidgetToRightSide("btn_add_panel");
 
 	setIconImage(LLInventoryIcon::getIcon(LLAssetType::AT_CLOTHING, LLInventoryType::IT_NONE, mWearableType, FALSE));
 	updateItem(wearableTypeToString(mWearableType));
 
 	// Make it look loke clothing item - reserve space for 'delete' button
-	setLeftWidgetsWidth(icon->getRect().mLeft);
+	setLeftWidgetsWidth(getChildView("item_icon")->getRect().mLeft);
 
 	setWidgetsVisible(false);
 	reshapeWidgets();
@@ -317,15 +409,23 @@ LLWearableType::EType LLPanelDummyClothingListItem::getWearableType() const
 	return mWearableType;
 }
 
-LLPanelDummyClothingListItem::LLPanelDummyClothingListItem(LLWearableType::EType w_type)
- : LLPanelWearableListItem(NULL)
- , mWearableType(w_type)
+LLPanelDummyClothingListItem::LLPanelDummyClothingListItem(LLWearableType::EType w_type, const LLPanelDummyClothingListItem::Params& params)
+:	LLPanelWearableListItem(NULL, params), 
+	mWearableType(w_type)
 {
-}
+	LLPanel::Params panel_params(params.add_panel);
+	applyXUILayout(panel_params, this);
+	LLPanel* add_panelp = LLUICtrlFactory::create<LLPanel>(panel_params);
+	addChild(add_panelp);
 
-void LLPanelDummyClothingListItem::init()
-{
-	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_dummy_clothing_list_item.xml");
+	if (add_panelp)
+	{
+		LLButton::Params button_params(params.add_btn);
+		applyXUILayout(button_params, this);
+		add_panelp->addChild(LLUICtrlFactory::create<LLButton>(button_params));
+	}
+
+	setSeparatorVisible(true);
 }
 
 typedef std::map<LLWearableType::EType, std::string> clothing_to_string_map_t;
diff --git a/indra/newview/llwearableitemslist.h b/indra/newview/llwearableitemslist.h
index d16a2a89c8..367b648b3d 100644
--- a/indra/newview/llwearableitemslist.h
+++ b/indra/newview/llwearableitemslist.h
@@ -68,7 +68,7 @@ public:
 
 protected:
 
-	LLPanelWearableListItem(LLViewerInventoryItem* item);
+	LLPanelWearableListItem(LLViewerInventoryItem* item, const Params& params);
 };
 
 /**
@@ -93,7 +93,7 @@ public:
 
 protected:
 	LLPanelWearableOutfitItem(LLViewerInventoryItem* item,
-							  bool worn_indication_enabled);
+							  bool worn_indication_enabled, const Params& params);
 
 private:
 	bool	mWornIndicationEnabled;
@@ -103,6 +103,13 @@ class LLPanelDeletableWearableListItem : public LLPanelWearableListItem
 {
 	LOG_CLASS(LLPanelDeletableWearableListItem);
 public:
+	struct Params : public LLInitParam::Block<Params, LLPanelWearableListItem::Params>
+	{
+		Optional<LLButton::Params>		delete_btn;
+
+		Params();
+	};
+
 
 	static LLPanelDeletableWearableListItem* create(LLViewerInventoryItem* item);
 
@@ -116,9 +123,7 @@ public:
 	inline void setShowDeleteButton(bool show) { setShowWidget("btn_delete", show); }
 
 protected:
-	LLPanelDeletableWearableListItem(LLViewerInventoryItem* item);
-
-	/*virtual*/ void init();
+	LLPanelDeletableWearableListItem(LLViewerInventoryItem* item, const Params& params);
 };
 
 /** Outfit list item for an attachment */
@@ -134,7 +139,7 @@ public:
 								EItemState item_state = IS_DEFAULT);
 
 protected:
-	LLPanelAttachmentListItem(LLViewerInventoryItem* item) : LLPanelDeletableWearableListItem(item) {};
+	LLPanelAttachmentListItem(LLViewerInventoryItem* item, const Params& params) : LLPanelDeletableWearableListItem(item, params) {};
 };
 
 /**
@@ -147,6 +152,18 @@ class LLPanelClothingListItem : public LLPanelDeletableWearableListItem
 	LOG_CLASS(LLPanelClothingListItem);
 public:
 
+	struct Params : public LLInitParam::Block<Params, LLPanelDeletableWearableListItem::Params>
+	{
+		Optional<LLButton::Params>		up_btn,
+										down_btn,
+										edit_btn;
+		Optional<LLPanel::Params>		lock_panel,
+										edit_panel;
+		Optional<LLIconCtrl::Params>	lock_icon;
+
+		Params();
+	};
+
 	static LLPanelClothingListItem* create(LLViewerInventoryItem* item);
 
 	virtual ~LLPanelClothingListItem();
@@ -162,18 +179,25 @@ public:
 	inline void setShowLockButton(bool show) { setShowWidget("btn_lock", show); }
 	inline void setShowEditButton(bool show) { setShowWidget("btn_edit_panel", show); }
 
-
 protected:
 
-	LLPanelClothingListItem(LLViewerInventoryItem* item);
-	
-	/*virtual*/ void init();
+	LLPanelClothingListItem(LLViewerInventoryItem* item, const Params& params);
+
 };
 
 class LLPanelBodyPartsListItem : public LLPanelWearableListItem
 {
 	LOG_CLASS(LLPanelBodyPartsListItem);
 public:
+	struct Params : public LLInitParam::Block<Params, LLPanelWearableListItem::Params>
+	{
+		Optional<LLButton::Params>		edit_btn;
+		Optional<LLPanel::Params>		lock_panel,
+										edit_panel;
+		Optional<LLIconCtrl::Params>	lock_icon;
+
+		Params();
+	};
 
 	static LLPanelBodyPartsListItem* create(LLViewerInventoryItem* item);
 
@@ -188,9 +212,7 @@ public:
 	inline void setShowEditButton(bool show) { setShowWidget("btn_edit_panel", show); }
 
 protected:
-	LLPanelBodyPartsListItem(LLViewerInventoryItem* item);
-
-	/*virtual*/ void init();
+	LLPanelBodyPartsListItem(LLViewerInventoryItem* item, const Params& params);
 };
 
 
@@ -202,15 +224,19 @@ protected:
 class LLPanelDummyClothingListItem : public LLPanelWearableListItem
 {
 public:
+	struct Params : public LLInitParam::Block<Params, LLPanelWearableListItem::Params>
+	{
+		Optional<LLPanel::Params> add_panel;
+		Optional<LLButton::Params> add_btn;
+		Params();
+	};
 	static LLPanelDummyClothingListItem* create(LLWearableType::EType w_type);
 
 	/*virtual*/ BOOL postBuild();
 	LLWearableType::EType getWearableType() const;
 
 protected:
-	LLPanelDummyClothingListItem(LLWearableType::EType w_type);
-
-	/*virtual*/ void init();
+	LLPanelDummyClothingListItem(LLWearableType::EType w_type, const Params& params);
 
 	static std::string wearableTypeToString(LLWearableType::EType w_type);
 
diff --git a/indra/newview/llwindebug.cpp b/indra/newview/llwindebug.cpp
index 502fefd4ef..0eb043a7a3 100644
--- a/indra/newview/llwindebug.cpp
+++ b/indra/newview/llwindebug.cpp
@@ -129,7 +129,7 @@ void  LLWinDebug::init()
 		s_first_run = false;
 
 		// Add this exeption hanlder to save windows style minidump.
-		AddVectoredExceptionHandler(0, &vectoredHandler);
+		//AddVectoredExceptionHandler(0, &vectoredHandler);
 	}
 }
 
diff --git a/indra/newview/skins/default/xui/en/panel_body_parts_list_item.xml b/indra/newview/skins/default/xui/en/panel_body_parts_list_item.xml
deleted file mode 100644
index 4f989a6f6f..0000000000
--- a/indra/newview/skins/default/xui/en/panel_body_parts_list_item.xml
+++ /dev/null
@@ -1,105 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
- follows="top|right|left"
- height="23"
- layout="topleft"
- left="0"
- name="wearable_item"
- top="0"
- width="380">
-    <icon
-     follows="top|right|left"
-     height="22"
-     image_name="ListItem_Over"
-     layout="topleft"
-     left="0"
-     name="hovered_icon"
-     top="1"
-     visible="false"
-     width="380" />
-    <icon
-     height="22"
-     follows="top|right|left"
-     image_name="ListItem_Select"
-     layout="topleft"
-     left="0"
-     name="selected_icon"
-     top="1"
-     visible="false"
-     width="380" />
-    <icon
-     height="16"
-     follows="top|left"
-     image_name="Inv_Object"
-     layout="topleft"
-     left="0"
-     name="item_icon"
-     top="2"
-     width="16" />
-    <text
-     follows="left|right"
-     height="16"
-     layout="topleft"
-     left_pad="5"
-     allow_html="false"
-     use_ellipses="true"
-     name="item_name"
-     text_color="white"
-     top="5"
-     value="..."
-     width="359" />
-    <panel
-     background_visible="false"
-     name="btn_lock"
-     layout="topleft"
-     follows="top|right"
-     top="0"
-     left="0"
-     height="23"
-     width="23"
-     tab_stop="false"
-     tool_tip="You don't have permission to edit">
-        <icon 
-         name="btn_lock1"
-         layout="topleft"
-         follows="top|right"
-         image_name="Locked_Icon"
-         top="2"
-         left="5"
-         height="13"
-         width="9"
-         tab_stop="false" />
-    </panel>
-    <panel
-     background_visible="false"
-     name="btn_edit_panel"
-     layout="topleft"
-     follows="top|right"
-     top="1"
-     left_pad="3"
-     height="23"
-     width="26"
-     tab_stop="false">
-         <button 
-          name="btn_edit"
-          layout="topleft"
-          follows="top|right"
-          image_overlay="Edit_Wrench"
-          top="0"
-          left="0"
-          height="23"
-          width="23"
-          tab_stop="false"
-          tool_tip="Edit this shape"/>
-      </panel>
-    <icon
-     follows="left|right|top"
-     height="3"
-     image_name="Wearables_Divider"
-     layout="bottomleft"
-     left="0"
-     name="wearable_type_separator_icon"
-     top="0"
-     visible="true"
-     width="380"/>
-</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_clothing_list_item.xml b/indra/newview/skins/default/xui/en/panel_clothing_list_item.xml
deleted file mode 100644
index 93d7720c57..0000000000
--- a/indra/newview/skins/default/xui/en/panel_clothing_list_item.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
- follows="top|right|left"
- height="23"
- layout="topleft"
- left="0"
- name="wearable_item"
- top="0"
- width="380">
-    <icon
-     follows="top|right|left"
-     height="22"
-     image_name="ListItem_Over"
-     layout="topleft"
-     left="0"
-     name="hovered_icon"
-     top="1"
-     visible="false"
-     width="380" />
-    <icon
-     height="22"
-     follows="top|right|left"
-     image_name="ListItem_Select"
-     layout="topleft"
-     left="0"
-     name="selected_icon"
-     top="1"
-     visible="false"
-     width="380" />
-    <button 
-     name="btn_delete"
-     layout="topleft"
-     follows="top|left"
-     image_unselected="Toast_CloseBtn"
-     image_selected="Toast_CloseBtn"
-     top="3"
-     left="0"
-     height="18"
-     width="18"
-     tab_stop="false"
-     tool_tip="Remove from outfit" />
-    <icon
-     height="16"
-     follows="top|left"
-     image_name="Inv_Object"
-     layout="topleft"
-     left_pad="3"
-     name="item_icon"
-     top="2"
-     width="16" />
-    <text
-     follows="left|right"
-     height="16"
-     layout="topleft"
-     left_pad="5"
-     allow_html="false"
-     use_ellipses="true"
-     name="item_name"
-     text_color="white"
-     top="5"
-     value="..."
-     width="359" />
-    <button 
-     name="btn_move_up"
-     layout="topleft"
-     follows="top|right"
-     image_overlay="UpArrow_Off"
-     top="1"
-     left="0"
-     height="23"
-     width="23"
-     tab_stop="false" />
-    <button 
-     name="btn_move_down"
-     layout="topleft"
-     follows="top|right"
-     image_overlay="DownArrow_Off"
-     top="1"
-     left_pad="3"
-     height="23"
-     width="23"
-     tab_stop="false" />
-    <panel
-     background_visible="false"
-     name="btn_lock"
-     layout="topleft"
-     follows="top|right"
-     top="0"
-     left="0"
-     height="23"
-     width="23"
-     tab_stop="false"
-     tool_tip="You don't have permission to edit">
-        <icon 
-         name="btn_lock1"
-         layout="topleft"
-         follows="top|right"
-         image_name="Locked_Icon"
-         top="2"
-         left="5"
-         height="13"
-         width="9"
-         tab_stop="false" />
-    </panel>
-    <panel
-     background_visible="false"
-     name="btn_edit_panel"
-     layout="topleft"
-     follows="top|right"
-     top="0"
-     left_pad="3"
-     height="23"
-     width="26"
-     tab_stop="false">
-        <button 
-         name="btn_edit"
-         layout="topleft"
-         follows="top|right"
-         image_overlay="Edit_Wrench"
-         top="1"
-         left="0"
-         height="23"
-         width="23"
-         tab_stop="false"
-         tool_tip="Edit this wearable"/>
-      </panel>
-    <icon
-     follows="left|right|top"
-     height="3"
-     image_name="Wearables_Divider"
-     layout="bottomleft"
-     left="0"
-     name="wearable_type_separator_icon"
-     top="0"
-     visible="false"
-     width="380"/>
-</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_deletable_wearable_list_item.xml b/indra/newview/skins/default/xui/en/panel_deletable_wearable_list_item.xml
deleted file mode 100644
index 75b5fd1532..0000000000
--- a/indra/newview/skins/default/xui/en/panel_deletable_wearable_list_item.xml
+++ /dev/null
@@ -1,73 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
- follows="top|right|left"
- height="23"
- layout="topleft"
- left="0"
- name="deletable_wearable_item"
- top="0"
- width="380">
-    <icon
-     follows="top|right|left"
-     height="22"
-     image_name="ListItem_Over"
-     layout="topleft"
-     left="0"
-     name="hovered_icon"
-     top="1"
-     visible="false"
-     width="380" />
-    <icon
-     height="22"
-     follows="top|right|left"
-     image_name="ListItem_Select"
-     layout="topleft"
-     left="0"
-     name="selected_icon"
-     top="1"
-     visible="false"
-     width="380" />
-    <button 
-     name="btn_delete"
-     layout="topleft"
-     follows="top|left"
-     image_unselected="Toast_CloseBtn"
-     image_selected="Toast_CloseBtn"
-     top="3"
-     left="0"
-     height="18"
-     width="18"
-     tab_stop="false"
-     tool_tip="Remove from outfit"/>
-    <icon
-     height="16"
-     follows="top|left"
-     image_name="Inv_Object"
-     layout="topleft"
-     left_pad="3"
-     name="item_icon"
-     top="2"
-     width="16" />
-    <text
-     follows="left|right"
-     height="16"
-     layout="topleft"
-     left_pad="5"
-     allow_html="false"
-     use_ellipses="true"
-     name="item_name"
-     text_color="white"
-     top="5"
-     value="..."
-     width="359" />
-    <icon
-     follows="left|right|top"
-     height="3"
-     image_name="Wearables_Divider"
-     layout="bottomleft"
-     left="0"
-     name="wearable_type_separator_icon"
-     top="0"
-     visible="true"
-     width="380"/>
-</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_dummy_clothing_list_item.xml b/indra/newview/skins/default/xui/en/panel_dummy_clothing_list_item.xml
deleted file mode 100644
index a5dd34bd22..0000000000
--- a/indra/newview/skins/default/xui/en/panel_dummy_clothing_list_item.xml
+++ /dev/null
@@ -1,83 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
- follows="top|right|left"
- height="23"
- layout="topleft"
- left="0"
- name="dummy_clothing_item"
- top="0"
- width="380">
-    <icon
-     follows="top|right|left"
-     height="22"
-     image_name="ListItem_Over"
-     layout="topleft"
-     left="0"
-     name="hovered_icon"
-     top="1"
-     visible="false"
-     width="380" />
-    <icon
-     height="22"
-     follows="top|right|left"
-     image_name="ListItem_Select"
-     layout="topleft"
-     left="0"
-     name="selected_icon"
-     top="1"
-     visible="false"
-     width="380" />
-    <icon
-     height="16"
-     color="0.75 0.75 0.75 1"
-     follows="top|left"
-     image_name="Inv_Object"
-     layout="topleft"
-     left="20"
-     name="item_icon"
-     top="2"
-     width="16" />
-    <text
-     follows="left|right"
-     height="16"
-     layout="topleft"
-     left_pad="5"
-     allow_html="false"
-     use_ellipses="true"
-     name="item_name"
-     text_color="LtGray_50"
-     top="4"
-     value="..."
-     width="359" />
-    <panel
-     name="btn_add_panel"
-     layout="topleft"
-     follows="top|right"
-     top="0"
-     left="0"
-     height="23"
-     width="26"
-     tab_stop="false">
-      <button 
-       name="btn_add"
-       layout="topleft"
-       follows="top|right"
-       image_overlay="AddItem_Off"
-       top="0"
-       left="0"
-       height="23"
-       width="23"
-       tab_stop="false"
-       tool_tip="Add more items of this type" />
-    </panel>
-    <icon
-     follows="left|right|top"
-     height="3"
-     image_name="Wearables_Divider"
-     layout="bottomleft"
-     left="0"
-     name="wearable_type_separator_icon"
-     top="0"
-     visible="true"
-     width="380"/>
-</panel>
diff --git a/indra/newview/skins/default/xui/en/widgets/bodyparts_list_item.xml b/indra/newview/skins/default/xui/en/widgets/bodyparts_list_item.xml
new file mode 100644
index 0000000000..c08267de82
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/bodyparts_list_item.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<bodyparts_list_item
+ follows="top|right|left"
+ height="23"
+ layout="topleft"
+ left="0"
+ name="wearable_item"
+ bottom="0"
+ width="380">
+  <item_icon
+   height="16"
+   follows="top|left"
+   image_name="Inv_Object"
+   layout="topleft"
+   left="0"
+   name="item_icon"
+   top="2"
+   width="16" />
+  <item_name
+   follows="left|right"
+   height="16"
+   layout="topleft"
+   left="21"
+   allow_html="false"
+   use_ellipses="true"
+   name="item_name"
+   text_color="white"
+   top="5"
+   value="..."
+   width="359" />
+  <lock_panel
+   background_visible="false"
+   name="btn_lock"
+   layout="topleft"
+   follows="top|right"
+   top="0"
+   left="0"
+   height="23"
+   width="23"
+   tab_stop="false"
+   tool_tip="You don't have permission to edit"/>
+  <lock_icon
+   name="btn_lock1"
+   layout="topleft"
+   follows="top|right"
+   image_name="Locked_Icon"
+   top="2"
+   left="5"
+   height="13"
+   width="9"
+   tab_stop="false" />
+  <edit_panel
+   background_visible="false"
+   name="btn_edit_panel"
+   layout="topleft"
+   follows="top|right"
+   top="1"
+   left="17"
+   height="23"
+   width="26"
+   tab_stop="false"/>
+  <edit_btn
+   name="btn_edit"
+   layout="topleft"
+   follows="top|right"
+   image_overlay="Edit_Wrench"
+   top="0"
+   left="0"
+   height="23"
+   width="23"
+   tab_stop="false"
+   tool_tip="Edit this shape"/>
+</bodyparts_list_item>
diff --git a/indra/newview/skins/default/xui/en/widgets/clothing_list_item.xml b/indra/newview/skins/default/xui/en/widgets/clothing_list_item.xml
new file mode 100644
index 0000000000..f7a05e9bc4
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/clothing_list_item.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<clothing_list_item
+ follows="top|right|left"
+ height="23"
+ layout="topleft"
+ left="0"
+ name="wearable_item"
+ bottom="0"
+ width="380">
+  <lock_icon
+   height="16"
+   follows="top|left"
+   image_name="Inv_Object"
+   layout="topleft"
+   left="21"
+   name="item_icon"
+   top="2"
+   width="16" />
+  <item_name
+   follows="left|right"
+   height="16"
+   layout="topleft"
+   left="42"
+   allow_html="false"
+   use_ellipses="true"
+   name="item_name"
+   text_color="white"
+   top="5"
+   value="..."
+   width="359" />
+  <up_btn
+   name="btn_move_up"
+   layout="topleft"
+   follows="top|right"
+   image_overlay="UpArrow_Off"
+   top="1"
+   left="0"
+   height="23"
+   width="23"
+   tab_stop="false" />
+  <down_btn
+   name="btn_move_down"
+   layout="topleft"
+   follows="top|right"
+   image_overlay="DownArrow_Off"
+   top="1"
+   left="26"
+   height="23"
+   width="23"
+   tab_stop="false" />
+  <lock_panel
+   background_visible="false"
+   name="btn_lock"
+   layout="topleft"
+   follows="top|right"
+   top="0"
+   left="0"
+   height="23"
+   width="23"
+   tab_stop="false"
+   tool_tip="You don't have permission to edit"/>
+  <lock_icon
+   name="btn_lock1"
+   layout="topleft"
+   follows="top|right"
+   image_name="Locked_Icon"
+   top="2"
+   left="5"
+   height="13"
+   width="9"
+   tab_stop="false" />
+  <edit_panel
+   background_visible="false"
+   name="btn_edit_panel"
+   layout="topleft"
+   follows="top|right"
+   top="0"
+   left="26"
+   height="23"
+   width="26"
+   tab_stop="false"/>
+  <edit_btn
+   name="btn_edit"
+   layout="topleft"
+   follows="top|right"
+   image_overlay="Edit_Wrench"
+   top="1"
+   left="0"
+   height="23"
+   width="23"
+   tab_stop="false"
+   tool_tip="Edit this wearable"/>
+</clothing_list_item>
diff --git a/indra/newview/skins/default/xui/en/widgets/deletable_wearable_list_item.xml b/indra/newview/skins/default/xui/en/widgets/deletable_wearable_list_item.xml
new file mode 100644
index 0000000000..88a4682e13
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/deletable_wearable_list_item.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<deletable_wearable_list_item
+  follows="top|right|left"
+  height="23"
+  layout="topleft"
+  left="0"
+  name="deletable_wearable_item"
+  bottom="0"
+  width="380">
+  <delete_btn
+  name="btn_delete"
+  layout="topleft"
+  follows="top|left"
+  image_unselected="Toast_CloseBtn"
+  image_selected="Toast_CloseBtn"
+  top="3"
+  left="0"
+  height="18"
+  width="18"
+  tab_stop="false"
+  tool_tip="Remove from outfit"/>
+  <item_icon
+   height="16"
+   follows="top|left"
+   image_name="Inv_Object"
+   layout="topleft"
+   left="24"
+   name="item_icon"
+   top="2"
+   width="16" />
+  <item_name
+   follows="left|right"
+   height="16"
+   layout="topleft"
+   left="45"
+   allow_html="false"
+   use_ellipses="true"
+   name="item_name"
+   text_color="white"
+   top="5"
+   value="..."
+   width="359" />
+</deletable_wearable_list_item>
diff --git a/indra/newview/skins/default/xui/en/widgets/dummy_clothing_list_item.xml b/indra/newview/skins/default/xui/en/widgets/dummy_clothing_list_item.xml
new file mode 100644
index 0000000000..80a877a6c2
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/dummy_clothing_list_item.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<dummy_clothing_list_item
+ follows="top|right|left"
+ height="23"
+ layout="topleft"
+ left="0"
+ name="dummy_clothing_item"
+ bottom="0"
+ width="380">
+  <item_icon
+    height="16"
+    color="0.75 0.75 0.75 1"
+    follows="top|left"
+    image_name="Inv_Object"
+    layout="topleft"
+    left="20"
+    name="item_icon"
+    top="2"
+    width="16" />
+  <item_name
+    follows="left|right"
+    height="16"
+    layout="topleft"
+    left="41"
+    allow_html="false"
+    use_ellipses="true"
+    name="item_name"
+    text_color="LtGray_50"
+    top="4"
+    value="..."
+    width="359" />
+  <add_panel
+    name="btn_add_panel"
+    layout="topleft"
+    follows="top|right"
+    top="0"
+    left="0"
+    height="23"
+    width="26"
+    tab_stop="false"/>
+  <add_btn
+     name="btn_add"
+     layout="topleft"
+     follows="top|right"
+     image_overlay="AddItem_Off"
+     top="0"
+     left="0"
+     height="23"
+     width="23"
+     tab_stop="false"
+     tool_tip="Add more items of this type" />
+</dummy_clothing_list_item>
diff --git a/indra/newview/skins/default/xui/en/widgets/inventory_list_item.xml b/indra/newview/skins/default/xui/en/widgets/inventory_list_item.xml
index 50be0ac1a1..4e7e2873b5 100644
--- a/indra/newview/skins/default/xui/en/widgets/inventory_list_item.xml
+++ b/indra/newview/skins/default/xui/en/widgets/inventory_list_item.xml
@@ -1,11 +1,13 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <inventory_list_item
- height="0"
- layout="topleft"
- left="0"
- name="inventory_list_item"
- top="0"
- width="0">
+  follows="top|right|left"
+  height="20"
+  name="inventory_item"
+  tab_stop="false" 
+  hover_image="ListItem_Over" 
+  selected_name="ListItem_Select"
+  separator_image="Wearables_Divider" 
+  width="380">
   <!-- DEFAULT style for inventory list item -->
   <default_style
    font="SansSerifSmall"
@@ -16,4 +18,25 @@
    font="SansSerifSmall"
    font.style="BOLD"
    color="EmphasisColor" />
+  <item_icon
+    height="16"
+    follows="top|left"
+    image_name="Inv_Object"
+    layout="topleft"
+    left="0"
+    name="item_icon"
+    top="0"
+    width="16" />
+  <item_name
+    follows="left|right"
+    height="20"
+    layout="topleft"
+    left="21"
+    allow_html="false"
+    use_ellipses="true"
+    name="item_name"
+    text_color="white"
+    top="4"
+    value="..."
+    width="359" />
 </inventory_list_item>
-- 
cgit v1.2.3


From ded3253d1f3d81421c2159805bc3df4f81e13d53 Mon Sep 17 00:00:00 2001
From: Richard Linden <none@none>
Date: Fri, 9 Jul 2010 14:27:56 -0700
Subject: forgot to remove a file

---
 .../skins/default/xui/en/panel_inventory_item.xml  | 51 ----------------------
 1 file changed, 51 deletions(-)
 delete mode 100644 indra/newview/skins/default/xui/en/panel_inventory_item.xml

diff --git a/indra/newview/skins/default/xui/en/panel_inventory_item.xml b/indra/newview/skins/default/xui/en/panel_inventory_item.xml
deleted file mode 100644
index f1b7b92ece..0000000000
--- a/indra/newview/skins/default/xui/en/panel_inventory_item.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
- follows="top|right|left"
- height="20"
- layout="topleft"
- left="0"
- name="inventory_item"
- top="0"
- width="380">
-    <icon
-     follows="top|right|left"
-     height="20"
-     image_name="ListItem_Over"
-     layout="topleft"
-     left="0"
-     name="hovered_icon"
-     top="0"
-     visible="false"
-     width="380" />
-    <icon
-     height="20"
-     follows="top|right|left"
-     image_name="ListItem_Select"
-     layout="topleft"
-     left="0"
-     name="selected_icon"
-     top="0"
-     visible="false"
-     width="380" />
-    <icon
-     height="16"
-     follows="top|left"
-     image_name="Inv_Object"
-     layout="topleft"
-     left="0"
-     name="item_icon"
-     top="0"
-     width="16" />
-    <text
-     follows="left|right"
-     height="20"
-     layout="topleft"
-     left_pad="5"
-     allow_html="false"
-     use_ellipses="true"
-     name="item_name"
-     text_color="white"
-     top="4"
-     value="..."
-     width="359" />
-</panel>
-- 
cgit v1.2.3