/** * @file llfloaterinspect.cpp * @brief Floater for object inspection tool * * Copyright (c) 2006-$CurrentYear$, Linden Research, Inc. * $License$ */ #include "llviewerprecompiledheaders.h" #include "llfloateravatarinfo.h" #include "llfloaterinspect.h" #include "llfloatertools.h" #include "llcachename.h" #include "llscrolllistctrl.h" #include "llselectmgr.h" #include "lltoolcomp.h" #include "lltoolmgr.h" #include "llviewercontrol.h" #include "llviewerobject.h" #include "llvieweruictrlfactory.h" LLFloaterInspect* LLFloaterInspect::sInstance = NULL; LLFloaterInspect::LLFloaterInspect(void) : LLFloater("Inspect Object"), mDirty(FALSE) { sInstance = this; gUICtrlFactory->buildFloater(this, "floater_inspect.xml"); } LLFloaterInspect::~LLFloaterInspect(void) { if(!gFloaterTools->getVisible()) { if(gToolMgr->getBaseTool() == gToolInspect) { gToolMgr->clearTransientTool(); } // Switch back to basic toolset gToolMgr->setCurrentToolset(gBasicToolset); } else { gFloaterTools->setFocus(TRUE); } sInstance = NULL; } BOOL LLFloaterInspect::isVisible() { return (!!sInstance); } void LLFloaterInspect::show(void* ignored) { // setForceSelection ensures that the pie menu does not deselect things when it // looses the focus (this can happen with "select own objects only" enabled // VWR-1471 BOOL forcesel = gSelectMgr->setForceSelection(TRUE); if (!sInstance) // first use { sInstance = new LLFloaterInspect; } sInstance->open(); gToolMgr->setTransientTool(gToolInspect); gSelectMgr->setForceSelection(forcesel); // restore previouis value sInstance->mObjectSelection = gSelectMgr->getSelection(); sInstance->refresh(); } void LLFloaterInspect::onClickCreatorProfile(void* ctrl) { if(sInstance->mObjectList->getAllSelected().size() == 0) return; LLScrollListItem* first_selected = sInstance->mObjectList->getFirstSelected(); if (first_selected) { LLSelectNode* obj= sInstance->mObjectSelection->getFirstNode(); LLUUID obj_id, creator_id; obj_id = first_selected->getUUID(); while(obj) { if(obj_id == obj->getObject()->getID()) { creator_id = obj->mPermissions->getCreator(); break; } obj = sInstance->mObjectSelection->getNextNode(); } if(obj) { LLFloaterAvatarInfo::showFromDirectory(creator_id); } } } void LLFloaterInspect::onClickOwnerProfile(void* ctrl) { if(sInstance->mObjectList->getAllSelected().size() == 0) return; LLScrollListItem* first_selected = sInstance->mObjectList->getFirstSelected(); if (first_selected) { LLSelectNode* obj= sInstance->mObjectSelection->getFirstNode(); LLUUID obj_id, owner_id; obj_id = first_selected->getUUID(); while(obj) { if(obj_id == obj->getObject()->getID()) { owner_id = obj->mPermissions->getOwner(); break; } obj = sInstance->mObjectSelection->getNextNode(); } if(obj) { LLFloaterAvatarInfo::showFromDirectory(owner_id); } } } BOOL LLFloaterInspect::postBuild() { mObjectList = LLUICtrlFactory::getScrollListByName(this, "object_list"); childSetAction("button owner",onClickOwnerProfile, this); childSetAction("button creator",onClickCreatorProfile, this); childSetCommitCallback("object_list", onSelectObject); return TRUE; } void LLFloaterInspect::onSelectObject(LLUICtrl* ctrl, void* user_data) { if(LLFloaterInspect::getSelectedUUID() != LLUUID::null) { sInstance->childSetEnabled("button owner", true); sInstance->childSetEnabled("button creator", true); } } LLUUID LLFloaterInspect::getSelectedUUID() { if(sInstance) { if(sInstance->mObjectList->getAllSelected().size() > 0) { LLScrollListItem* first_selected = sInstance->mObjectList->getFirstSelected(); if (first_selected) { return first_selected->getUUID(); } } } return LLUUID::null; } void LLFloaterInspect::refresh() { LLUUID creator_id; LLString creator_name; S32 pos = mObjectList->getScrollPos(); childSetEnabled("button owner", false); childSetEnabled("button creator", false); LLUUID selected_uuid; S32 selected_index = mObjectList->getFirstSelectedIndex(); if(selected_index > -1) { LLScrollListItem* first_selected = mObjectList->getFirstSelected(); if (first_selected) { selected_uuid = first_selected->getUUID(); } } mObjectList->operateOnAll(LLScrollListCtrl::OP_DELETE); //List all transient objects, then all linked objects LLSelectNode* obj = mObjectSelection->getFirstNode(); LLSD row; while(obj) { char owner_first_name[MAX_STRING], owner_last_name[MAX_STRING]; char creator_first_name[MAX_STRING], creator_last_name[MAX_STRING]; char time[MAX_STRING]; std::ostringstream owner_name, creator_name, date; time_t timestamp = (time_t) (obj->mCreationDate/1000000); LLString::copy(time, ctime(×tamp), MAX_STRING); time[24] = '\0'; date << obj->mCreationDate; gCacheName->getName(obj->mPermissions->getOwner(), owner_first_name, owner_last_name); owner_name << owner_first_name << " " << owner_last_name; gCacheName->getName(obj->mPermissions->getCreator(), creator_first_name, creator_last_name); creator_name << creator_first_name << " " << creator_last_name; row["id"] = obj->getObject()->getID(); row["columns"][0]["column"] = "object_name"; row["columns"][0]["type"] = "text"; // make sure we're either at the top of the link chain // or top of the editable chain, for attachments if(!(obj->getObject()->isRoot() || obj->getObject()->isRootEdit())) { row["columns"][0]["value"] = LLString(" ") + obj->mName; } else { row["columns"][0]["value"] = obj->mName; } row["columns"][1]["column"] = "owner_name"; row["columns"][1]["type"] = "text"; row["columns"][1]["value"] = owner_name.str().c_str(); row["columns"][2]["column"] = "creator_name"; row["columns"][2]["type"] = "text"; row["columns"][2]["value"] = creator_name.str().c_str(); row["columns"][3]["column"] = "creation_date"; row["columns"][3]["type"] = "text"; row["columns"][3]["value"] = time; mObjectList->addElement(row, ADD_TOP); obj = mObjectSelection->getNextNode(); } if(selected_index > -1 && mObjectList->getItemIndex(selected_uuid) == selected_index) { mObjectList->selectNthItem(selected_index); } else { mObjectList->selectNthItem(0); } onSelectObject(this, NULL); mObjectList->setScrollPos(pos); } void LLFloaterInspect::onFocusReceived() { gToolMgr->setTransientTool(gToolInspect); } void LLFloaterInspect::dirty() { if(sInstance) { sInstance->setDirty(); } } void LLFloaterInspect::draw() { if (mDirty) { refresh(); mDirty = FALSE; } LLFloater::draw(); }