Files
SingularityViewer/indra/newview/llfloaterdirectory.cpp

510 lines
14 KiB
C++

/**
* @file llfloaterdirectory.cpp
* @brief The "Find" floater. Should be llfloaterfind.
*
* $LicenseInfo:firstyear=2002&license=viewergpl$
*
* Copyright (c) 2002-2009, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
* to you under the terms of the GNU General Public License, version 2.0
* ("GPL"), unless you have obtained a separate licensing agreement
* ("Other License"), formally executed by you and Linden Lab. Terms of
* the GPL can be found in doc/GPL-license.txt in this distribution, or
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
*
* There are special exceptions to the terms and conditions of the GPL as
* it is applied to this Source Code. View the full text of the exception
* in the file doc/FLOSS-exception.txt in this software distribution, or
* online at
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
*
* By copying, modifying or distributing this software, you acknowledge
* that you have read and understood your obligations described above,
* and agree to abide by those obligations.
*
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
*/
#include "llviewerprecompiledheaders.h"
#include "llfloaterdirectory.h"
#include "llpaneldirfind.h"
#include "llpaneldirevents.h"
#include "llpaneldirland.h"
#include "llpaneldirpeople.h"
#include "llpaneldirpopular.h"
#include "llpaneldirgroups.h"
#include "llpaneldirplaces.h"
#include "llpaneldirclassified.h"
#include "llresizehandle.h"
#include "llresmgr.h"
#include "llscrollbar.h"
#include "llbutton.h"
#include "llkeyboard.h"
#include "llscrollcontainer.h"
#include "llcheckboxctrl.h"
#include "lluiconstants.h"
#include "llviewercontrol.h"
#include "llagent.h"
#include "llpanelavatar.h"
#include "llpanelevent.h"
#include "llpanelclassified.h"
#include "llpanelgroup.h"
#include "llpanelpick.h"
#include "llpanelplace.h"
#include "llpaneldirland.h"
#include "llfloateravatarinfo.h"
#include "lldir.h"
#include "lluictrlfactory.h"
#include "hippogridmanager.h"
LLFloaterDirectory* LLFloaterDirectory::sInstance = NULL;
//static
S32 LLFloaterDirectory::sOldSearchCount = 0; // debug
S32 LLFloaterDirectory::sNewSearchCount = 0; // debug
LLFloaterDirectory::LLFloaterDirectory(const std::string& name)
: LLFloater(name, std::string("FloaterFindRect2"), LLStringUtil::null),
mMinimizing(false)
{
sInstance = this;
mFindAllPanel = NULL;
mClassifiedPanel = NULL;
mEventsPanel = NULL;
mLandPanel = NULL;
mPanelAvatarp = NULL;
mPanelEventp = NULL;
mPanelGroupp = NULL;
mPanelGroupHolderp = NULL;
mPanelPlacep = NULL;
mPanelPlaceSmallp = NULL;
mPanelClassifiedp = NULL;
// Build the floater with our tab panel classes
bool enableWebSearch = gHippoGridManager->getConnectedGrid()->isSecondLife() ||
!gHippoGridManager->getConnectedGrid()->getSearchUrl().empty();
bool enableClassicAllSearch = !gHippoGridManager->getConnectedGrid()->isSecondLife();
LLCallbackMap::map_t factory_map;
factory_map["classified_panel"] = LLCallbackMap(createClassified, this);
factory_map["events_panel"] = LLCallbackMap(createEvents, this);
factory_map["places_panel"] = LLCallbackMap(createPlaces, this);
factory_map["land_sales_panel"] = LLCallbackMap(createLand, this);
factory_map["people_panel"] = LLCallbackMap(createPeople, this);
factory_map["groups_panel"] = LLCallbackMap(createGroups, this);
if (enableWebSearch)
{
// web search and showcase only for SecondLife
factory_map["find_all_panel"] = LLCallbackMap(createFindAll, this);
factory_map["showcase_panel"] = LLCallbackMap(createShowcase, this);
}
if (enableClassicAllSearch)
{
factory_map["find_all_old_panel"] = LLCallbackMap(createFindAllOld, this);
}
factory_map["classified_details_panel"] = LLCallbackMap(createClassifiedDetail, this);
factory_map["event_details_panel"] = LLCallbackMap(createEventDetail, this);
factory_map["group_details_panel"] = LLCallbackMap(createGroupDetail, this);
factory_map["group_details_panel_holder"] = LLCallbackMap(createGroupDetailHolder, this);
factory_map["place_details_panel"] = LLCallbackMap(createPlaceDetail, this);
factory_map["place_details_small_panel"] = LLCallbackMap(createPlaceDetailSmall, this);
factory_map["Panel Avatar"] = LLCallbackMap(createPanelAvatar, this);
if (enableWebSearch)
{
if (enableClassicAllSearch)
LLUICtrlFactory::getInstance()->buildFloater(this, "floater_directory3.xml", &factory_map);
else
LLUICtrlFactory::getInstance()->buildFloater(this, "floater_directory.xml", &factory_map);
}
else
{
LLUICtrlFactory::getInstance()->buildFloater(this, "floater_directory2.xml", &factory_map);
}
moveResizeHandlesToFront();
if(mPanelAvatarp)
{
mPanelAvatarp->selectTab(0);
}
getChild<LLTabContainer>("Directory Tabs")->setCommitCallback(boost::bind(&LLFloaterDirectory::onTabChanged,_2));
}
LLFloaterDirectory::~LLFloaterDirectory()
{
sInstance = NULL;
//Note: this function is defined in the class LLFloater.
//however, it causes crash if this line is postponed to ~LLFloater().
//because it uses some pointers deleted below. That is, those pointers are used again after deleting.
setMinimized( FALSE );
delete mPanelAvatarp; mPanelAvatarp = NULL;
delete mPanelEventp; mPanelEventp = NULL;
delete mPanelGroupp; mPanelGroupp = NULL;
delete mPanelGroupHolderp; mPanelGroupHolderp = NULL;
delete mPanelPlacep; mPanelPlacep = NULL;
delete mPanelPlaceSmallp; mPanelPlaceSmallp = NULL;
delete mPanelClassifiedp; mPanelClassifiedp = NULL;
gSavedSettings.setBOOL("ShowDirectory", FALSE);
}
// static
void *LLFloaterDirectory::createFindAll(void* userdata)
{
LLFloaterDirectory *self = (LLFloaterDirectory*)userdata;
self->mFindAllPanel = LLPanelDirFindAllInterface::create(self);
return self->mFindAllPanel;
}
// static
void* LLFloaterDirectory::createClassified(void* userdata)
{
LLFloaterDirectory *self = (LLFloaterDirectory*)userdata;
self->mClassifiedPanel = new LLPanelDirClassified("classified_panel", self);
return self->mClassifiedPanel;
}
// static
void* LLFloaterDirectory::createEvents(void* userdata)
{
LLFloaterDirectory *self = (LLFloaterDirectory*)userdata;
self->mEventsPanel = new LLPanelDirEvents("events_panel", self);
return self->mEventsPanel;
}
// static
void* LLFloaterDirectory::createShowcase(void* userdata)
{
LLFloaterDirectory *self = (LLFloaterDirectory*)userdata;
return new LLPanelDirPopular("showcase_panel", self);
}
// static
void* LLFloaterDirectory::createPlaces(void* userdata)
{
LLFloaterDirectory *self = (LLFloaterDirectory*)userdata;
return new LLPanelDirPlaces("places_panel", self);
}
// static
void* LLFloaterDirectory::createLand(void* userdata)
{
LLFloaterDirectory *self = (LLFloaterDirectory*)userdata;
self->mLandPanel = new LLPanelDirLand("land_panel", self);
return self->mLandPanel;
}
// static
void* LLFloaterDirectory::createPeople(void* userdata)
{
LLFloaterDirectory *self = (LLFloaterDirectory*)userdata;
return new LLPanelDirPeople("people_panel", self);
}
// static
void* LLFloaterDirectory::createGroups(void* userdata)
{
LLFloaterDirectory *self = (LLFloaterDirectory*)userdata;
return new LLPanelDirGroups("groups_panel", self);
}
// static
void *LLFloaterDirectory::createFindAllOld(void* userdata)
{
LLFloaterDirectory *self = (LLFloaterDirectory*)userdata;
return new LLPanelDirFindAllOld("find_all_old_panel", self);
}
// static
void* LLFloaterDirectory::createClassifiedDetail(void* userdata)
{
LLFloaterDirectory *self = (LLFloaterDirectory*)userdata;
self->mPanelClassifiedp = new LLPanelClassified(true, false);
self->mPanelClassifiedp->setVisible(FALSE);
return self->mPanelClassifiedp;
}
//----------------------------------------------------------------------------
void* LLFloaterDirectory::createPanelAvatar(void* data)
{
LLFloaterDirectory* self = (LLFloaterDirectory*)data;
self->mPanelAvatarp = new LLPanelAvatar("Avatar", LLRect(),
FALSE); // disallow editing in search context (SL-48632)
self->mPanelAvatarp->setVisible(FALSE);
return self->mPanelAvatarp;
}
//----------------------------------------------------------------------------
// static
void* LLFloaterDirectory::createEventDetail(void* userdata)
{
LLFloaterDirectory *self = (LLFloaterDirectory*)userdata;
self->mPanelEventp = new LLPanelEvent();
LLUICtrlFactory::getInstance()->buildPanel(self->mPanelEventp, "panel_event.xml");
self->mPanelEventp->setVisible(FALSE);
return self->mPanelEventp;
}
// static
void* LLFloaterDirectory::createGroupDetail(void* userdata)
{
LLFloaterDirectory *self = (LLFloaterDirectory*)userdata;
self->mPanelGroupp = new LLPanelGroup("panel_group.xml",
"PanelGroup",
gAgent.getGroupID());
self->mPanelGroupp->setAllowEdit(FALSE || gAgent.isGodlike()); // Gods can always edit panels
self->mPanelGroupp->setVisible(FALSE);
return self->mPanelGroupp;
}
// static
void* LLFloaterDirectory::createGroupDetailHolder(void* userdata)
{
LLFloaterDirectory *self = (LLFloaterDirectory*)userdata;
self->mPanelGroupHolderp = new LLPanel(std::string("PanelGroupHolder"));
self->mPanelGroupHolderp->setVisible(FALSE);
return self->mPanelGroupHolderp;
}
// static
void* LLFloaterDirectory::createPlaceDetail(void* userdata)
{
LLFloaterDirectory *self = (LLFloaterDirectory*)userdata;
self->mPanelPlacep = new LLPanelPlace();
LLUICtrlFactory::getInstance()->buildPanel(self->mPanelPlacep, "panel_place.xml");
self->mPanelPlacep->setVisible(FALSE);
return self->mPanelPlacep;
}
// static
void* LLFloaterDirectory::createPlaceDetailSmall(void* userdata)
{
LLFloaterDirectory *self = (LLFloaterDirectory*)userdata;
self->mPanelPlaceSmallp = new LLPanelPlace();
LLUICtrlFactory::getInstance()->buildPanel(self->mPanelPlaceSmallp, "panel_place_small.xml");
self->mPanelPlaceSmallp->setVisible(FALSE);
return self->mPanelPlaceSmallp;
}
// static
void LLFloaterDirectory::requestClassifieds()
{
if (sInstance && sInstance->mClassifiedPanel)
{
sInstance->mClassifiedPanel->performQuery();
}
}
void LLFloaterDirectory::showFindAll(const std::string& search_text)
{
showPanel("find_all_panel");
LLPanelDirFindAllInterface::search(sInstance->mFindAllPanel, search_text);
}
void LLFloaterDirectory::showClassified(const LLUUID& classified_id)
{
showPanel("classified_panel");
if (sInstance->mClassifiedPanel)
{
sInstance->mClassifiedPanel->selectByUUID(classified_id);
}
}
// static
void LLFloaterDirectory::showEvents(S32 event_id)
{
showPanel("events_panel");
if (sInstance->mEventsPanel)
{
// HACK: force query for today's events
sInstance->mEventsPanel->setDay(0);
sInstance->mEventsPanel->performQuery();
if (event_id != 0)
{
sInstance->mEventsPanel->selectEventByID(event_id);
}
}
}
// static
void LLFloaterDirectory::showLandForSale(const LLUUID& parcel_id)
{
showPanel("land_sales_panel");
if (sInstance->mLandPanel)
{
sInstance->mLandPanel->selectByUUID(parcel_id);
}
}
// static
void LLFloaterDirectory::showGroups()
{
showPanel("groups_panel");
}
// static
void LLFloaterDirectory::refreshGroup(const LLUUID& group_id)
{
if (sInstance && sInstance->mPanelGroupp
&& (sInstance->mPanelGroupp->getID() == group_id) )
{
sInstance->mPanelGroupp->refreshData();
}
}
void LLFloaterDirectory::focusCurrentPanel()
{
LLTabContainer* tabs = getChild<LLTabContainer>("Directory Tabs");
if (!tabs) return;
LLPanel* panel = tabs->getCurrentPanel();
if (!panel) return;
panel->setFocus(TRUE);
}
// static
void LLFloaterDirectory::showPanel(const std::string& tabname)
{
// This function gets called when web browser clicks are processed,
// so we don't delete the existing panel, which would delete the
// web browser instance currently handling the click. JC
if (!sInstance)
{
sInstance = new LLFloaterDirectory("directory");
}
sInstance->open(); /*Flawfinder: ignore*/
sInstance->childShowTab("Directory Tabs", tabname);
sInstance->focusCurrentPanel();
}
// static
void LLFloaterDirectory::toggleFind(void*)
{
if (!sInstance)
{
std::string panel = gSavedSettings.getString("LastFindPanel");
bool hasWebSearch = gHippoGridManager->getConnectedGrid()->isSecondLife() ||
!gHippoGridManager->getConnectedGrid()->getSearchUrl().empty();
if (hasWebSearch && (panel == "find_all_panel" || panel == "showcase_panel"))
{
panel = "find_all_old_panel";
}
showPanel(panel);
// HACK: force query for today's events
if (sInstance->mEventsPanel)
{
sInstance->mEventsPanel->setDay(0);
//sInstance->mEventsPanel->performQuery(); // Temporary change to help DB - Sabin
}
return;
}
BOOL panel_visible = sInstance->getVisible();
if (!panel_visible)
{
sInstance->open(); /*Flawfinder: ignore*/
sInstance->focusCurrentPanel();
}
else
{
sInstance->close();
}
}
// static
void LLFloaterDirectory::toggleEvents(void*)
{
if (!sInstance)
{
showEvents(0);
return;
}
BOOL panel_visible = sInstance->getVisible();
if (!panel_visible)
{
sInstance->open(); /*Flawfinder: ignore*/
sInstance->showEvents(0);
}
else
{
LLPanel *current_panel = sInstance->childGetVisibleTab("Directory Tabs");
if (current_panel == sInstance->mEventsPanel)
{
sInstance->close();
}
else
{
sInstance->showEvents(0);
}
}
}
// static
void LLFloaterDirectory::hide(void*)
{
if (sInstance)
{
sInstance->close();
}
}
// virtual
void LLFloaterDirectory::setVisible(BOOL visible)
{
gSavedSettings.setBOOL("ShowDirectory", visible);
LLFloater::setVisible(visible);
}
void LLFloaterDirectory::onClose(bool app_quitting)
{
setVisible(FALSE);
}
// static
void LLFloaterDirectory::onTabChanged( const LLSD& param )
{
gSavedSettings.setString("LastFindPanel", param.asString());
}
void LLFloaterDirectory::hideAllDetailPanels()
{
if (mPanelAvatarp) mPanelAvatarp->setVisible(FALSE);
if (mPanelEventp) mPanelEventp->setVisible(FALSE);
if (mPanelGroupp) mPanelGroupp->setVisible(FALSE);
if (mPanelGroupHolderp) mPanelGroupHolderp->setVisible(FALSE);
if (mPanelPlacep) mPanelPlacep->setVisible(FALSE);
if (mPanelPlaceSmallp) mPanelPlaceSmallp->setVisible(FALSE);
if (mPanelClassifiedp) mPanelClassifiedp->setVisible(FALSE);
}