diff options
| -rwxr-xr-x | indra/newview/llgroupmgr.cpp | 9 | ||||
| -rwxr-xr-x | indra/newview/llgroupmgr.h | 15 | ||||
| -rwxr-xr-x | indra/newview/llnamelistctrl.cpp | 58 | ||||
| -rwxr-xr-x | indra/newview/llnamelistctrl.h | 17 | ||||
| -rwxr-xr-x | indra/newview/llpanelgrouproles.cpp | 195 | ||||
| -rwxr-xr-x | indra/newview/llpanelgrouproles.h | 13 | ||||
| -rwxr-xr-x | indra/newview/skins/default/xui/en/panel_group_roles.xml | 1251 | 
7 files changed, 830 insertions, 728 deletions
diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp index bfdb8588e4..7cb53066ea 100755 --- a/indra/newview/llgroupmgr.cpp +++ b/indra/newview/llgroupmgr.cpp @@ -235,7 +235,6 @@ LLGroupMgrGroupData::LLGroupMgrGroupData(const LLUUID& id) :  	mRoleDataComplete(false),  	mRoleMemberDataComplete(false),  	mGroupPropertiesDataComplete(false), -	mGroupBanStatus(LLGroupMgrGroupData::STATUS_INIT),  	mPendingRoleMemberRequest(false),  	mAccessTime(0.0f)  { @@ -747,14 +746,11 @@ void LLGroupMgrGroupData::cancelRoleChanges()  void LLGroupMgrGroupData::createBanEntry(const LLUUID& ban_id, const LLGroupBanData& ban_data)  {   	mBanList[ban_id] = ban_data; -	// Refresh the list  }  void LLGroupMgrGroupData::removeBanEntry(const LLUUID& ban_id)  { -	// Once we get this hooked up to the backend, we want to confirm the create or delete worked.  	mBanList.erase(ban_id); -	// Refresh the list  } @@ -1948,9 +1944,6 @@ void LLGroupMgr::processGroupBanRequest(const LLSD& content)  	if (!gdatap)  		return; -	//LLSD banlist = LLSD::emptyMap(); - -  	LLSD::map_const_iterator i		= content["ban_list"].beginMap();  	LLSD::map_const_iterator iEnd	= content["ban_list"].endMap();  	for(;i != iEnd; ++i) @@ -1963,7 +1956,7 @@ void LLGroupMgr::processGroupBanRequest(const LLSD& content)  	}  	gdatap->mChanged = TRUE; -	gdatap->setGroupBanStatus(LLGroupMgrGroupData::STATUS_COMPLETE); +//	gdatap->setGroupBanStatus(LLGroupMgrGroupData::STATUS_COMPLETE);  	LLGroupMgr::getInstance()->notifyObservers(GC_BANLIST);  } diff --git a/indra/newview/llgroupmgr.h b/indra/newview/llgroupmgr.h index 49e354a26c..7e3297b757 100755 --- a/indra/newview/llgroupmgr.h +++ b/indra/newview/llgroupmgr.h @@ -212,14 +212,6 @@ struct LLGroupTitle  class LLGroupMgrGroupData  {  friend class LLGroupMgr; -public: -	enum EGroupDataStatus -	{ -		STATUS_INIT, -		STATUS_REQUESTING, -		STATUS_COMPLETE -	}; -  public:  	LLGroupMgrGroupData(const LLUUID& id); @@ -250,9 +242,6 @@ public:  	bool isRoleDataComplete() { return mRoleDataComplete; }  	bool isRoleMemberDataComplete() { return mRoleMemberDataComplete; }  	bool isGroupPropertiesDataComplete() { return mGroupPropertiesDataComplete; } -	 -	EGroupDataStatus getGroupBanStatus() { return mGroupBanStatus; } -	void setGroupBanStatus(EGroupDataStatus status) { mGroupBanStatus = status; }  	F32 getAccessTime() const { return mAccessTime; }  	void setAccessed(); @@ -271,8 +260,6 @@ public:  	void removeBanEntry(const LLUUID& ban_id); - -  public:  	typedef	std::map<LLUUID,LLGroupMemberData*> member_list_t;  	typedef	std::map<LLUUID,LLGroupRoleData*> role_list_t; @@ -319,8 +306,6 @@ private:  	bool				mRoleDataComplete;  	bool				mRoleMemberDataComplete;  	bool				mGroupPropertiesDataComplete; -	 -	EGroupDataStatus	mGroupBanStatus;  	bool				mPendingRoleMemberRequest;  	F32					mAccessTime; diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp index 7f396b7b7e..ed684004f0 100755 --- a/indra/newview/llnamelistctrl.cpp +++ b/indra/newview/llnamelistctrl.cpp @@ -65,7 +65,8 @@ LLNameListCtrl::LLNameListCtrl(const LLNameListCtrl::Params& p)  	mNameColumn(p.name_column.column_name),  	mAllowCallingCardDrop(p.allow_calling_card_drop),  	mShortNames(p.short_names), -	mAvatarNameCacheConnection() +	mAvatarNameCacheConnection(), +	mPendingLookupsRemaining(0)  {}  // public @@ -79,6 +80,12 @@ LLScrollListItem* LLNameListCtrl::addNameItem(const LLUUID& agent_id, EAddPositi  	item.enabled = enabled;  	item.target = INDIVIDUAL; +	////////////////////////////////////////////////////////////////////////// +	// BAKER - FIX NameListCtrl +	//mPendingLookupsRemaining--; +	////////////////////////////////////////////////////////////////////////// + +  	return addNameItemRow(item, pos, suffix);  } @@ -275,6 +282,12 @@ void LLNameListCtrl::addGroupNameItem(LLNameListCtrl::NameItem& item, EAddPositi  LLScrollListItem* LLNameListCtrl::addNameItem(LLNameListCtrl::NameItem& item, EAddPosition pos)  {  	item.target = INDIVIDUAL; + +	////////////////////////////////////////////////////////////////////////// +	// BAKER - FIX NameListCtrl +	//mPendingLookupsRemaining--; +	////////////////////////////////////////////////////////////////////////// +  	return addNameItemRow(item, pos);  } @@ -284,6 +297,12 @@ LLScrollListItem* LLNameListCtrl::addElement(const LLSD& element, EAddPosition p  	LLParamSDParser parser;  	parser.readSD(element, item_params);  	item_params.userdata = userdata; + +	////////////////////////////////////////////////////////////////////////// +	// BAKER - FIX NameListCtrl +	//mPendingLookupsRemaining--; +	////////////////////////////////////////////////////////////////////////// +  	return addNameItemRow(item_params, pos);  } @@ -335,6 +354,20 @@ LLScrollListItem* LLNameListCtrl::addNameItemRow(  					mAvatarNameCacheConnection.disconnect();  				}  				mAvatarNameCacheConnection = LLAvatarNameCache::get(id,boost::bind(&LLNameListCtrl::onAvatarNameCache,this, _1, _2, item->getHandle())); + +				////////////////////////////////////////////////////////////////////////// +				// BAKER - FIX NameListCtrl +				if(mPendingLookupsRemaining <= 0) +				{ +					// We might get into a state where mPendingLookupsRemaining might +					//	go negative.  So just reset it right now and figure out if it's +					//	possible later :) +					mPendingLookupsRemaining = 0; +					mNameListCompleteSignal(false); +				} +				mPendingLookupsRemaining++; +				////////////////////////////////////////////////////////////////////////// +				  			}  			break;  		} @@ -386,6 +419,12 @@ void LLNameListCtrl::removeNameItem(const LLUUID& agent_id)  	{  		selectNthItem(idx); // not sure whether this is needed, taken from previous implementation  		deleteSingleItem(idx); + +		////////////////////////////////////////////////////////////////////////// +		// BAKER - FIX NameListCtrl +		mPendingLookupsRemaining--; +		////////////////////////////////////////////////////////////////////////// +  	}  } @@ -412,6 +451,23 @@ void LLNameListCtrl::onAvatarNameCache(const LLUUID& agent_id,  		}  	} +	////////////////////////////////////////////////////////////////////////// +	// BAKER - FIX NameListCtrl + 	//if (mPendingLookupsRemaining <= 0) + 	{ + 		// We might get into a state where mPendingLookupsRemaining might + 		//	go negative.  So just reset it right now and figure out if it's + 		//	possible later :) + 		//mPendingLookupsRemaining = 0; +		 + 		mNameListCompleteSignal(true); + 	} + 	//else + 	{ + 	//	mPendingLookupsRemaining--; + 	} +	////////////////////////////////////////////////////////////////////////// +  	dirtyColumns();  } diff --git a/indra/newview/llnamelistctrl.h b/indra/newview/llnamelistctrl.h index 271802d48a..80ed081fd3 100755 --- a/indra/newview/llnamelistctrl.h +++ b/indra/newview/llnamelistctrl.h @@ -67,6 +67,8 @@ class LLNameListCtrl  :	public LLScrollListCtrl, public LLInstanceTracker<LLNameListCtrl>  {  public: +	typedef boost::signals2::signal<void(bool)> namelist_complete_signal_t; +  	typedef enum e_name_type  	{  		INDIVIDUAL, @@ -151,7 +153,7 @@ public:  	/*virtual*/ void updateColumns(); -	/*virtual*/ void	mouseOverHighlightNthItem( S32 index ); +	/*virtual*/ void mouseOverHighlightNthItem( S32 index );  private:  	void showInspector(const LLUUID& avatar_id, bool is_group);  	void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name, LLHandle<LLNameListItem> item); @@ -162,6 +164,19 @@ private:  	BOOL			mAllowCallingCardDrop;  	bool			mShortNames;  // display name only, no SLID  	boost::signals2::connection mAvatarNameCacheConnection; + +	////////////////////////////////////////////////////////////////////////// +	// BAKER: Fixing name list control not being updated properly. +	S32 mPendingLookupsRemaining; +	namelist_complete_signal_t mNameListCompleteSignal; +	 +public: +	boost::signals2::connection setOnNameListCompleteCallback(boost::function<void(bool)> onNameListCompleteCallback)  +	{  +		return mNameListCompleteSignal.connect(onNameListCompleteCallback);  +	} +	////////////////////////////////////////////////////////////////////////// +  }; diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp index f3cb9900fe..76cb3cc498 100755 --- a/indra/newview/llpanelgrouproles.cpp +++ b/indra/newview/llpanelgrouproles.cpp @@ -1304,6 +1304,8 @@ void LLPanelGroupMembersSubTab::deactivate()  bool LLPanelGroupMembersSubTab::needsApply(std::string& mesg)  { +	LL_INFOS("BAKER") << "[BAKER] needsApply()" << LL_ENDL; +	  	return mChanged;  } @@ -2711,8 +2713,6 @@ void LLPanelGroupActionsSubTab::setGroupID(const LLUUID& id)  	LLPanelGroupSubTab::setGroupID(id);  } -////////////////////////////////////////////////////////////////////////// -  ////////////////////////////  // LLPanelGroupBanListSubTab @@ -2724,14 +2724,10 @@ LLPanelGroupBanListSubTab::LLPanelGroupBanListSubTab()  	  mBanList(NULL),  	  mCreateBanButton(NULL),  	  mDeleteBanButton(NULL) -{ -	LL_INFOS("BAKER") << "[BAKER] LLPanelGroupBanListSubTab::ctor()" << LL_ENDL; -} +{}  BOOL LLPanelGroupBanListSubTab::postBuildSubTab(LLView* root)  { -	LL_INFOS("BAKER") << "[BAKER] LLPanelGroupBanListSubTab::postBuildSubTab()" << LL_ENDL; -  	LLPanelGroupSubTab::postBuildSubTab(root);  	// Upcast parent so we can ask it for sibling controls. @@ -2740,49 +2736,50 @@ BOOL LLPanelGroupBanListSubTab::postBuildSubTab(LLView* root)  	// Look recursively from the parent to find all our widgets.  	bool recurse = true; -	// BAKER TODO: -	//	What are these? Looks like something inhereted from LLPanelGroupSubTab -	mHeader = parent->getChild<LLPanel>("banlist_header", recurse); -	mFooter = parent->getChild<LLPanel>("banlist_footer", recurse); -	////////////////////////////////////////////////////////////////////////// +	mHeader	= parent->getChild<LLPanel>("banlist_header", recurse); +	mFooter	= parent->getChild<LLPanel>("banlist_footer", recurse);  	mBanList = parent->getChild<LLNameListCtrl>("ban_list", recurse); -	mCreateBanButton = parent->getChild<LLButton>("ban_create", recurse); -	mDeleteBanButton = parent->getChild<LLButton>("ban_delete", recurse); +	 +	mCreateBanButton		= parent->getChild<LLButton>("ban_create", recurse); +	mDeleteBanButton		= parent->getChild<LLButton>("ban_delete", recurse); +	mRefreshBanListButton	= parent->getChild<LLButton>("ban_refresh", recurse); -	if(!mBanList || !mCreateBanButton || !mDeleteBanButton) +	if(!mBanList || !mCreateBanButton || !mDeleteBanButton || !mRefreshBanListButton)  		return FALSE;  	mBanList->setCommitOnSelectionChange(TRUE);  	mBanList->setCommitCallback(onBanEntrySelect, this);  	mCreateBanButton->setClickedCallback(onCreateBanEntry, this); -	mCreateBanButton->setEnabled(FALSE); -	 +	mCreateBanButton->setEnabled(TRUE); +  	mDeleteBanButton->setClickedCallback(onDeleteBanEntry, this);  	mDeleteBanButton->setEnabled(FALSE); -	setFooterEnabled(FALSE); - -	LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID); -	if(gdatap && (gdatap->getGroupBanStatus() == LLGroupMgrGroupData::STATUS_INIT))  -	{ -		LLGroupMgr::getInstance()->sendGroupBanRequest(LLGroupMgr::REQUEST_GET, mGroupID); -		gdatap->setGroupBanStatus(LLGroupMgrGroupData::STATUS_REQUESTING); -	} +	mRefreshBanListButton->setClickedCallback(onRefreshBanList, this); +	mRefreshBanListButton->setEnabled(FALSE); +	mBanList->setOnNameListCompleteCallback(boost::bind(&LLPanelGroupBanListSubTab::onBanListCompleted, this, _1)); +	 +	setFooterEnabled(FALSE);  	return TRUE;  }  void LLPanelGroupBanListSubTab::activate()  { -	LL_INFOS("BAKER") << "[BAKER] LLPanelGroupBanListSubTab::activate()" << LL_ENDL; -	  	LLPanelGroupSubTab::activate();  	mBanList->deselectAllItems();  	mDeleteBanButton->setEnabled(FALSE); +	// BAKER: Should I really request everytime activate() is called? +	//		  Perhaps I should only do it on a force refresh, or if an action on the list happens... +	//		  Because it's not going to live-update the list anyway... You'd have to refresh if you  +	//		  wanted to see someone else's additions anyway... +	//		   +	LLGroupMgr::getInstance()->sendGroupBanRequest(LLGroupMgr::REQUEST_GET, mGroupID); +  	setFooterEnabled(FALSE);  	update(GC_ALL);  } @@ -2820,68 +2817,53 @@ void LLPanelGroupBanListSubTab::update(LLGroupChange gc)  	//if (gc != GC_ALL  && gc != GC_BANLIST)  	//	return; -	LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID); -	if(!gdatap)  -	{ -		LL_INFOS("BAKER") << "[BAKER] No group data!" << LL_ENDL; -		return; -	} - -	switch(gdatap->getGroupBanStatus()) -	{ -	// Must be initial update [	Check if I should request this at panel creation -	//							with everything else -- might as well] -	// Request our ban list! -	case LLGroupMgrGroupData::STATUS_INIT: -		LLGroupMgr::getInstance()->sendGroupBanRequest(LLGroupMgr::REQUEST_GET, mGroupID); -		gdatap->setGroupBanStatus(LLGroupMgrGroupData::STATUS_REQUESTING); -		break; +// 	LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID); +// 	if(!gdatap)  +// 	{ +// 		LL_INFOS("BAKER") << "[BAKER] No group data!" << LL_ENDL; +// 		return; +// 	} + +	populateBanList(); +// 	// Do I even need this anymore?   +// 	switch(gdatap->getGroupBanStatus()) +// 	{ +// 	// Must be initial update [	Check if I should request this at panel creation +// 	//							with everything else -- might as well] +// 	// Request our ban list! +// 	case LLGroupMgrGroupData::STATUS_INIT: +// 		LLGroupMgr::getInstance()->sendGroupBanRequest(LLGroupMgr::REQUEST_GET, mGroupID); +// 		gdatap->setGroupBanStatus(LLGroupMgrGroupData::STATUS_REQUESTING); +// 		break; +// 	 +// 	// Already have a request out -- don't bother sending another one  +// 	// Repeat sending won't make a difference, as it'll be behind a load balancer +// 	case LLGroupMgrGroupData::STATUS_REQUESTING: +// 		// Maybe here we call populate ban list as well, and see about how many +// 		// more names we need to complete the ban list +// 		break; +// 	 +// 	//	See if the list needs updating -- if we call update, but nothing changed, +// 	//	there's no reason to send another request. +// 	//		[NOTHING CHANGED]	- Do Nothing! +// 	//		[SOMETHING CHANGED]	- Don't panic! Just repopulate the ban list!  +// 	case LLGroupMgrGroupData::STATUS_COMPLETE: +// 		populateBanList(); +// 		break; +// 	} +// 	 -	// Already have a request out -- don't bother sending another one  -	// Repeat sending won't make a difference, as it'll be behind a load balancer -	case LLGroupMgrGroupData::STATUS_REQUESTING: -		break; -	 -	//	See if the list needs updating -- if we call update, but nothing changed, -	//	there's no reason to send another request. -	//		[NOTHING CHANGED]	- Do Nothing! -	//		[SOMETHING CHANGED]	- Don't panic! Just repopulate the ban list!  -	case LLGroupMgrGroupData::STATUS_COMPLETE: -		populateBanList(); -		break; -	} +  }  void LLPanelGroupBanListSubTab::draw()  {  	LLPanelGroupSubTab::draw(); -	// if(mPendingBanUpdate) +	//if(mPendingBanUpdate)  	//	populateBanList();  } -void LLPanelGroupBanListSubTab::populateBanList() -{ -	LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID); -	if(!gdatap)  -	{ -		LL_INFOS("BAKER") << "[BAKER] No group data!" << LL_ENDL; -		return; -	} - -	if(gdatap->getGroupBanStatus() != LLGroupMgrGroupData::STATUS_COMPLETE) -		return; - -	mBanList->deleteAllItems(); -	std::map<LLUUID,LLGroupBanData>::const_iterator entry = gdatap->mBanList.begin(); -	for(; entry != gdatap->mBanList.end(); entry++) -	{ -		LLNameListCtrl::NameItem ban_entry; -		ban_entry.value = entry->first; -		mBanList->addNameItemRow(ban_entry); -	} -} -  void LLPanelGroupBanListSubTab::onBanEntrySelect(LLUICtrl* ctrl, void* user_data)  { @@ -3035,10 +3017,59 @@ void LLPanelGroupBanListSubTab::handleDeleteBanEntry()  } -void LLPanelGroupBanListSubTab::setGroupID(const LLUUID& id) +void LLPanelGroupBanListSubTab::onRefreshBanList(void* user_data)  { -	LL_INFOS("BAKER") << "[BAKER] LLPanelGroupBanListSubTab::setGroupID()" << LL_ENDL; +	LL_INFOS("BAKER") << "[BAKER] LLPanelGroupBanListSubTab::onRefreshBanList()" << LL_ENDL; + +	LLPanelGroupBanListSubTab* self = static_cast<LLPanelGroupBanListSubTab*>(user_data); +	if (!self)  +		return; + +	self->handleRefreshBanList(); +} + +void LLPanelGroupBanListSubTab::handleRefreshBanList() +{ +	LL_INFOS("BAKER") << "[BAKER] LLPanelGroupBanListSubTab::handleRefreshBanList()" << LL_ENDL; +	mRefreshBanListButton->setEnabled(FALSE); +	LLGroupMgr::getInstance()->sendGroupBanRequest(LLGroupMgr::REQUEST_GET, mGroupID); +} + + +void LLPanelGroupBanListSubTab::onBanListCompleted(bool isComplete) +{ +	if(isComplete) +	{ +		mRefreshBanListButton->setEnabled(TRUE); +		populateBanList(); +	} +} + +void LLPanelGroupBanListSubTab::populateBanList() +{ +	LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID); +	if(!gdatap)  +	{ +		LL_INFOS("BAKER") << "[BAKER] No group data!" << LL_ENDL; +		return; +	} + +	mBanList->deleteAllItems(); +	std::map<LLUUID,LLGroupBanData>::const_iterator entry = gdatap->mBanList.begin(); +	for(; entry != gdatap->mBanList.end(); entry++) +	{ +		LLNameListCtrl::NameItem ban_entry; +		ban_entry.value = entry->first; +		mBanList->addNameItemRow(ban_entry); +	} + +	mRefreshBanListButton->setEnabled(TRUE); +} + + +void LLPanelGroupBanListSubTab::setGroupID(const LLUUID& id) +{  	if(mBanList)  		mBanList->deleteAllItems(); @@ -3050,3 +3081,5 @@ void LLPanelGroupBanListSubTab::setGroupID(const LLUUID& id) + + diff --git a/indra/newview/llpanelgrouproles.h b/indra/newview/llpanelgrouproles.h index 01c1d8c16d..2f37805f48 100755 --- a/indra/newview/llpanelgrouproles.h +++ b/indra/newview/llpanelgrouproles.h @@ -335,7 +335,6 @@ public:  	// Triggered when group information changes in the group manager.  	virtual void update(LLGroupChange gc); -	//  	virtual void draw();  	static void onBanEntrySelect(LLUICtrl* ctrl, void* user_data); @@ -349,18 +348,24 @@ public:  	static void onDeleteBanEntry(void* user_data);  	void handleDeleteBanEntry(); -	 -	virtual void setGroupID(const LLUUID& id); + +	static void onRefreshBanList(void* user_data); +	void handleRefreshBanList(); + +	void onBanListCompleted(bool isComplete);  protected:  	void populateBanList(); +public: +	virtual void setGroupID(const LLUUID& id);  protected:  	LLNameListCtrl* mBanList;  	LLButton* mCreateBanButton;  	LLButton* mDeleteBanButton; -	 +	LLButton* mRefreshBanListButton; +  };  #endif // LL_LLPANELGROUPROLES_H diff --git a/indra/newview/skins/default/xui/en/panel_group_roles.xml b/indra/newview/skins/default/xui/en/panel_group_roles.xml index 9817f70ac7..70d19de848 100755 --- a/indra/newview/skins/default/xui/en/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/en/panel_group_roles.xml @@ -7,132 +7,132 @@   top="0"   name="roles_tab"   width="304"> -    <panel.string -     name="default_needs_apply_text"> -        There are unsaved changes -    </panel.string> -    <panel.string -     name="want_apply_text"> -        Do you want to save your changes? -    </panel.string> -    <panel.string -     name="help_text" /> -    <tab_container -    border="false" -     follows="left|top|right" -     height="552" -     halign="center" +  <panel.string +   name="default_needs_apply_text"> +    There are unsaved changes +  </panel.string> +  <panel.string +   name="want_apply_text"> +    Do you want to save your changes? +  </panel.string> +  <panel.string +   name="help_text" /> +  <tab_container +  border="false" +   follows="left|top|right" +   height="552" +   halign="center" +   layout="topleft" +   left="0" +   right="-1" +   name="roles_tab_container" +   tab_position="top" +   tab_height="22" +   tab_min_width="90" +   top="0" +   width="304"> +    <panel +     border="false" +     follows="all" +     height="303" +     label="MEMBERS"       layout="topleft"       left="0"       right="-1" -     name="roles_tab_container" -     tab_position="top" -     tab_height="22" -     tab_min_width="90" -     top="0" -     width="304"> -        <panel -         border="false" -         follows="all" -         height="303" -         label="MEMBERS" -         layout="topleft" -         left="0" -         right="-1" -         help_topic="roles_members_tab" -         name="members_sub_tab" -         tool_tip="Members" -         class="panel_group_members_subtab"> -            <panel.string -             name="help_text"> -                You can add or remove Roles assigned to Members. -Select multiple Members by holding the Ctrl key and -clicking on their names. -            </panel.string> -            <panel.string -             name="donation_area"> -                [AREA] m² -            </panel.string> -            <panel.string -             name="power_folder_icon" translate="false"> -                Inv_FolderClosed -            </panel.string> -            <panel.string -             name="power_all_have_icon" translate="false"> -                Checkbox_On -            </panel.string> -            <panel.string -             name="power_partial_icon" translate="false"> -                Checkbox_Off -            </panel.string> -         <filter_editor -         layout="topleft" -         top="5" -         left="5" -         right="-5" -         height="22" -         search_button_visible="false" -         follows="left|top|right" -         label="Filter Members" -         name="filter_input" /> -            <name_list -             column_padding="2" -             draw_heading="true" -             height="240" -             follows="left|top|right" -             layout="topleft" -             left="0" -             right="-1" -             multi_select="true" -             name="member_list" -             short_names="false"  -             top_pad="5"> -                <name_list.columns -                 label="Member" -                 name="name" -               relative_width="0.44" /> -                <name_list.columns -                 label="Donation" -                 name="donated" -         relative_width="0.25" /> -                <name_list.columns -                 label="Status" -                 name="online" -                 relative_width="0.14" /> -            </name_list> -            <button -             height="23" -             follows="top|left" -             label="Invite" -             left="5" -             name="member_invite" -             width="100" /> -            <button -             height="23" -             label="Eject" -             follows="top|left" -             left_pad="10" -             name="member_eject" -             width="100" /> -            <button -             height="23" -             label="Ban" -             follows="top|left" -             left_pad="10" -             name="member_ban" -             width="100" /> -        </panel> -        <panel -         border="false" -         height="303" -         label="ROLES" -         layout="topleft" -         left="0" -         right="-1" -         help_topic="roles_roles_tab" -         name="roles_sub_tab" -         class="panel_group_roles_subtab"> -           <!-- <button +     help_topic="roles_members_tab" +     name="members_sub_tab" +     tool_tip="Members" +     class="panel_group_members_subtab"> +      <panel.string +       name="help_text"> +        You can add or remove Roles assigned to Members. +        Select multiple Members by holding the Ctrl key and +        clicking on their names. +      </panel.string> +      <panel.string +       name="donation_area"> +        [AREA] m² +      </panel.string> +      <panel.string +       name="power_folder_icon" translate="false"> +        Inv_FolderClosed +      </panel.string> +      <panel.string +       name="power_all_have_icon" translate="false"> +        Checkbox_On +      </panel.string> +      <panel.string +       name="power_partial_icon" translate="false"> +        Checkbox_Off +      </panel.string> +      <filter_editor +      layout="topleft" +      top="5" +      left="5" +      right="-5" +      height="22" +      search_button_visible="false" +      follows="left|top|right" +      label="Filter Members" +      name="filter_input" /> +      <name_list +       column_padding="2" +       draw_heading="true" +       height="240" +       follows="left|top|right" +       layout="topleft" +       left="0" +       right="-1" +       multi_select="true" +       name="member_list" +       short_names="false" +       top_pad="5"> +        <name_list.columns +         label="Member" +         name="name" +       relative_width="0.44" /> +        <name_list.columns +         label="Donation" +         name="donated" + relative_width="0.25" /> +        <name_list.columns +         label="Status" +         name="online" +         relative_width="0.14" /> +      </name_list> +      <button +       height="23" +       follows="top|left" +       label="Invite" +       left="5" +       name="member_invite" +       width="100" /> +      <button +       height="23" +       label="Eject" +       follows="top|left" +       left_pad="10" +       name="member_eject" +       width="100" /> +      <button +       height="23" +       label="Ban" +       follows="top|left" +       left_pad="10" +       name="member_ban" +       width="100" /> +    </panel> +    <panel +     border="false" +     height="303" +     label="ROLES" +     layout="topleft" +     left="0" +     right="-1" +     help_topic="roles_roles_tab" +     name="roles_sub_tab" +     class="panel_group_roles_subtab"> +      <!-- <button               enabled="false"               height="20"               label="Show All" @@ -141,520 +141,535 @@ clicking on their names.               right="-5"               name="show_all_button"               width="100" />--> -            <panel.string -             name="help_text"> -                Roles have a title and an allowed list of Abilities -that Members can perform. Members can belong to -one or more Roles. A group can have up to 10 Roles, -including the Everyone and Owner Roles. -            </panel.string> -            <panel.string -             name="cant_delete_role"> -                The 'Everyone' and 'Owners' Roles are special and can't be deleted. -            </panel.string> -            <panel.string -             name="power_folder_icon" translate="false"> -                Inv_FolderClosed -            </panel.string> -            <panel.string -             name="power_all_have_icon" translate="false"> -                Checkbox_On -            </panel.string> -            <panel.string -             name="power_partial_icon" translate="false"> -                Checkbox_Off -            </panel.string> -         <filter_editor -         layout="topleft" -         top="5" -         left="5" -         right="-5" -         height="22" -         search_button_visible="false" -         follows="left|top|right" -         label="Filter Roles" -         name="filter_input" /> -            <scroll_list -             column_padding="0" -             draw_heading="true" -             draw_stripes="false" -             heading_height="23" -             height="132" -             layout="topleft" -             search_column="1" -             left="0" -             follows="left|top|right" -             right="-1" -             name="role_list" -             top_pad="2" -             width="310"> -                <scroll_list.columns -                 label="Role" -                 name="name" -               relative_width="0.45"  /> -                <scroll_list.columns -                 label="Title" -                 name="title" -               relative_width="0.45"  /> -                <scroll_list.columns -                 label="#" -                 name="members" -               relative_width="0.15"  /> -            </scroll_list> -            <button -            follows="top|left" -             height="23" -             label="New Role" -             layout="topleft" -             left="0" -             name="role_create" -             width="120" /> -            <button -             height="23" -             follows="top|left" -             label="Delete Role" -             layout="topleft" -             left_pad="10" -             name="role_delete" -             width="120" /> -        </panel> -        <panel -         border="false" -         height="303" -         label="ABILITIES" -         layout="topleft" -         left="0" -         right="-1" -         help_topic="roles_actions_tab" -         name="actions_sub_tab" -         class="panel_group_actions_subtab" -         tool_tip="You can view an Ability's Description and which Roles and Members can execute the Ability." -         width="310"> -            <panel.string -             name="help_text"> -                Abilities allow Members in Roles to do specific -things in this group. There's a broad variety of Abilities. -            </panel.string> -            <panel.string -             name="power_folder_icon" translate="false"> -                Inv_FolderClosed -            </panel.string> -            <panel.string -             name="power_all_have_icon" translate="false"> -                Checkbox_On -            </panel.string> -            <panel.string -             name="power_partial_icon" translate="false"> -                Checkbox_Off -            </panel.string> -         <filter_editor -         layout="topleft" -         top="5" -         left="5" -         right="-5" -         height="22" -         search_button_visible="false" -         follows="left|top|right" -         label="Filter Abilities" -         name="filter_input" /> -        <scroll_list -         column_padding="0" -         draw_stripes="true" -         height="200" -         follows="left|top|right" -         layout="topleft" -         left="0" -         right="-1" -         name="action_list" -         search_column="2" -         tool_tip="Select an Ability to view more details" -         top_pad="5" -         width="300"> -            <scroll_list.columns -             label="" -             name="icon" -             width="2" /> -            <scroll_list.columns -             label="" -             name="checkbox" -             width="20" /> -            <scroll_list.columns -             label="" -             name="action" -             width="270" /> -        </scroll_list> -        </panel> -        <panel -         border="false" -         height="303" -         label="BANNED AGENTS" -         layout="topleft" -         left="0" -         right="-1" -         help_topic="roles_banlist_tab" -         name="banlist_sub_tab" -         class="panel_group_banlist_subtab" -         tool_tip="View the banned agents from this group." -         width="310"> -        <panel.string -         name="help_text"> -            Any resident on the ban list will be unable to join the group. -        </panel.string> -        <filter_editor -        layout="topleft" -        top="5" -        left="5" -        right="-5" -        height="22" -        search_button_visible="false" -        follows="left|top|right" -        label="Filter Bans" -        name="filter_bans" /> -          <name_list -               column_padding="0" -               draw_heading="true" -               height="240" -               follows="left|top|right" -               layout="topleft" -               left="0" -               right="-1" -               multi_select="true" -               name="ban_list" -               short_names="false" -               top_pad="5"> -            <name_list.columns -             label="Resident" -             name="name" -             font.name="SANSSERIF_SMALL" -             font.style="NORMAL" -           relative_width="0.65" /> -            <name_list.columns -             label="Date Banned" -             name="date_banned" -     relative_width="0.35" /> -          </name_list> -		  <button -            follows="top|left" -             height="23" -             label="Ban!" -             layout="topleft" -             left="3" -             name="ban_create" -             width="120" /> -            <button -             height="23" -             follows="top|left" -             label="Unban!" -             layout="topleft" -             left_pad="10" -             name="ban_delete" -             width="120" /> -      </panel> -    </tab_container> +      <panel.string +       name="help_text"> +        Roles have a title and an allowed list of Abilities +        that Members can perform. Members can belong to +        one or more Roles. A group can have up to 10 Roles, +        including the Everyone and Owner Roles. +      </panel.string> +      <panel.string +       name="cant_delete_role"> +        The 'Everyone' and 'Owners' Roles are special and can't be deleted. +      </panel.string> +      <panel.string +       name="power_folder_icon" translate="false"> +        Inv_FolderClosed +      </panel.string> +      <panel.string +       name="power_all_have_icon" translate="false"> +        Checkbox_On +      </panel.string> +      <panel.string +       name="power_partial_icon" translate="false"> +        Checkbox_Off +      </panel.string> +      <filter_editor +      layout="topleft" +      top="5" +      left="5" +      right="-5" +      height="22" +      search_button_visible="false" +      follows="left|top|right" +      label="Filter Roles" +      name="filter_input" /> +      <scroll_list +       column_padding="0" +       draw_heading="true" +       draw_stripes="false" +       heading_height="23" +       height="132" +       layout="topleft" +       search_column="1" +       left="0" +       follows="left|top|right" +       right="-1" +       name="role_list" +       top_pad="2" +       width="310"> +        <scroll_list.columns +         label="Role" +         name="name" +       relative_width="0.45"  /> +        <scroll_list.columns +         label="Title" +         name="title" +       relative_width="0.45"  /> +        <scroll_list.columns +         label="#" +         name="members" +       relative_width="0.15"  /> +      </scroll_list> +      <button +      follows="top|left" +       height="23" +       label="New Role" +       layout="topleft" +       left="0" +       name="role_create" +       width="120" /> +      <button +       height="23" +       follows="top|left" +       label="Delete Role" +       layout="topleft" +       left_pad="10" +       name="role_delete" +       width="120" /> +    </panel>      <panel -     height="350" -     background_visible="false" -     bg_alpha_color="FloaterUnfocusBorderColor" +     border="false" +     height="303" +     label="ABILITIES"       layout="topleft" -     follows="top|left|right"       left="0"       right="-1" -     width="313" -     mouse_opaque="false" -     name="members_footer" -     top="325" -     visible="false"> -        <text -         type="string" -         height="16" -         layout="topleft" -         follows="left|top" -         left="5" -         top="8" -         text_color="EmphasisColor" -         name="static" -         width="300"> -            Assigned Roles -        </text> -        <scroll_list -         draw_stripes="true" -        follows="left|top|right" -         height="150" -         layout="topleft" -         left="0" -         right="-1" -         name="member_assigned_roles" -         top_pad="0"> -            <scroll_list.columns -             label="" -             name="checkbox" -             width="20" /> -            <scroll_list.columns -             label="" -             name="role" -             width="270" /> -        </scroll_list> -          <text -         type="string" -         height="16" -         layout="topleft" -         follows="left|top" -         left="5" -         top_pad="5" -         text_color="EmphasisColor" -         name="static2" -         width="285"> -            Allowed Abilities -        </text> -        <scroll_list -         draw_stripes="true" -             follows="left|top|right" -         height="150" -         layout="topleft" -         left="0" -         right="-1" -         name="member_allowed_actions" -         search_column="2" -         tool_tip="For details of each allowed ability see the abilities tab" -         top_pad="0"> -            <scroll_list.columns -             label="" -             name="icon" -             width="2" /> -            <scroll_list.columns -             label="" -             name="checkbox" -             width="20" /> -            <scroll_list.columns -             label="" -             name="action" -             width="270" /> -        </scroll_list> +     help_topic="roles_actions_tab" +     name="actions_sub_tab" +     class="panel_group_actions_subtab" +     tool_tip="You can view an Ability's Description and which Roles and Members can execute the Ability." +     width="310"> +      <panel.string +       name="help_text"> +        Abilities allow Members in Roles to do specific +        things in this group. There's a broad variety of Abilities. +      </panel.string> +      <panel.string +       name="power_folder_icon" translate="false"> +        Inv_FolderClosed +      </panel.string> +      <panel.string +       name="power_all_have_icon" translate="false"> +        Checkbox_On +      </panel.string> +      <panel.string +       name="power_partial_icon" translate="false"> +        Checkbox_Off +      </panel.string> +      <filter_editor +      layout="topleft" +      top="5" +      left="5" +      right="-5" +      height="22" +      search_button_visible="false" +      follows="left|top|right" +      label="Filter Abilities" +      name="filter_input" /> +      <scroll_list +       column_padding="0" +       draw_stripes="true" +       height="200" +       follows="left|top|right" +       layout="topleft" +       left="0" +       right="-1" +       name="action_list" +       search_column="2" +       tool_tip="Select an Ability to view more details" +       top_pad="5" +       width="300"> +        <scroll_list.columns +         label="" +         name="icon" +         width="2" /> +        <scroll_list.columns +         label="" +         name="checkbox" +         width="20" /> +        <scroll_list.columns +         label="" +         name="action" +         width="270" /> +      </scroll_list>      </panel>      <panel -     height="550" -     background_visible="false" -     bg_alpha_color="FloaterUnfocusBorderColor" +     border="false" +     height="303" +     label="BANNED AGENTS"       layout="topleft" -     follows="top|left|right"       left="0"       right="-1" -     width="313" -     mouse_opaque="false" -     name="roles_footer" -     top_delta="0" -     top="209" -     visible="false"> -        <text -         type="string" -         height="16" -         layout="topleft" -         follows="left|top" -         left="5" -         top="5" -         name="static" -         width="300"> -           Role Name -        </text> -        <line_editor -         type="string" -         height="20" -         layout="topleft" -         left="0" -         follows="left|top|right" -         right="-1" -         max_length_bytes="20" -         name="role_name" -         top_pad="0" -         width="300"> -        </line_editor> -        <text -         type="string" -         height="16" -         layout="topleft" -         follows="left|top" -         left="5" -         name="static3" -         top_pad="5" -         width="300"> -           Role Title -        </text> -        <line_editor -         type="string" -         height="20" -         layout="topleft" -         left="0" -         follows="left|top|right" -         right="-1" -         max_length_bytes="20" -         name="role_title" -         top_pad="0" -         width="300"> -        </line_editor> -               <text -         type="string" -         height="16" -         layout="topleft" -         follows="left|top" -         left="5" -         name="static2" -         top_pad="5" -         width="200"> -            Description -        </text> -        <text_editor -         type="string" -         layout="topleft" -         left="0" -         follows="left|top|right" -         right="-1" -         max_length="295" -         height="35" -         name="role_description" -         top_pad="0" -         width="300" -         word_wrap="true"> -        </text_editor> -        <text -         type="string" -         height="16" -         layout="topleft" -         follows="left|top" -         left="5" -         text_color="EmphasisColor" -         name="static4" -         top_pad="5" -         width="300"> -            Assigned Members -        </text> -        <name_list -         draw_stripes="true" -         height="128" -         layout="topleft" -         left="0" -         follows="left|top|right" -         right="-1" -         name="role_assigned_members" -         top_pad="0" -         width="300" /> -        <check_box -         height="15" -         label="Reveal members" -         left="5" -         layout="topleft" -         name="role_visible_in_list" -         tool_tip="Sets whether members of this role are visible in the General tab to people outside of the group." -         top_pad="4" -         width="300" /> -         <text -         type="string" -         height="16" -         layout="topleft" -         follows="left|top" -         left="5" -         text_color="EmphasisColor" -         name="static5" -         top_pad="2" -         width="300"> -            Allowed Abilities -        </text> -        <scroll_list -         draw_stripes="true" -         height="140" -         layout="topleft" -         left="0" -         follows="left|top|right" -         right="-1" -         name="role_allowed_actions" -         search_column="2" -         tool_tip="For details of each allowed ability see the abilities tab" -         top_pad="0" -         width="300"> -            <scroll_list.columns -             label="" -             name="icon" -             width="2" /> -            <scroll_list.columns -             label="" -             name="checkbox" -             width="20" /> -            <scroll_list.columns -             label="" -             name="action" -             width="270" /> -        </scroll_list> +     help_topic="roles_banlist_tab" +     name="banlist_sub_tab" +     class="panel_group_banlist_subtab" +     tool_tip="View the banned agents from this group." +     width="310"> +      <panel.string +       name="help_text"> +        Any resident on the ban list will be unable to join the group. +      </panel.string> +      <filter_editor +      layout="topleft" +      top="5" +      left="5" +      right="-5" +      height="22" +      search_button_visible="false" +      follows="left|top|right" +      label="Filter Bans" +      name="filter_bans" /> +      <name_list +           column_padding="0" +           draw_heading="true" +           height="400" +           follows="left|top|right" +           layout="topleft" +           left="0" +           right="-1" +           multi_select="true" +           name="ban_list" +           short_names="false" +           top_pad="5"> +        <name_list.columns +         label="Resident" +         name="name" +         font.name="SANSSERIF_SMALL" +         font.style="NORMAL" +       relative_width="0.4" /> +        <name_list.columns +         label="Date Banned" +         name="ban_date" +         relative_width="0.3" /> +        <name_list.columns +          label="Reason" +          name="ban_reason" /> +      </name_list> +      <button +        follows="top|left" +        height="23" +        label="Ban!" +        layout="topleft" +        left="3" +        name="ban_create" +        tool_tip="Ban residents from your group" +        width="120" /> +      <button +        follows="top|left" +        height="23" +        label="Unban!" +        layout="topleft" +        left_pad="5" +        name="ban_delete" +        tool_tip="Unban selected residents from your group" +        width="120" /> +      <button +        follows="top|left" +        height="23" +        width="23" +        image_overlay="Refresh_Off" +        layout="topleft" +        left_pad="5" +        name="ban_refresh" +        tool_tip="Refresh the ban list" +        />      </panel> -   <panel -     height="424" -     background_visible="false" -     bg_alpha_color="FloaterUnfocusBorderColor" +  </tab_container> +  <panel +   height="350" +   background_visible="false" +   bg_alpha_color="FloaterUnfocusBorderColor" +   layout="topleft" +   follows="top|left|right" +   left="0" +   right="-1" +   width="313" +   mouse_opaque="false" +   name="members_footer" +   top="325" +   visible="false"> +    <text +     type="string" +     height="16" +     layout="topleft" +     follows="left|top" +     left="5" +     top="8" +     text_color="EmphasisColor" +     name="static" +     width="300"> +      Assigned Roles +    </text> +    <scroll_list +     draw_stripes="true" +    follows="left|top|right" +     height="150"       layout="topleft" -     follows="top|left|right"       left="0"       right="-1" -     width="313" -     mouse_opaque="false" -     name="actions_footer" -     top_delta="0" -     top="255" -     visible="false"> -        <text_editor -       bg_readonly_color="Transparent" -       text_readonly_color="EmphasisColor" -       font="SansSerifSmall" -         type="string" -         enabled="false" -         halign="left" -         layout="topleft" +     name="member_assigned_roles" +     top_pad="0"> +      <scroll_list.columns +       label="" +       name="checkbox" +       width="20" /> +      <scroll_list.columns +       label="" +       name="role" +       width="270" /> +    </scroll_list> +    <text +   type="string" +   height="16" +   layout="topleft" +   follows="left|top" +   left="5" +   top_pad="5" +   text_color="EmphasisColor" +   name="static2" +   width="285"> +      Allowed Abilities +    </text> +    <scroll_list +     draw_stripes="true"           follows="left|top|right" -         left="0" -         right="-1" -         height="90" -         max_length="512" -         name="action_description" -         top="0" -         word_wrap="true"> -            This Ability is 'Eject Members from this Group'. Only an Owner can eject another Owner. -        </text_editor> -        <text +     height="150" +     layout="topleft" +     left="0" +     right="-1" +     name="member_allowed_actions" +     search_column="2" +     tool_tip="For details of each allowed ability see the abilities tab" +     top_pad="0"> +      <scroll_list.columns +       label="" +       name="icon" +       width="2" /> +      <scroll_list.columns +       label="" +       name="checkbox" +       width="20" /> +      <scroll_list.columns +       label="" +       name="action" +       width="270" /> +    </scroll_list> +  </panel> +  <panel +   height="550" +   background_visible="false" +   bg_alpha_color="FloaterUnfocusBorderColor" +   layout="topleft" +   follows="top|left|right" +   left="0" +   right="-1" +   width="313" +   mouse_opaque="false" +   name="roles_footer" +   top_delta="0" +   top="209" +   visible="false"> +    <text +     type="string" +     height="16" +     layout="topleft" +     follows="left|top" +     left="5" +     top="5" +     name="static" +     width="300"> +      Role Name +    </text> +    <line_editor +     type="string" +     height="20" +     layout="topleft" +     left="0" +     follows="left|top|right" +     right="-1" +     max_length_bytes="20" +     name="role_name" +     top_pad="0" +     width="300"> +    </line_editor> +    <text +     type="string" +     height="16" +     layout="topleft" +     follows="left|top" +     left="5" +     name="static3" +     top_pad="5" +     width="300"> +      Role Title +    </text> +    <line_editor +     type="string" +     height="20" +     layout="topleft" +     left="0" +     follows="left|top|right" +     right="-1" +     max_length_bytes="20" +     name="role_title" +     top_pad="0" +     width="300"> +    </line_editor> +    <text           type="string"           height="16"           layout="topleft"           follows="left|top"           left="5"           name="static2" -         top_pad="1" -         width="300"> -            Roles with this ability -        </text> -        <scroll_list -         height="172" -         layout="topleft" -         follows="left|top|right" -         left="5" -         right="-1" -         name="action_roles" -         top_pad="0" -         width="300" /> -        <text -         type="string" -         height="16" -         layout="topleft" -         follows="left|top" -         left="5" -         name="static3"           top_pad="5" -         width="300"> -            Members with this ability -        </text> -        <name_list -         height="122" -         follows="left|top|right" -         layout="topleft" -         left="5" -         right="-1" -         name="action_members" -         top_pad="0" -         width="300" /> -    </panel> +         width="200"> +      Description +    </text> +    <text_editor +     type="string" +     layout="topleft" +     left="0" +     follows="left|top|right" +     right="-1" +     max_length="295" +     height="35" +     name="role_description" +     top_pad="0" +     width="300" +     word_wrap="true"> +    </text_editor> +    <text +     type="string" +     height="16" +     layout="topleft" +     follows="left|top" +     left="5" +     text_color="EmphasisColor" +     name="static4" +     top_pad="5" +     width="300"> +      Assigned Members +    </text> +    <name_list +     draw_stripes="true" +     height="128" +     layout="topleft" +     left="0" +     follows="left|top|right" +     right="-1" +     name="role_assigned_members" +     top_pad="0" +     width="300" /> +    <check_box +     height="15" +     label="Reveal members" +     left="5" +     layout="topleft" +     name="role_visible_in_list" +     tool_tip="Sets whether members of this role are visible in the General tab to people outside of the group." +     top_pad="4" +     width="300" /> +    <text +    type="string" +    height="16" +    layout="topleft" +    follows="left|top" +    left="5" +    text_color="EmphasisColor" +    name="static5" +    top_pad="2" +    width="300"> +      Allowed Abilities +    </text> +    <scroll_list +     draw_stripes="true" +     height="140" +     layout="topleft" +     left="0" +     follows="left|top|right" +     right="-1" +     name="role_allowed_actions" +     search_column="2" +     tool_tip="For details of each allowed ability see the abilities tab" +     top_pad="0" +     width="300"> +      <scroll_list.columns +       label="" +       name="icon" +       width="2" /> +      <scroll_list.columns +       label="" +       name="checkbox" +       width="20" /> +      <scroll_list.columns +       label="" +       name="action" +       width="270" /> +    </scroll_list> +  </panel> +  <panel +    height="424" +    background_visible="false" +    bg_alpha_color="FloaterUnfocusBorderColor" +    layout="topleft" +    follows="top|left|right" +    left="0" +    right="-1" +    width="313" +    mouse_opaque="false" +    name="actions_footer" +    top_delta="0" +    top="255" +    visible="false"> +    <text_editor +   bg_readonly_color="Transparent" +   text_readonly_color="EmphasisColor" +   font="SansSerifSmall" +     type="string" +     enabled="false" +     halign="left" +     layout="topleft" +     follows="left|top|right" +     left="0" +     right="-1" +     height="90" +     max_length="512" +     name="action_description" +     top="0" +     word_wrap="true"> +      This Ability is 'Eject Members from this Group'. Only an Owner can eject another Owner. +    </text_editor> +    <text +     type="string" +     height="16" +     layout="topleft" +     follows="left|top" +     left="5" +     name="static2" +     top_pad="1" +     width="300"> +      Roles with this ability +    </text> +    <scroll_list +     height="172" +     layout="topleft" +     follows="left|top|right" +     left="5" +     right="-1" +     name="action_roles" +     top_pad="0" +     width="300" /> +    <text +     type="string" +     height="16" +     layout="topleft" +     follows="left|top" +     left="5" +     name="static3" +     top_pad="5" +     width="300"> +      Members with this ability +    </text> +    <name_list +     height="122" +     follows="left|top|right" +     layout="topleft" +     left="5" +     right="-1" +     name="action_members" +     top_pad="0" +     width="300" /> +  </panel>  </panel>  | 
