diff --git a/indra/newview/fsfloatergrouptitles.cpp b/indra/newview/fsfloatergrouptitles.cpp index 30c8cab800..b4483bcc3a 100644 --- a/indra/newview/fsfloatergrouptitles.cpp +++ b/indra/newview/fsfloatergrouptitles.cpp @@ -27,6 +27,7 @@ #include "llviewerprecompiledheaders.h" #include "fsfloatergrouptitles.h" +#include "llfiltereditor.h" #include "llgroupactions.h" #include "llscrolllistctrl.h" #include "lltrans.h" @@ -34,7 +35,7 @@ ///////////////////////////////////////////////////// // FSGroupTitlesObserver class // -FSGroupTitlesObserver::FSGroupTitlesObserver(const LLGroupData& group_data, FSFloaterGroupTitles* parent) : +FSGroupTitlesObserver::FSGroupTitlesObserver(const LLGroupData& group_data, LLHandle parent) : LLGroupMgrObserver(group_data.mID), mGroupData(group_data), mParent(parent) @@ -49,9 +50,9 @@ FSGroupTitlesObserver::~FSGroupTitlesObserver() void FSGroupTitlesObserver::changed(LLGroupChange gc) { - if (mParent) + if (!mParent.isDead()) { - mParent->processGroupTitleResults(mGroupData); + mParent.get()->processGroupTitleResults(mGroupData); } } @@ -60,7 +61,9 @@ void FSGroupTitlesObserver::changed(LLGroupChange gc) // FSGroupTitles class // FSFloaterGroupTitles::FSFloaterGroupTitles(const LLSD& key) : - LLFloater(key) + LLFloater(key), + mFilterSubString(LLStringUtil::null), + mFilterSubStringOrig(LLStringUtil::null) { // Register observer and event listener LLGroupMgr::getInstance()->addObserver(this); @@ -85,14 +88,17 @@ BOOL FSFloaterGroupTitles::postBuild() mRefreshButton = getChild("btnRefresh"); mInfoButton = getChild("btnInfo"); mTitleList = getChild("title_list"); + mFilterEditor = getChild("filter_input"); mActivateButton->setCommitCallback(boost::bind(&FSFloaterGroupTitles::activateGroupTitle, this)); mRefreshButton->setCommitCallback(boost::bind(&FSFloaterGroupTitles::refreshGroupTitles, this)); mInfoButton->setCommitCallback(boost::bind(&FSFloaterGroupTitles::openGroupInfo, this)); mTitleList->setDoubleClickCallback(boost::bind(&FSFloaterGroupTitles::activateGroupTitle, this)); mTitleList->setCommitCallback(boost::bind(&FSFloaterGroupTitles::selectedTitleChanged, this)); + mFilterEditor->setCommitCallback(boost::bind(&FSFloaterGroupTitles::onFilterEdit, this, _2)); mTitleList->sortByColumn("title_sort_column", TRUE); + mTitleList->setFilterColumn(0); refreshGroupTitles(); @@ -231,7 +237,7 @@ void FSFloaterGroupTitles::refreshGroupTitles() for (std::vector::iterator it = gAgent.mGroups.begin(); it != gAgent.mGroups.end(); ++it) { LLGroupData& group_data = *it; - FSGroupTitlesObserver* roleObserver = new FSGroupTitlesObserver(group_data, this); + FSGroupTitlesObserver* roleObserver = new FSGroupTitlesObserver(group_data, getDerivedHandle()); mGroupTitleObserverMap[group_data.mID] = roleObserver; LLGroupMgr::getInstance()->sendGroupTitlesRequest(group_data.mID); } @@ -256,3 +262,22 @@ void FSFloaterGroupTitles::openGroupInfo() LLGroupActions::show(group_id); } } + +void FSFloaterGroupTitles::onFilterEdit(const std::string& search_string) +{ + mFilterSubStringOrig = search_string; + LLStringUtil::trimHead(mFilterSubStringOrig); + // Searches are case-insensitive + std::string search_upper = mFilterSubStringOrig; + LLStringUtil::toUpper(search_upper); + + if (mFilterSubString == search_upper) + { + return; + } + + mFilterSubString = search_upper; + + // Apply new filter. + mTitleList->setFilterString(mFilterSubStringOrig); +} diff --git a/indra/newview/fsfloatergrouptitles.h b/indra/newview/fsfloatergrouptitles.h index 24e42111f6..0bb252e802 100644 --- a/indra/newview/fsfloatergrouptitles.h +++ b/indra/newview/fsfloatergrouptitles.h @@ -33,20 +33,21 @@ #include "llgroupmgr.h" class FSFloaterGroupTitles; +class LLFilterEditor; class LLScrollListCtrl; class FSGroupTitlesObserver : LLGroupMgrObserver { public: - FSGroupTitlesObserver(const LLGroupData& group_data, FSFloaterGroupTitles* parent); + FSGroupTitlesObserver(const LLGroupData& group_data, LLHandle parent); virtual ~FSGroupTitlesObserver(); virtual void changed(LLGroupChange gc); protected: - FSFloaterGroupTitles* mParent; - LLGroupData mGroupData; + LLHandle mParent; + LLGroupData mGroupData; }; class FSFloaterGroupTitles : public LLFloater, public LLGroupMgrObserver, public LLOldEvents::LLSimpleListener @@ -73,11 +74,16 @@ private: void activateGroupTitle(); void selectedTitleChanged(); void openGroupInfo(); + void onFilterEdit(const std::string& search_string); LLButton* mActivateButton; LLButton* mRefreshButton; LLButton* mInfoButton; LLScrollListCtrl* mTitleList; + LLFilterEditor* mFilterEditor; + + std::string mFilterSubString; + std::string mFilterSubStringOrig; typedef std::map observer_map_t; observer_map_t mGroupTitleObserverMap; diff --git a/indra/newview/skins/default/xui/de/floater_fs_group_titles.xml b/indra/newview/skins/default/xui/de/floater_fs_group_titles.xml index d1ae75a18d..4caad2b19c 100644 --- a/indra/newview/skins/default/xui/de/floater_fs_group_titles.xml +++ b/indra/newview/skins/default/xui/de/floater_fs_group_titles.xml @@ -1,6 +1,7 @@ + diff --git a/indra/newview/skins/default/xui/en/floater_fs_group_titles.xml b/indra/newview/skins/default/xui/en/floater_fs_group_titles.xml index e35014d2ea..5aa566d248 100644 --- a/indra/newview/skins/default/xui/en/floater_fs_group_titles.xml +++ b/indra/newview/skins/default/xui/en/floater_fs_group_titles.xml @@ -16,14 +16,25 @@ + + + height="238">