From 38d6d37f2d982fa959e9e8a4a3f7e1ccfad7b5d4 Mon Sep 17 00:00:00 2001 From: Jacek Antonelli Date: Fri, 15 Aug 2008 23:44:46 -0500 Subject: Second Life viewer sources 1.13.2.12 --- linden/indra/newview/llpaneldirevents.cpp | 302 ++++++++++++++++++++++++++++++ 1 file changed, 302 insertions(+) create mode 100644 linden/indra/newview/llpaneldirevents.cpp (limited to 'linden/indra/newview/llpaneldirevents.cpp') diff --git a/linden/indra/newview/llpaneldirevents.cpp b/linden/indra/newview/llpaneldirevents.cpp new file mode 100644 index 0000000..703ee5e --- /dev/null +++ b/linden/indra/newview/llpaneldirevents.cpp @@ -0,0 +1,302 @@ +/** + * @file llpaneldirevents.cpp + * @brief Events listing in the Find directory. + * + * Copyright (c) 2001-2007, Linden Research, Inc. + * + * 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://secondlife.com/developers/opensource/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://secondlife.com/developers/opensource/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. + */ + +#include "llviewerprecompiledheaders.h" + +#include "llpaneldirevents.h" + +#include + +// linden library includes +#include "llenum.h" +#include "message.h" +#include "llqueryflags.h" + +// viewer project includes +#include "llagent.h" +#include "llviewercontrol.h" +#include "lleventinfo.h" +#include "llpaneldirbrowser.h" +#include "llresmgr.h" +#include "lluiconstants.h" +#include "llpanelevent.h" +#include "viewer.h" + +BOOL gDisplayEventHack = FALSE; + +LLPanelDirEvents::LLPanelDirEvents(const std::string& name, LLFloaterDirectory* floater) + : LLPanelDirBrowser(name, floater), + mDay(0), + mDoneQuery(FALSE) +{ + // more results per page for this + mResultsPerPage = 200; +} + +BOOL LLPanelDirEvents::postBuild() +{ + LLPanelDirBrowser::postBuild(); + + // *HACK: Deal with PST vs. PDT + LLString buffer = llformat("Time (%s)", (gPacificDaylightTime ? "PDT" : "PST")); + childSetValue("desc_btn", buffer); + + childSetCommitCallback("date_mode", onDateModeCallback, this); + + childSetAction("<<", onBackBtn, this); + childSetAction(">>", onForwardBtn, this); + + childSetAction("Today", onClickToday, this); + + childSetCommitCallback("mature", onCommitMature, this); + + childSetAction("Search", LLPanelDirBrowser::onClickSearchCore, this); + setDefaultBtn("Search"); + + childSetAction("Delete", onClickDelete, this); + childDisable("Delete"); + childHide("Delete"); + + onDateModeCallback(NULL, this); + + mCurrentSortColumn = "time"; + + if (!gDisplayEventHack) + { + setDay(0); // for today + //performQuery(); // Temporary change to help DB - Sabin + } + gDisplayEventHack = FALSE; + + return TRUE; +} + +LLPanelDirEvents::~LLPanelDirEvents() +{ + // Children all cleaned up by default view destructor. +} + + +void LLPanelDirEvents::draw() +{ + refresh(); + + LLPanelDirBrowser::draw(); +} + +void LLPanelDirEvents::refresh() +{ + // You only have a choice if you are mature + childSetVisible("incmature", gAgent.mAccess >= SIM_ACCESS_MATURE); + + BOOL godlike = gAgent.isGodlike(); + childSetVisible("Delete", godlike); + childSetEnabled("Delete", godlike); +} + + +void LLPanelDirEvents::setDay(S32 day) +{ + mDay = day; + + // Get time UTC + time_t utc_time = time_corrected(); + + // Correct for offset + utc_time += day * 24 * 60 * 60; + + // There's only one internal tm buffer. + struct tm* internal_time; + + // Convert to Pacific, based on server's opinion of whether + // it's daylight savings time there. + internal_time = utc_to_pacific_time(utc_time, gPacificDaylightTime); + + LLString buffer = llformat("%d/%d", + 1 + internal_time->tm_mon, // Jan = 0 + internal_time->tm_mday); // 2001 = 101 + childSetValue("date_text", buffer); +} + +// virtual +void LLPanelDirEvents::performQuery() +{ + // event_id 0 will perform no delete action. + performQueryOrDelete(0); +} + +void LLPanelDirEvents::performQueryOrDelete(U32 event_id) +{ + S32 relative_day = mDay; + // Update the date field to show the date IN THE SERVER'S + // TIME ZONE, as that is what will be displayed in each event + + // Get time UTC + time_t utc_time = time_corrected(); + + // Correct for offset + utc_time += relative_day * 24 * 60 * 60; + + // There's only one internal tm buffer. + struct tm* internal_time; + + // Convert to Pacific, based on server's opinion of whether + // it's daylight savings time there. + internal_time = utc_to_pacific_time(utc_time, gPacificDaylightTime); + + LLString buffer = llformat("%d/%d", + 1 + internal_time->tm_mon, // Jan = 0 + internal_time->tm_mday); // 2001 = 101 + childSetValue("date_text", buffer); + + // Record the relative day so back and forward buttons + // offset from this day. + mDay = relative_day; + + mDoneQuery = TRUE; + + setupNewSearch(); + + U32 scope = DFQ_DATE_EVENTS; + if ( gAgent.mAccess <= SIM_ACCESS_PG) scope |= DFQ_PG_SIMS_ONLY; + if ( !childGetValue("incmature").asBoolean() ) scope |= DFQ_PG_EVENTS_ONLY; + + std::ostringstream params; + + // Date mode for the search + if ("current" == childGetValue("date_mode").asString()) + { + params << "u|"; + } + else + { + params << mDay << "|"; + } + + // Categories are stored in the database in table indra.event_category + // XML must match. + U32 cat_id = childGetValue("category combo").asInteger(); + + params << cat_id << "|"; + params << childGetValue("event_search_text").asString(); + + // send the message + if (0 == event_id) + { + sendDirFindQuery(gMessageSystem, mSearchID, params.str().c_str(), scope, mSearchStart); + } + else + { + // This delete will also perform a query. + LLMessageSystem* msg = gMessageSystem; + + msg->newMessageFast(_PREHASH_EventGodDelete); + + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + + msg->nextBlockFast(_PREHASH_EventData); + msg->addU32Fast(_PREHASH_EventID, event_id); + + msg->nextBlockFast(_PREHASH_QueryData); + msg->addUUIDFast(_PREHASH_QueryID, mSearchID); + msg->addStringFast(_PREHASH_QueryText, params.str()); + msg->addU32Fast(_PREHASH_QueryFlags, scope); + msg->addS32Fast(_PREHASH_QueryStart, mSearchStart); + gAgent.sendReliableMessage(); + } +} + +// static +void LLPanelDirEvents::onDateModeCallback(LLUICtrl* ctrl, void *data) +{ + LLPanelDirEvents* self = (LLPanelDirEvents*)data; + if (self->childGetValue("date_mode").asString() == "date") + { + self->childEnable("Today"); + self->childEnable(">>"); + self->childEnable("<<"); + } + else + { + self->childDisable("Today"); + self->childDisable(">>"); + self->childDisable("<<"); + } +} + +// static +void LLPanelDirEvents::onClickToday(void *userdata) +{ + LLPanelDirEvents *self = (LLPanelDirEvents *)userdata; + self->resetSearchStart(); + self->setDay(0); + self->performQuery(); +} + + +// static +void LLPanelDirEvents::onBackBtn(void* data) +{ + LLPanelDirEvents* self = (LLPanelDirEvents*)data; + self->resetSearchStart(); + self->setDay(self->mDay - 1); + self->performQuery(); +} + + +// static +void LLPanelDirEvents::onForwardBtn(void* data) +{ + LLPanelDirEvents* self = (LLPanelDirEvents*)data; + self->resetSearchStart(); + self->setDay(self->mDay + 1); + self->performQuery(); +} + + +// static +void LLPanelDirEvents::onCommitMature(LLUICtrl* ctrl, void* data) +{ + // just perform another search + onClickSearchCore(data); +} + + +// static +void LLPanelDirEvents::onClickDelete(void *userdata) +{ + LLPanelDirEvents *self = (LLPanelDirEvents *)userdata; + if (!self) return; + + U32 event_id; + event_id = self->getSelectedEventID(); + if (!event_id) return; + + self->performQueryOrDelete(event_id); +} -- cgit v1.1