00001
00032 #include "llviewerprecompiledheaders.h"
00033 #include "llfloateravatarinfo.h"
00034 #include "llfloaterinspect.h"
00035 #include "llfloatertools.h"
00036 #include "llcachename.h"
00037 #include "llscrolllistctrl.h"
00038 #include "llselectmgr.h"
00039 #include "lltoolcomp.h"
00040 #include "lltoolmgr.h"
00041 #include "llviewercontrol.h"
00042 #include "llviewerobject.h"
00043 #include "lluictrlfactory.h"
00044
00045 LLFloaterInspect* LLFloaterInspect::sInstance = NULL;
00046
00047 LLFloaterInspect::LLFloaterInspect(void) :
00048 LLFloater("Inspect Object"),
00049 mDirty(FALSE)
00050 {
00051 sInstance = this;
00052 LLUICtrlFactory::getInstance()->buildFloater(this, "floater_inspect.xml");
00053 }
00054
00055 LLFloaterInspect::~LLFloaterInspect(void)
00056 {
00057 if(!gFloaterTools->getVisible())
00058 {
00059 if(LLToolMgr::getInstance()->getBaseTool() == LLToolCompInspect::getInstance())
00060 {
00061 LLToolMgr::getInstance()->clearTransientTool();
00062 }
00063
00064 LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset);
00065 }
00066 else
00067 {
00068 gFloaterTools->setFocus(TRUE);
00069 }
00070 sInstance = NULL;
00071 }
00072
00073 BOOL LLFloaterInspect::isVisible()
00074 {
00075 return (!!sInstance);
00076 }
00077
00078 void LLFloaterInspect::show(void* ignored)
00079 {
00080
00081
00082
00083 BOOL forcesel = LLSelectMgr::getInstance()->setForceSelection(TRUE);
00084
00085 if (!sInstance)
00086 {
00087 sInstance = new LLFloaterInspect;
00088 }
00089
00090 sInstance->open();
00091 LLToolMgr::getInstance()->setTransientTool(LLToolCompInspect::getInstance());
00092 LLSelectMgr::getInstance()->setForceSelection(forcesel);
00093
00094 sInstance->mObjectSelection = LLSelectMgr::getInstance()->getSelection();
00095 sInstance->refresh();
00096 }
00097
00098 void LLFloaterInspect::onClickCreatorProfile(void* ctrl)
00099 {
00100 if(sInstance->mObjectList->getAllSelected().size() == 0)
00101 {
00102 return;
00103 }
00104 LLScrollListItem* first_selected =
00105 sInstance->mObjectList->getFirstSelected();
00106
00107 if (first_selected)
00108 {
00109 struct f : public LLSelectedNodeFunctor
00110 {
00111 LLUUID obj_id;
00112 f(const LLUUID& id) : obj_id(id) {}
00113 virtual bool apply(LLSelectNode* node)
00114 {
00115 return (obj_id == node->getObject()->getID());
00116 }
00117 } func(first_selected->getUUID());
00118 LLSelectNode* node = sInstance->mObjectSelection->getFirstNode(&func);
00119 if(node)
00120 {
00121 LLFloaterAvatarInfo::showFromDirectory(node->mPermissions->getCreator());
00122 }
00123 }
00124 }
00125
00126 void LLFloaterInspect::onClickOwnerProfile(void* ctrl)
00127 {
00128 if(sInstance->mObjectList->getAllSelected().size() == 0) return;
00129 LLScrollListItem* first_selected =
00130 sInstance->mObjectList->getFirstSelected();
00131
00132 if (first_selected)
00133 {
00134 LLUUID selected_id = first_selected->getUUID();
00135 struct f : public LLSelectedNodeFunctor
00136 {
00137 LLUUID obj_id;
00138 f(const LLUUID& id) : obj_id(id) {}
00139 virtual bool apply(LLSelectNode* node)
00140 {
00141 return (obj_id == node->getObject()->getID());
00142 }
00143 } func(selected_id);
00144 LLSelectNode* node = sInstance->mObjectSelection->getFirstNode(&func);
00145 if(node)
00146 {
00147 const LLUUID& owner_id = node->mPermissions->getOwner();
00148 LLFloaterAvatarInfo::showFromDirectory(owner_id);
00149 }
00150 }
00151 }
00152
00153 BOOL LLFloaterInspect::postBuild()
00154 {
00155 mObjectList = getChild<LLScrollListCtrl>("object_list");
00156 childSetAction("button owner",onClickOwnerProfile, this);
00157 childSetAction("button creator",onClickCreatorProfile, this);
00158 childSetCommitCallback("object_list", onSelectObject);
00159 return TRUE;
00160 }
00161
00162 void LLFloaterInspect::onSelectObject(LLUICtrl* ctrl, void* user_data)
00163 {
00164 if(LLFloaterInspect::getSelectedUUID() != LLUUID::null)
00165 {
00166 sInstance->childSetEnabled("button owner", true);
00167 sInstance->childSetEnabled("button creator", true);
00168 }
00169 }
00170
00171 LLUUID LLFloaterInspect::getSelectedUUID()
00172 {
00173 if(sInstance)
00174 {
00175 if(sInstance->mObjectList->getAllSelected().size() > 0)
00176 {
00177 LLScrollListItem* first_selected =
00178 sInstance->mObjectList->getFirstSelected();
00179 if (first_selected)
00180 {
00181 return first_selected->getUUID();
00182 }
00183 }
00184 }
00185 return LLUUID::null;
00186 }
00187
00188 void LLFloaterInspect::refresh()
00189 {
00190 LLUUID creator_id;
00191 LLString creator_name;
00192 S32 pos = mObjectList->getScrollPos();
00193 childSetEnabled("button owner", false);
00194 childSetEnabled("button creator", false);
00195 LLUUID selected_uuid;
00196 S32 selected_index = mObjectList->getFirstSelectedIndex();
00197 if(selected_index > -1)
00198 {
00199 LLScrollListItem* first_selected =
00200 mObjectList->getFirstSelected();
00201 if (first_selected)
00202 {
00203 selected_uuid = first_selected->getUUID();
00204 }
00205 }
00206 mObjectList->operateOnAll(LLScrollListCtrl::OP_DELETE);
00207
00208
00209 for (LLObjectSelection::iterator iter = mObjectSelection->begin();
00210 iter != mObjectSelection->end(); iter++)
00211 {
00212 LLSelectNode* obj = *iter;
00213 LLSD row;
00214 char time[MAX_STRING];
00215 std::string owner_name, creator_name;
00216 time_t timestamp = (time_t) (obj->mCreationDate/1000000);
00217 LLString::copy(time, ctime(×tamp), MAX_STRING);
00218 time[24] = '\0';
00219 gCacheName->getFullName(obj->mPermissions->getOwner(), owner_name);
00220 gCacheName->getFullName(obj->mPermissions->getCreator(), creator_name);
00221 row["id"] = obj->getObject()->getID();
00222 row["columns"][0]["column"] = "object_name";
00223 row["columns"][0]["type"] = "text";
00224
00225
00226 if(!(obj->getObject()->isRoot() || obj->getObject()->isRootEdit()))
00227 {
00228 row["columns"][0]["value"] = LLString(" ") + obj->mName;
00229 }
00230 else
00231 {
00232 row["columns"][0]["value"] = obj->mName;
00233 }
00234 row["columns"][1]["column"] = "owner_name";
00235 row["columns"][1]["type"] = "text";
00236 row["columns"][1]["value"] = owner_name;
00237 row["columns"][2]["column"] = "creator_name";
00238 row["columns"][2]["type"] = "text";
00239 row["columns"][2]["value"] = creator_name;
00240 row["columns"][3]["column"] = "creation_date";
00241 row["columns"][3]["type"] = "text";
00242 row["columns"][3]["value"] = time;
00243 mObjectList->addElement(row, ADD_TOP);
00244 }
00245 if(selected_index > -1 && mObjectList->getItemIndex(selected_uuid) == selected_index)
00246 {
00247 mObjectList->selectNthItem(selected_index);
00248 }
00249 else
00250 {
00251 mObjectList->selectNthItem(0);
00252 }
00253 onSelectObject(this, NULL);
00254 mObjectList->setScrollPos(pos);
00255 }
00256
00257 void LLFloaterInspect::onFocusReceived()
00258 {
00259 LLToolMgr::getInstance()->setTransientTool(LLToolCompInspect::getInstance());
00260 LLFloater::onFocusReceived();
00261 }
00262
00263 void LLFloaterInspect::dirty()
00264 {
00265 if(sInstance)
00266 {
00267 sInstance->setDirty();
00268 }
00269 }
00270
00271 void LLFloaterInspect::draw()
00272 {
00273 if (mDirty)
00274 {
00275 refresh();
00276 mDirty = FALSE;
00277 }
00278
00279 LLFloater::draw();
00280 }