summaryrefslogtreecommitdiff
path: root/indra/newview/llfloatertopobjects.cpp
diff options
context:
space:
mode:
authorJames Cook <james@lindenlab.com>2007-01-02 08:33:20 +0000
committerJames Cook <james@lindenlab.com>2007-01-02 08:33:20 +0000
commit420b91db29485df39fd6e724e782c449158811cb (patch)
treeb471a94563af914d3ed3edd3e856d21cb1b69945 /indra/newview/llfloatertopobjects.cpp
Print done when done.
Diffstat (limited to 'indra/newview/llfloatertopobjects.cpp')
-rw-r--r--indra/newview/llfloatertopobjects.cpp441
1 files changed, 441 insertions, 0 deletions
diff --git a/indra/newview/llfloatertopobjects.cpp b/indra/newview/llfloatertopobjects.cpp
new file mode 100644
index 0000000000..f7850f38db
--- /dev/null
+++ b/indra/newview/llfloatertopobjects.cpp
@@ -0,0 +1,441 @@
+/**
+ * @file llfloatertopobjects.cpp
+ * @brief Shows top colliders, top scripts, etc.
+ *
+ * Copyright (c) 2005-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloatertopobjects.h"
+
+#include "message.h"
+#include "llfontgl.h"
+
+#include "llagent.h"
+#include "llbutton.h"
+#include "llfloatergodtools.h"
+#include "llparcel.h"
+#include "llscrolllistctrl.h"
+#include "lllineeditor.h"
+#include "lltextbox.h"
+#include "lltracker.h"
+#include "llviewerparcelmgr.h"
+#include "llviewerregion.h"
+#include "llvieweruictrlfactory.h"
+#include "llviewerwindow.h"
+
+LLFloaterTopObjects* LLFloaterTopObjects::sInstance = NULL;
+
+
+// static
+void LLFloaterTopObjects::show()
+{
+ if (sInstance)
+ {
+ sInstance->setVisibleAndFrontmost();
+ return;
+ }
+
+ sInstance = new LLFloaterTopObjects();
+ gUICtrlFactory->buildFloater(sInstance, "floater_top_objects.xml");
+ sInstance->center();
+}
+
+LLFloaterTopObjects::LLFloaterTopObjects()
+: LLFloater("top_objects"),
+ mInitialized(FALSE),
+ mtotalScore(0.f)
+{
+ sInstance = this;
+}
+
+LLFloaterTopObjects::~LLFloaterTopObjects()
+{
+ sInstance = NULL;
+}
+
+// virtual
+BOOL LLFloaterTopObjects::postBuild()
+{
+ childSetCommitCallback("objects_list", onCommitObjectsList, this);
+ childSetDoubleClickCallback("objects_list", onDoubleClickObjectsList);
+ childSetFocus("objects_list");
+ LLScrollListCtrl *objects_list = LLUICtrlFactory::getScrollListByName(this, "objects_list");
+ if (objects_list)
+ {
+ objects_list->setCommitOnSelectionChange(TRUE);
+ }
+
+ childSetAction("show_beacon_btn", onClickShowBeacon, this);
+ setDefaultBtn("show_beacon_btn");
+
+ childSetAction("return_selected_btn", onReturnSelected, this);
+ childSetAction("return_all_btn", onReturnAll, this);
+ childSetAction("disable_selected_btn", onDisableSelected, this);
+ childSetAction("disable_all_btn", onDisableAll, this);
+ childSetAction("refresh_btn", onRefresh, this);
+
+
+ childSetAction("filter_object_btn", onGetByObjectNameClicked, this);
+ childSetAction("filter_owner_btn", onGetByOwnerNameClicked, this);
+
+
+ /*
+ LLLineEditor* line_editor = LLUICtrlFactory::getLineEditorByName(this, "owner_name_editor");
+ if (line_editor)
+ {
+ line_editor->setCommitOnFocusLost(FALSE);
+ line_editor->setCommitCallback(onGetByOwnerName);
+ line_editor->setCallbackUserData(this);
+ }
+
+ line_editor = LLUICtrlFactory::getLineEditorByName(this, "object_name_editor");
+ if (line_editor)
+ {
+ line_editor->setCommitOnFocusLost(FALSE);
+ line_editor->setCommitCallback(onGetByObjectName);
+ line_editor->setCallbackUserData(this);
+ }*/
+
+ mCurrentMode = STAT_REPORT_TOP_SCRIPTS;
+ mFlags = 0;
+ mFilter = "";
+
+ return TRUE;
+}
+
+void LLFloaterTopObjects::handle_land_reply(LLMessageSystem* msg, void** data)
+{
+ // Make sure dialog is on screen
+ show();
+ sInstance->handleReply(msg, data);
+
+ //HACK: for some reason sometimes top scripts originally comes back
+ //with no results even though they're there
+ if (!sInstance->mObjectListIDs.size() && !sInstance->mInitialized)
+ {
+ sInstance->onRefresh(NULL);
+ sInstance->mInitialized = TRUE;
+ }
+
+}
+
+void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data)
+{
+ U32 request_flags;
+ U32 total_count;
+
+ msg->getU32Fast(_PREHASH_RequestData, _PREHASH_RequestFlags, request_flags);
+ msg->getU32Fast(_PREHASH_RequestData, _PREHASH_TotalObjectCount, total_count);
+ msg->getU32Fast(_PREHASH_RequestData, _PREHASH_ReportType, mCurrentMode);
+
+ LLCtrlListInterface *list = childGetListInterface("objects_list");
+ if (!list) return;
+
+ S32 block_count = msg->getNumberOfBlocks("ReportData");
+ for (S32 block = 0; block < block_count; ++block)
+ {
+ U32 task_local_id;
+ LLUUID task_id;
+ F32 location_x, location_y, location_z;
+ F32 score;
+ char name_buf[MAX_STRING];
+ char owner_buf[MAX_STRING];
+
+ msg->getU32Fast(_PREHASH_ReportData, _PREHASH_TaskLocalID, task_local_id, block);
+ msg->getUUIDFast(_PREHASH_ReportData, _PREHASH_TaskID, task_id, block);
+ msg->getF32Fast(_PREHASH_ReportData, _PREHASH_LocationX, location_x, block);
+ msg->getF32Fast(_PREHASH_ReportData, _PREHASH_LocationY, location_y, block);
+ msg->getF32Fast(_PREHASH_ReportData, _PREHASH_LocationZ, location_z, block);
+ msg->getF32Fast(_PREHASH_ReportData, _PREHASH_Score, score, block);
+ msg->getStringFast(_PREHASH_ReportData, _PREHASH_TaskName, MAX_STRING, name_buf, block);
+ msg->getStringFast(_PREHASH_ReportData, _PREHASH_OwnerName, MAX_STRING, owner_buf, block);
+
+ LLSD element;
+
+ element["id"] = task_id;
+ element["object_name"] = LLString(name_buf);
+ element["owner_name"] = LLString(owner_buf);
+ element["columns"][0]["column"] = "score";
+ element["columns"][0]["value"] = llformat("%0.3f", score);
+ element["columns"][0]["font"] = "SANSSERIF";
+ element["columns"][1]["column"] = "name";
+ element["columns"][1]["value"] = name_buf;
+ element["columns"][1]["font"] = "SANSSERIF";
+ element["columns"][2]["column"] = "owner";
+ element["columns"][2]["value"] = owner_buf;
+ element["columns"][2]["font"] = "SANSSERIF";
+ element["columns"][3]["column"] = "location";
+ element["columns"][3]["value"] = llformat("<%0.1f,%0.1f,%0.1f>", location_x, location_y, location_z);
+ element["columns"][3]["font"] = "SANSSERIF";
+
+ list->addElement(element);
+
+ mObjectListData.append(element);
+ mObjectListIDs.push_back(task_id);
+
+ mtotalScore += score;
+ }
+
+ if (total_count == 0 && list->getItemCount() == 0)
+ {
+ LLSD element;
+ element["id"] = LLUUID::null;
+ element["columns"][0]["column"] = "name";
+ element["columns"][0]["value"] = childGetText("none_descriptor");
+ element["columns"][0]["font"] = "SANSSERIF";
+
+ list->addElement(element);
+ }
+ else
+ {
+ list->selectFirstItem();
+ }
+
+ if (mCurrentMode == STAT_REPORT_TOP_SCRIPTS)
+ {
+ setTitle(childGetText("top_scripts_title"));
+ list->setColumnLabel("score", childGetText("scripts_score_label"));
+
+ LLUIString format = childGetText("top_scripts_text");
+ format.setArg("[COUNT]", llformat("%d", total_count));
+ format.setArg("[TIME]", llformat("%0.1f", mtotalScore));
+ childSetValue("title_text", LLSD(format));
+ }
+ else
+ {
+ setTitle(childGetText("top_colliders_title"));
+ list->setColumnLabel("score", childGetText("colliders_score_label"));
+ LLUIString format = childGetText("top_colliders_text");
+ format.setArg("[COUNT]", llformat("%d", total_count));
+ childSetValue("title_text", LLSD(format));
+ }
+}
+
+// static
+void LLFloaterTopObjects::onCommitObjectsList(LLUICtrl* ctrl, void* data)
+{
+ LLFloaterTopObjects* self = (LLFloaterTopObjects*)data;
+
+ self->updateSelectionInfo();
+}
+
+void LLFloaterTopObjects::updateSelectionInfo()
+{
+ LLScrollListCtrl* list = LLUICtrlFactory::getScrollListByName(this, "objects_list");
+
+ if (!list) return;
+
+ LLUUID object_id = list->getCurrentID();
+ if (object_id.isNull()) return;
+
+ LLString object_id_string = object_id.getString();
+
+ childSetValue("id_editor", LLSD(object_id_string));
+ childSetValue("object_name_editor", list->getFirstSelected()->getColumn(1)->getText());
+ childSetValue("owner_name_editor", list->getFirstSelected()->getColumn(2)->getText());
+}
+
+// static
+void LLFloaterTopObjects::onDoubleClickObjectsList(void* data)
+{
+ LLFloaterTopObjects* self = (LLFloaterTopObjects*)data;
+ self->showBeacon();
+}
+
+// static
+void LLFloaterTopObjects::onClickShowBeacon(void* data)
+{
+ LLFloaterTopObjects* self = (LLFloaterTopObjects*)data;
+ if (!self) return;
+ self->showBeacon();
+}
+
+void LLFloaterTopObjects::doToObjects(int action, bool all)
+{
+ LLMessageSystem *msg = gMessageSystem;
+
+ LLViewerRegion* region = gAgent.getRegion();
+ if (!region) return;
+
+ LLCtrlListInterface *list = childGetListInterface("objects_list");
+ if (!list || list->getItemCount() == 0) return;
+
+ std::vector<LLUUID>::iterator id_itor;
+
+ bool start_message = true;
+
+ for (id_itor = mObjectListIDs.begin(); id_itor != mObjectListIDs.end(); ++id_itor)
+ {
+ LLUUID task_id = *id_itor;
+ if (!all && !list->isSelected(task_id))
+ {
+ // Selected only
+ continue;
+ }
+ if (start_message)
+ {
+ if (action == ACTION_RETURN)
+ {
+ msg->newMessageFast(_PREHASH_ParcelReturnObjects);
+ }
+ else
+ {
+ msg->newMessageFast(_PREHASH_ParcelDisableObjects);
+ }
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID());
+ msg->nextBlockFast(_PREHASH_ParcelData);
+ msg->addS32Fast(_PREHASH_LocalID, -1); // Whole region
+ msg->addS32Fast(_PREHASH_ReturnType, RT_NONE);
+ start_message = false;
+ }
+
+ msg->nextBlockFast(_PREHASH_TaskIDs);
+ msg->addUUIDFast(_PREHASH_TaskID, task_id);
+
+ if (msg->isSendFullFast(_PREHASH_TaskIDs))
+ {
+ msg->sendReliable(region->getHost());
+ start_message = true;
+ }
+ }
+
+ if (!start_message)
+ {
+ msg->sendReliable(region->getHost());
+ }
+}
+
+//static
+void LLFloaterTopObjects::callbackReturnAll(S32 option, void* userdata)
+{
+ if (option == 0)
+ {
+ sInstance->doToObjects(ACTION_RETURN, true);
+ }
+}
+
+void LLFloaterTopObjects::onReturnAll(void* data)
+{
+ gViewerWindow->alertXml("ReturnAllTopObjects", callbackReturnAll, NULL);
+}
+
+
+void LLFloaterTopObjects::onReturnSelected(void* data)
+{
+ sInstance->doToObjects(ACTION_RETURN, false);
+}
+
+
+//static
+void LLFloaterTopObjects::callbackDisableAll(S32 option, void* userdata)
+{
+ if (option == 0)
+ {
+ sInstance->doToObjects(ACTION_DISABLE, true);
+ }
+}
+
+void LLFloaterTopObjects::onDisableAll(void* data)
+{
+ gViewerWindow->alertXml("DisableAllTopObjects", callbackDisableAll, NULL);
+}
+
+void LLFloaterTopObjects::onDisableSelected(void* data)
+{
+ sInstance->doToObjects(ACTION_DISABLE, false);
+}
+
+void LLFloaterTopObjects::clearList()
+{
+ LLCtrlListInterface *list = childGetListInterface("objects_list");
+
+ if (list)
+ {
+ list->operateOnAll(LLCtrlListInterface::OP_DELETE);
+ }
+
+ mObjectListData.clear();
+ mObjectListIDs.clear();
+}
+
+void LLFloaterTopObjects::onRefresh(void* data)
+{
+ U32 mode = STAT_REPORT_TOP_SCRIPTS;
+ U32 flags = 0;
+ LLString filter = "";
+
+ if (sInstance)
+ {
+ mode = sInstance->mCurrentMode;
+ flags = sInstance->mFlags;
+ filter = sInstance->mFilter;
+ sInstance->clearList();
+ }
+
+ sInstance->mtotalScore = 0.f;
+
+ LLMessageSystem *msg = gMessageSystem;
+ msg->newMessageFast(_PREHASH_LandStatRequest);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() );
+ msg->nextBlockFast(_PREHASH_RequestData);
+ msg->addU32Fast(_PREHASH_ReportType, mode);
+ msg->addU32Fast(_PREHASH_RequestFlags, flags);
+ msg->addStringFast(_PREHASH_Filter, filter);
+ msg->addS32Fast(_PREHASH_ParcelLocalID, 0);
+
+ msg->sendReliable(gAgent.getRegionHost());
+
+ if (sInstance)
+ {
+ sInstance->mFilter = "";
+ sInstance->mFlags = 0;
+ }
+}
+
+void LLFloaterTopObjects::onGetByObjectName(LLUICtrl* ctrl, void* data)
+{
+ if (sInstance)
+ {
+ sInstance->mFlags = STAT_FILTER_BY_OBJECT;
+ sInstance->mFilter = sInstance->childGetText("object_name_editor");
+ onRefresh(NULL);
+ }
+}
+
+void LLFloaterTopObjects::onGetByOwnerName(LLUICtrl* ctrl, void* data)
+{
+ if (sInstance)
+ {
+ sInstance->mFlags = STAT_FILTER_BY_OWNER;
+ sInstance->mFilter = sInstance->childGetText("owner_name_editor");
+ onRefresh(NULL);
+ }
+}
+
+void LLFloaterTopObjects::showBeacon()
+{
+ LLScrollListCtrl* list = LLUICtrlFactory::getScrollListByName(this, "objects_list");
+ if (!list) return;
+
+ LLScrollListItem* first_selected = list->getFirstSelected();
+ if (!first_selected) return;
+
+ LLString name = first_selected->getColumn(1)->getText();
+ LLString pos_string = first_selected->getColumn(3)->getText();
+
+ F32 x, y, z;
+ S32 matched = sscanf(pos_string.c_str(), "<%g,%g,%g>", &x, &y, &z);
+ if (matched != 3) return;
+
+ LLVector3 pos_agent(x, y, z);
+ LLVector3d pos_global = gAgent.getPosGlobalFromAgent(pos_agent);
+ LLString tooltip("");
+ LLTracker::trackLocation(pos_global, name, tooltip, LLTracker::LOCATION_ITEM);
+}