summaryrefslogtreecommitdiff
path: root/indra/newview/llfloatergroups.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/llfloatergroups.cpp
Print done when done.
Diffstat (limited to 'indra/newview/llfloatergroups.cpp')
-rw-r--r--indra/newview/llfloatergroups.cpp454
1 files changed, 454 insertions, 0 deletions
diff --git a/indra/newview/llfloatergroups.cpp b/indra/newview/llfloatergroups.cpp
new file mode 100644
index 0000000000..f03d0735a4
--- /dev/null
+++ b/indra/newview/llfloatergroups.cpp
@@ -0,0 +1,454 @@
+/**
+ * @file llfloatergroups.cpp
+ * @brief LLFloaterGroups class implementation
+ *
+ * Copyright (c) 2002-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+/*
+ * Shown from Edit -> Groups...
+ * Shows the agent's groups and allows the edit window to be invoked.
+ * Also overloaded to allow picking of a single group for assigning
+ * objects and land to groups.
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloatergroups.h"
+
+#include "message.h"
+
+#include "llagent.h"
+#include "llbutton.h"
+#include "llfloatergroupinfo.h"
+#include "llfloaterdirectory.h"
+#include "llfocusmgr.h"
+#include "llalertdialog.h"
+#include "llselectmgr.h"
+#include "llscrolllistctrl.h"
+#include "lltextbox.h"
+#include "llvieweruictrlfactory.h"
+#include "llviewerwindow.h"
+
+const LLRect FLOATER_RECT(0, 258, 280, 0);
+const char FLOATER_TITLE[] = "Groups";
+
+// static
+LLMap<const LLUUID, LLFloaterGroups*> LLFloaterGroups::sInstances;
+
+
+///----------------------------------------------------------------------------
+/// Class LLFloaterGroups
+///----------------------------------------------------------------------------
+
+//LLEventListener
+//virtual
+bool LLFloaterGroups::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
+{
+ if (event->desc() == "new group")
+ {
+ reset();
+ return true;
+ }
+
+ return LLView::handleEvent(event, userdata);
+}
+
+// Call this with an agent id and AGENT_GROUPS for an agent's
+// groups, otherwise, call with an object id and SET_OBJECT_GROUP
+// when modifying an object.
+// static
+LLFloaterGroups* LLFloaterGroups::show(const LLUUID& id, EGroupDialog type)
+{
+ LLFloaterGroups* instance = NULL;
+ if(sInstances.checkData(id))
+ {
+ instance = sInstances.getData(id);
+ if (instance->getType() != type)
+ {
+ // not the type we want ==> destroy it and rebuild below
+ instance->destroy();
+ instance = NULL;
+ }
+ else
+ {
+ // Move the existing view to the front
+ instance->open();
+ }
+ }
+
+ if (!instance)
+ {
+ S32 left = 0;
+ S32 top = 0;
+ LLRect rect = FLOATER_RECT;
+ rect.translate( left - rect.mLeft, top - rect.mTop );
+ instance = new LLFloaterGroups("groups", rect, FLOATER_TITLE, id);
+ if(instance)
+ {
+ sInstances.addData(id, instance);
+ //instance->init(type);
+ instance->mType = type;
+ switch (type)
+ {
+ case AGENT_GROUPS:
+ gUICtrlFactory->buildFloater(instance, "floater_groups.xml");
+ break;
+ case CHOOSE_ONE:
+ gUICtrlFactory->buildFloater(instance, "floater_choose_group.xml");
+ break;
+ }
+ instance->center();
+ instance->open();
+ }
+ }
+ return instance;
+}
+
+// static
+LLFloaterGroups* LLFloaterGroups::getInstance(const LLUUID& id)
+{
+ if(sInstances.checkData(id))
+ {
+ return sInstances.getData(id);
+ }
+ return NULL;
+}
+
+// Default constructor
+LLFloaterGroups::LLFloaterGroups(const std::string& name,
+ const LLRect& rect,
+ const std::string& title,
+ const LLUUID& id) :
+ LLFloater(name, rect, title),
+ mID(id),
+ mType(AGENT_GROUPS),
+ mOKCallback(NULL),
+ mCallbackUserdata(NULL)
+{
+}
+
+// Destroys the object
+LLFloaterGroups::~LLFloaterGroups()
+{
+ gFocusMgr.releaseFocusIfNeeded( this );
+
+ sInstances.removeData(mID);
+}
+
+// clear the group list, and get a fresh set of info.
+void LLFloaterGroups::reset()
+{
+ LLCtrlListInterface *group_list = childGetListInterface("group list");
+ if (group_list)
+ {
+ group_list->operateOnAll(LLCtrlListInterface::OP_DELETE);
+ }
+ childSetTextArg("groupcount", "[COUNT]", llformat("%d",gAgent.mGroups.count()));
+ childSetTextArg("groupcount", "[MAX]", llformat("%d",MAX_AGENT_GROUPS));
+
+ initAgentGroups(gAgent.getGroupID());
+ enableButtons();
+}
+
+void LLFloaterGroups::setOkCallback(void (*callback)(LLUUID, void*),
+ void* userdata)
+{
+ mOKCallback = callback;
+ mCallbackUserdata = userdata;
+}
+
+BOOL LLFloaterGroups::postBuild()
+{
+ childSetCommitCallback("group list", onGroupList, this);
+
+ if(mType == AGENT_GROUPS)
+ {
+ childSetTextArg("groupcount", "[COUNT]", llformat("%d",gAgent.mGroups.count()));
+ childSetTextArg("groupcount", "[MAX]", llformat("%d",MAX_AGENT_GROUPS));
+
+ initAgentGroups(gAgent.getGroupID());
+
+ childSetAction("Activate", onBtnActivate, this);
+
+ childSetAction("Info", onBtnInfo, this);
+
+ childSetAction("Leave", onBtnLeave, this);
+
+ childSetAction("Create", onBtnCreate, this);
+
+ childSetAction("Search...", onBtnSearch, this);
+
+ childSetAction("Close", onBtnCancel, this);
+
+ setDefaultBtn("Info");
+
+ childSetDoubleClickCallback("group list", onBtnInfo);
+ childSetUserData("group list", this);
+ }
+ else
+ {
+ initAgentGroups(gAgent.getGroupID());
+
+ childSetAction("OK", onBtnOK, this);
+
+ childSetAction("Cancel", onBtnCancel, this);
+
+ setDefaultBtn("OK");
+
+ childSetDoubleClickCallback("group list", onBtnOK);
+ childSetUserData("group list", this);
+ }
+
+ enableButtons();
+
+ return TRUE;
+}
+
+void LLFloaterGroups::initAgentGroups(const LLUUID& highlight_id)
+{
+ S32 count = gAgent.mGroups.count();
+ LLUUID id;
+ LLCtrlListInterface *group_list = childGetListInterface("group list");
+ if (!group_list) return;
+
+ group_list->operateOnAll(LLCtrlListInterface::OP_DELETE);
+
+ for(S32 i = 0; i < count; ++i)
+ {
+ id = gAgent.mGroups.get(i).mID;
+ LLGroupData* group_datap = &gAgent.mGroups.get(i);
+ LLString style = "NORMAL";
+ if(highlight_id == id)
+ {
+ style = "BOLD";
+ }
+
+ LLSD element;
+ element["id"] = id;
+ element["columns"][0]["column"] = "name";
+ element["columns"][0]["value"] = group_datap->mName;
+ element["columns"][0]["font"] = "SANSSERIF";
+ element["columns"][0]["font-style"] = style;
+
+ group_list->addElement(element, ADD_SORTED);
+ }
+
+ {
+ LLString style = "NORMAL";
+ if (highlight_id.isNull())
+ {
+ style = "BOLD";
+ }
+ LLSD element;
+ element["id"] = LLUUID::null;
+ element["columns"][0]["column"] = "name";
+ element["columns"][0]["value"] = "none";
+ element["columns"][0]["font"] = "SANSSERIF";
+ element["columns"][0]["font-style"] = style;
+
+ group_list->addElement(element, ADD_TOP);
+ }
+
+ group_list->selectByValue(highlight_id);
+
+ childSetFocus("group list");
+}
+
+void LLFloaterGroups::enableButtons()
+{
+ LLCtrlListInterface *group_list = childGetListInterface("group list");
+ LLUUID group_id;
+ if (group_list)
+ {
+ group_id = group_list->getCurrentID();
+ }
+ if(mType == AGENT_GROUPS)
+ {
+ if(group_id != gAgent.getGroupID())
+ {
+ childEnable("Activate");
+ }
+ else
+ {
+ childDisable("Activate");
+ }
+ if (group_id.notNull())
+ {
+ childEnable("Info");
+ childEnable("Leave");
+ }
+ else
+ {
+ childDisable("Info");
+ childDisable("Leave");
+ }
+ if(gAgent.mGroups.count() < MAX_AGENT_GROUPS)
+ {
+ childEnable("Create");
+ }
+ else
+ {
+ childDisable("Create");
+ }
+ }
+ else
+ {
+ childEnable("OK");
+ }
+}
+
+
+void LLFloaterGroups::onBtnCreate(void* userdata)
+{
+ LLFloaterGroups* self = (LLFloaterGroups*)userdata;
+ if(self) self->create();
+}
+
+void LLFloaterGroups::onBtnActivate(void* userdata)
+{
+ LLFloaterGroups* self = (LLFloaterGroups*)userdata;
+ if(self) self->activate();
+}
+
+void LLFloaterGroups::onBtnInfo(void* userdata)
+{
+ LLFloaterGroups* self = (LLFloaterGroups*)userdata;
+ if(self) self->info();
+}
+
+void LLFloaterGroups::onBtnLeave(void* userdata)
+{
+ LLFloaterGroups* self = (LLFloaterGroups*)userdata;
+ if(self) self->leave();
+}
+
+void LLFloaterGroups::onBtnSearch(void* userdata)
+{
+ LLFloaterGroups* self = (LLFloaterGroups*)userdata;
+ if(self) self->search();
+}
+
+void LLFloaterGroups::onBtnOK(void* userdata)
+{
+ LLFloaterGroups* self = (LLFloaterGroups*)userdata;
+ if(self) self->ok();
+}
+
+void LLFloaterGroups::onBtnCancel(void* userdata)
+{
+ LLFloaterGroups* self = (LLFloaterGroups*)userdata;
+ if(self) self->close();
+}
+
+void LLFloaterGroups::onGroupList(LLUICtrl* ctrl, void* userdata)
+{
+ LLFloaterGroups* self = (LLFloaterGroups*)userdata;
+ if(self) self->highlightGroupList(ctrl);
+}
+
+void LLFloaterGroups::create()
+{
+ llinfos << "LLFloaterGroups::create" << llendl;
+ LLFloaterGroupInfo::showCreateGroup(NULL);
+}
+
+void LLFloaterGroups::activate()
+{
+ llinfos << "LLFloaterGroups::activate" << llendl;
+ LLCtrlListInterface *group_list = childGetListInterface("group list");
+ LLUUID group_id;
+ if (group_list)
+ {
+ group_id = group_list->getCurrentID();
+ }
+ LLMessageSystem* msg = gMessageSystem;
+ msg->newMessageFast(_PREHASH_ActivateGroup);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->addUUIDFast(_PREHASH_GroupID, group_id);
+ gAgent.sendReliableMessage();
+}
+
+void LLFloaterGroups::info()
+{
+ llinfos << "LLFloaterGroups::info" << llendl;
+ LLCtrlListInterface *group_list = childGetListInterface("group list");
+ LLUUID group_id;
+ if (group_list && (group_id = group_list->getCurrentID()).notNull())
+ {
+ LLFloaterGroupInfo::showFromUUID(group_id);
+ }
+}
+
+void LLFloaterGroups::leave()
+{
+ llinfos << "LLFloaterGroups::leave" << llendl;
+ LLCtrlListInterface *group_list = childGetListInterface("group list");
+ LLUUID group_id;
+ if (group_list && (group_id = group_list->getCurrentID()).notNull())
+ {
+ S32 count = gAgent.mGroups.count();
+ S32 i;
+ for(i = 0; i < count; ++i)
+ {
+ if(gAgent.mGroups.get(i).mID == group_id)
+ break;
+ }
+ if(i < count)
+ {
+ LLUUID* cb_data = new LLUUID((const LLUUID&)group_id);
+ LLString::format_map_t args;
+ args["[GROUP]"] = gAgent.mGroups.get(i).mName;
+ gViewerWindow->alertXml("GroupLeaveConfirmMember", args, callbackLeaveGroup, (void*)cb_data);
+ }
+ }
+}
+
+void LLFloaterGroups::search()
+{
+ LLFloaterDirectory::showGroups();
+}
+
+// static
+void LLFloaterGroups::callbackLeaveGroup(S32 option, void* userdata)
+{
+ LLUUID* group_id = (LLUUID*)userdata;
+ if(option == 0 && group_id)
+ {
+ LLMessageSystem* msg = gMessageSystem;
+ msg->newMessageFast(_PREHASH_LeaveGroupRequest);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->nextBlockFast(_PREHASH_GroupData);
+ msg->addUUIDFast(_PREHASH_GroupID, *group_id);
+ gAgent.sendReliableMessage();
+ }
+ delete group_id;
+}
+
+void LLFloaterGroups::ok()
+{
+ llinfos << "LLFloaterGroups::ok" << llendl;
+ LLCtrlListInterface *group_list = childGetListInterface("group list");
+ LLUUID group_id;
+ if (group_list)
+ {
+ group_id = group_list->getCurrentID();
+ }
+ if(mOKCallback)
+ {
+ mOKCallback(group_id, mCallbackUserdata);
+ }
+
+ close();
+}
+
+void LLFloaterGroups::highlightGroupList(LLUICtrl*)
+{
+ llinfos << "LLFloaterGroups::highlightGroupList" << llendl;
+ enableButtons();
+}