llinventoryactions.cpp

Go to the documentation of this file.
00001 
00032 #include "llviewerprecompiledheaders.h"
00033 
00034 #include <utility> // for std::pair<>
00035 
00036 #include "llinventoryview.h"
00037 #include "llpanelinventory.h"
00038 #include "llinventorybridge.h"
00039 
00040 #include "message.h"
00041 
00042 #include "llagent.h"
00043 #include "llcallingcard.h"
00044 #include "llcheckboxctrl.h"             // for radio buttons
00045 #include "llradiogroup.h"
00046 #include "llspinctrl.h"
00047 #include "lltextbox.h"
00048 #include "llui.h"
00049 
00050 #include "llviewercontrol.h"
00051 #include "llfirstuse.h"
00052 #include "llfloateravatarinfo.h"
00053 #include "llfloaterchat.h"
00054 #include "llfloatercustomize.h"
00055 #include "llfloaterproperties.h"
00056 #include "llfocusmgr.h"
00057 #include "llfolderview.h"
00058 #include "llgesturemgr.h"
00059 #include "lliconctrl.h"
00060 #include "llinventorymodel.h"
00061 #include "llinventoryclipboard.h"
00062 #include "lllineeditor.h"
00063 #include "llmenugl.h"
00064 #include "llpreviewanim.h"
00065 #include "llpreviewgesture.h"
00066 #include "llpreviewlandmark.h"
00067 #include "llpreviewnotecard.h"
00068 #include "llpreviewscript.h"
00069 #include "llpreviewsound.h"
00070 #include "llpreviewtexture.h"
00071 #include "llresmgr.h"
00072 #include "llscrollcontainer.h"
00073 #include "llimview.h"
00074 #include "lltooldraganddrop.h"
00075 #include "llviewerimagelist.h"
00076 #include "llviewerinventory.h"
00077 #include "llviewerobjectlist.h"
00078 #include "llviewerwindow.h"
00079 #include "llwearable.h"
00080 #include "llwearablelist.h"
00081 #include "llviewermessage.h" 
00082 #include "llviewerregion.h"
00083 #include "lltabcontainer.h"
00084 #include "lluictrlfactory.h"
00085 #include "llselectmgr.h"
00086 
00087 const char* NEW_LSL_NAME = "New Script"; // *TODO:Translate? (probably not)
00088 const char* NEW_NOTECARD_NAME = "New Note"; // *TODO:Translate? (probably not)
00089 const char* NEW_GESTURE_NAME = "New Gesture"; // *TODO:Translate? (probably not)
00090 
00091 typedef LLMemberListener<LLPanelInventory> object_inventory_listener_t;
00092 typedef LLMemberListener<LLInventoryView> inventory_listener_t;
00093 typedef LLMemberListener<LLInventoryPanel> inventory_panel_listener_t;
00094 
00095 bool doToSelected(LLFolderView* folder, LLString action)
00096 {
00097         LLInventoryModel* model = &gInventory;
00098         if ("rename" == action)
00099         {
00100                 folder->startRenamingSelectedItem();
00101                 return true;
00102         }
00103         if ("delete" == action)
00104         {
00105                 folder->removeSelectedItems();
00106                 return true;
00107         }
00108 
00109         if ("copy" == action)
00110         {       
00111                 LLInventoryClipboard::instance().reset();
00112         }
00113 
00114         std::set<LLUUID> selected_items;
00115         folder->getSelectionList(selected_items);
00116 
00117         LLMultiPreview* multi_previewp = NULL;
00118         LLMultiProperties* multi_propertiesp = NULL;
00119 
00120         if (("task_open" == action  || "open" == action) && selected_items.size() > 1)
00121         {
00122                 S32 left, top;
00123                 gFloaterView->getNewFloaterPosition(&left, &top);
00124 
00125                 multi_previewp = new LLMultiPreview(LLRect(left, top, left + 300, top - 100));
00126                 gFloaterView->addChild(multi_previewp);
00127 
00128                 LLFloater::setFloaterHost(multi_previewp);
00129         
00130         }
00131         else if (("task_properties" == action || "properties" == action) && selected_items.size() > 1)
00132         {
00133                 S32 left, top;
00134                 gFloaterView->getNewFloaterPosition(&left, &top);
00135 
00136                 multi_propertiesp = new LLMultiProperties(LLRect(left, top, left + 100, top - 100));
00137                 gFloaterView->addChild(multi_propertiesp);
00138 
00139                 LLFloater::setFloaterHost(multi_propertiesp);
00140         }
00141 
00142         std::set<LLUUID>::iterator set_iter;
00143 
00144         for (set_iter = selected_items.begin(); set_iter != selected_items.end(); ++set_iter)
00145         {
00146                 LLFolderViewItem* folder_item = folder->getItemByID(*set_iter);
00147                 if(!folder_item) continue;
00148                 LLInvFVBridge* bridge = (LLInvFVBridge*)folder_item->getListener();
00149                 if(!bridge) continue;
00150 
00151                 bridge->performAction(folder, model, action);
00152         }
00153 
00154         LLFloater::setFloaterHost(NULL);
00155         if (multi_previewp)
00156         {
00157                 multi_previewp->open();
00158         }
00159         else if (multi_propertiesp)
00160         {
00161                 multi_propertiesp->open();              /*Flawfinder: ignore*/
00162         }
00163 
00164         return true;
00165 }
00166 
00167 class LLDoToSelectedPanel : public object_inventory_listener_t
00168 {
00169         bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
00170         {
00171                 LLString action = userdata.asString();
00172                 LLPanelInventory *panel = mPtr;
00173                 LLFolderView* folder = panel->getRootFolder();
00174                 if(!folder) return true;
00175 
00176                 return doToSelected(folder, action);
00177         }
00178 };
00179 
00180 class LLDoToSelectedFloater : public inventory_listener_t
00181 {
00182         bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
00183         {
00184                 LLString action = userdata.asString();
00185                 LLInventoryPanel *panel = mPtr->getPanel();
00186                 LLFolderView* folder = panel->getRootFolder();
00187                 if(!folder) return true;
00188 
00189                 return doToSelected(folder, action);
00190         }
00191 };
00192 
00193 class LLDoToSelected : public inventory_panel_listener_t
00194 {
00195         bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
00196         {
00197                 LLString action = userdata.asString();
00198                 LLInventoryPanel *panel = mPtr;
00199                 LLFolderView* folder = panel->getRootFolder();
00200                 if(!folder) return true;
00201 
00202                 return doToSelected(folder, action);
00203         }
00204 };
00205 
00206 class LLNewWindow : public inventory_listener_t
00207 {
00208         bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
00209         {
00210                 LLRect rect(gSavedSettings.getRect("FloaterInventoryRect"));
00211                 S32 left = 0 , top = 0;
00212                 gFloaterView->getNewFloaterPosition(&left, &top);
00213                 rect.setLeftTopAndSize(left, top, rect.getWidth(), rect.getHeight());
00214                 LLInventoryView* iv = new LLInventoryView("Inventory",
00215                                                                                                 rect,
00216                                                                                                 mPtr->getActivePanel()->getModel());
00217                 iv->getActivePanel()->setFilterTypes(mPtr->getActivePanel()->getFilterTypes());
00218                 iv->getActivePanel()->setFilterSubString(mPtr->getActivePanel()->getFilterSubString());
00219                 iv->open();             /*Flawfinder: ignore*/
00220 
00221                 // force onscreen
00222                 gFloaterView->adjustToFitScreen(iv, FALSE);
00223                 return true;
00224         }
00225 };
00226 
00227 class LLShowFilters : public inventory_listener_t
00228 {
00229         bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
00230         {
00231                 mPtr->toggleFindOptions();
00232                 return true;
00233         }
00234 };
00235 
00236 class LLResetFilter : public inventory_listener_t
00237 {
00238         bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
00239         {
00240                 LLInventoryViewFinder *finder = mPtr->getFinder();
00241                 mPtr->getActivePanel()->getFilter()->resetDefault();
00242                 if (finder)
00243                 {
00244                         finder->updateElementsFromFilter();
00245                 }
00246 
00247                 mPtr->setFilterTextFromFilter();
00248                 return true;
00249         }
00250 };
00251 
00252 class LLCloseAllFolders : public inventory_panel_listener_t
00253 {
00254         bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
00255         {
00256                 mPtr->closeAllFolders();
00257                 return true;
00258         }
00259 };
00260 
00261 class LLCloseAllFoldersFloater : public inventory_listener_t
00262 {
00263         bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
00264         {
00265                 mPtr->getPanel()->closeAllFolders();
00266                 return true;
00267         }
00268 };
00269 
00270 class LLEmptyTrash : public inventory_panel_listener_t
00271 {
00272         bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
00273         {
00274                 LLInventoryModel* model = mPtr->getModel();
00275                 if(!model) return false;
00276                 gViewerWindow->alertXml("ConfirmEmptyTrash", callback_empty_trash, this);
00277                 return true;
00278         }
00279 
00280         static void callback_empty_trash(S32 option, void* userdata)
00281         {
00282                 LLEmptyTrash* empty_trash = (LLEmptyTrash*)userdata;
00283                 if (option == 0) // YES
00284                 {
00285                         LLInventoryModel* model = empty_trash->mPtr->getModel();
00286                         LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH);
00287                         model->purgeDescendentsOf(trash_id);
00288                         model->notifyObservers();
00289                 }
00290         }
00291 };
00292 
00293 class LLEmptyLostAndFound : public inventory_panel_listener_t
00294 {
00295         bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
00296         {
00297                 LLInventoryModel* model = mPtr->getModel();
00298                 if(!model) return false;
00299                 gViewerWindow->alertXml("ConfirmEmptyLostAndFound", callback_empty_lost_and_found, this);
00300                 return true;
00301         }
00302 
00303         static void callback_empty_lost_and_found(S32 option, void* userdata)
00304         {
00305                 LLEmptyLostAndFound* empty_lost_and_found = (LLEmptyLostAndFound*)userdata;
00306                 if (option == 0) // YES
00307                 {
00308                         LLInventoryModel* model = empty_lost_and_found->mPtr->getModel();
00309                         LLUUID lost_and_found_id = model->findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND);
00310                         model->purgeDescendentsOf(lost_and_found_id);
00311                         model->notifyObservers();
00312                 }
00313         }
00314 };
00315 
00316 class LLEmptyTrashFloater : public inventory_listener_t
00317 {
00318         bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
00319         {
00320                 LLInventoryModel* model = mPtr->getPanel()->getModel();
00321                 if(!model) return false;
00322                 LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH);
00323                 model->purgeDescendentsOf(trash_id);
00324                 model->notifyObservers();
00325                 return true;
00326         }
00327 };
00328 
00329 void do_create(LLInventoryModel *model, LLInventoryPanel *ptr, LLString type, LLFolderBridge *self = NULL)
00330 {
00331         if ("category" == type)
00332         {
00333                 LLUUID category;
00334                 if (self)
00335                 {
00336                         category = model->createNewCategory(self->getUUID(), LLAssetType::AT_NONE, NULL);
00337                 }
00338                 else
00339                 {
00340                         category = model->createNewCategory(gAgent.getInventoryRootID(),
00341                                                                         LLAssetType::AT_NONE, NULL);
00342                 }
00343                 model->notifyObservers();
00344                 ptr->setSelection(category, TRUE);
00345         }
00346         else if ("lsl" == type)
00347         {
00348                 LLUUID parent_id = self ? self->getUUID() : model->findCategoryUUIDForType(LLAssetType::AT_LSL_TEXT);
00349                 ptr->createNewItem(NEW_LSL_NAME,
00350                                                         parent_id,
00351                                                         LLAssetType::AT_LSL_TEXT,
00352                                                         LLInventoryType::IT_LSL,
00353                                                         PERM_MOVE | PERM_TRANSFER);
00354         }
00355         else if ("notecard" == type)
00356         {
00357                 LLUUID parent_id = self ? self->getUUID() : model->findCategoryUUIDForType(LLAssetType::AT_NOTECARD);
00358                 ptr->createNewItem(NEW_NOTECARD_NAME,
00359                                                         parent_id,
00360                                                         LLAssetType::AT_NOTECARD,
00361                                                         LLInventoryType::IT_NOTECARD,
00362                                                         PERM_ALL);
00363         }
00364         else if ("gesture" == type)
00365         {
00366                 LLUUID parent_id = self ? self->getUUID() : model->findCategoryUUIDForType(LLAssetType::AT_GESTURE);
00367                 ptr->createNewItem(NEW_GESTURE_NAME,
00368                                                         parent_id,
00369                                                         LLAssetType::AT_GESTURE,
00370                                                         LLInventoryType::IT_GESTURE,
00371                                                         PERM_ALL);
00372         }
00373         else if ("shirt" == type)
00374         {
00375                 LLUUID parent_id = self ? self->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING);
00376                 LLFolderBridge::createWearable(parent_id, WT_SHIRT);
00377         }
00378         else if ("pants" == type)
00379         {
00380                 LLUUID parent_id = self ? self->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING);
00381                 LLFolderBridge::createWearable(parent_id, WT_PANTS);
00382         }
00383         else if ("shoes" == type)
00384         {
00385                 LLUUID parent_id = self ? self->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING);
00386                 LLFolderBridge::createWearable(parent_id, WT_SHOES);
00387         }
00388         else if ("socks" == type)
00389         {
00390                 LLUUID parent_id = self ? self->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING);
00391                 LLFolderBridge::createWearable(parent_id, WT_SOCKS);
00392         }
00393         else if ("jacket" == type)
00394         {
00395                 LLUUID parent_id = self ? self->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING);
00396                 LLFolderBridge::createWearable(parent_id, WT_JACKET);
00397         }
00398         else if ("skirt" == type)
00399         {
00400                 LLUUID parent_id = self ? self->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING);
00401                 LLFolderBridge::createWearable(parent_id, WT_SKIRT);
00402         }
00403         else if ("gloves" == type)
00404         {
00405                 LLUUID parent_id = self ? self->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING);
00406                 LLFolderBridge::createWearable(parent_id, WT_GLOVES);
00407         }
00408         else if ("undershirt" == type)
00409         {
00410                 LLUUID parent_id = self ? self->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING);
00411                 LLFolderBridge::createWearable(parent_id, WT_UNDERSHIRT);
00412         }
00413         else if ("underpants" == type)
00414         {
00415                 LLUUID parent_id = self ? self->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING);
00416                 LLFolderBridge::createWearable(parent_id, WT_UNDERPANTS);
00417         }
00418         else if ("shape" == type)
00419         {
00420                 LLUUID parent_id = self ? self->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_BODYPART);
00421                 LLFolderBridge::createWearable(parent_id, WT_SHAPE);
00422         }
00423         else if ("skin" == type)
00424         {
00425                 LLUUID parent_id = self ? self->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_BODYPART);
00426                 LLFolderBridge::createWearable(parent_id, WT_SKIN);
00427         }
00428         else if ("hair" == type)
00429         {
00430                 LLUUID parent_id = self ? self->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_BODYPART);
00431                 LLFolderBridge::createWearable(parent_id, WT_HAIR);
00432         }
00433         else if ("eyes" == type)
00434         {
00435                 LLUUID parent_id = self ? self->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_BODYPART);
00436                 LLFolderBridge::createWearable(parent_id, WT_EYES);
00437         }
00438         
00439         ptr->getRootFolder()->setNeedsAutoRename(TRUE); 
00440 }
00441 
00442 class LLDoCreate : public inventory_panel_listener_t
00443 {
00444         bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
00445         {
00446                 LLInventoryModel* model = mPtr->getModel();
00447                 if(!model) return false;
00448                 LLString type = userdata.asString();
00449                 do_create(model, mPtr, type, LLFolderBridge::sSelf);
00450                 return true;
00451         }
00452 };
00453 
00454 class LLDoCreateFloater : public inventory_listener_t
00455 {
00456         bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
00457         {
00458                 LLInventoryModel* model = mPtr->getPanel()->getModel();
00459                 if(!model) return false;
00460                 LLString type = userdata.asString();
00461                 do_create(model, mPtr->getPanel(), type);
00462                 return true;
00463         }
00464 };
00465 
00466 class LLSetSortBy : public inventory_listener_t
00467 {
00468         bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
00469         {
00470                 LLString sort_field = userdata.asString();
00471                 if (sort_field == "name")
00472                 {
00473                         U32 order = mPtr->getActivePanel()->getSortOrder();
00474                         mPtr->getActivePanel()->setSortOrder( order & ~LLInventoryFilter::SO_DATE );
00475                         
00476                         mPtr->getControl("Inventory.SortByName")->setValue( TRUE );
00477                         mPtr->getControl("Inventory.SortByDate")->setValue( FALSE );
00478                 }
00479                 else if (sort_field == "date")
00480                 {
00481                         U32 order = mPtr->getActivePanel()->getSortOrder();
00482                         mPtr->getActivePanel()->setSortOrder( order | LLInventoryFilter::SO_DATE );
00483 
00484                         mPtr->getControl("Inventory.SortByName")->setValue( FALSE );
00485                         mPtr->getControl("Inventory.SortByDate")->setValue( TRUE );
00486                 }
00487                 else if (sort_field == "foldersalwaysbyname")
00488                 {
00489                         U32 order = mPtr->getActivePanel()->getSortOrder();
00490                         if ( order & LLInventoryFilter::SO_FOLDERS_BY_NAME )
00491                         {
00492                                 order &= ~LLInventoryFilter::SO_FOLDERS_BY_NAME;
00493 
00494                                 mPtr->getControl("Inventory.FoldersAlwaysByName")->setValue( FALSE );
00495                         }
00496                         else
00497                         {
00498                                 order |= LLInventoryFilter::SO_FOLDERS_BY_NAME;
00499 
00500                                 mPtr->getControl("Inventory.FoldersAlwaysByName")->setValue( TRUE );
00501                         }
00502                         mPtr->getActivePanel()->setSortOrder( order );
00503                 }
00504                 else if (sort_field == "systemfolderstotop")
00505                 {
00506                         U32 order = mPtr->getActivePanel()->getSortOrder();
00507                         if ( order & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP )
00508                         {
00509                                 order &= ~LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP;
00510 
00511                                 mPtr->getControl("Inventory.SystemFoldersToTop")->setValue( FALSE );
00512                         }
00513                         else
00514                         {
00515                                 order |= LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP;
00516 
00517                                 mPtr->getControl("Inventory.SystemFoldersToTop")->setValue( TRUE );
00518                         }
00519                         mPtr->getActivePanel()->setSortOrder( order );
00520                 }
00521 
00522                 return true;
00523         }
00524 };
00525 
00526 class LLBeginIMSession : public inventory_panel_listener_t
00527 {
00528         bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
00529         {
00530                 LLInventoryPanel *panel = mPtr;
00531                 LLInventoryModel* model = panel->getModel();
00532                 if(!model) return true;
00533                 std::set<LLUUID> selected_items;
00534                 panel->getRootFolder()->getSelectionList(selected_items);
00535 
00536                 LLString name;
00537                 static int session_num = 1;
00538 
00539                 LLDynamicArray<LLUUID> members;
00540                 EInstantMessage type = IM_SESSION_CONFERENCE_START;
00541 
00542                 std::set<LLUUID>::const_iterator iter;
00543                 for (iter = selected_items.begin(); iter != selected_items.end(); iter++)
00544                 {
00545 
00546                         LLUUID item = *iter;
00547                         LLFolderViewItem* folder_item = panel->getRootFolder()->getItemByID(item);
00548                         
00549                         if(folder_item) 
00550                         {
00551                                 LLFolderViewEventListener* fve_listener = folder_item->getListener();
00552                                 if (fve_listener && (fve_listener->getInventoryType() == LLInventoryType::IT_CATEGORY))
00553                                 {
00554 
00555                                         LLFolderBridge* bridge = (LLFolderBridge*)folder_item->getListener();
00556                                         if(!bridge) return true;
00557                                         LLViewerInventoryCategory* cat = bridge->getCategory();
00558                                         if(!cat) return true;
00559                                         name = cat->getName();
00560                                         LLUniqueBuddyCollector is_buddy;
00561                                         LLInventoryModel::cat_array_t cat_array;
00562                                         LLInventoryModel::item_array_t item_array;
00563                                         model->collectDescendentsIf(bridge->getUUID(),
00564                                                                                                 cat_array,
00565                                                                                                 item_array,
00566                                                                                                 LLInventoryModel::EXCLUDE_TRASH,
00567                                                                                                 is_buddy);
00568                                         S32 count = item_array.count();
00569                                         if(count > 0)
00570                                         {
00571                                                 // create the session
00572                                                 gIMMgr->setFloaterOpen(TRUE);
00573                                                 S32 i;
00574                                                 
00575                                                 LLAvatarTracker& at = LLAvatarTracker::instance();
00576                                                 LLUUID id;
00577                                                 for(i = 0; i < count; ++i)
00578                                                 {
00579                                                         id = item_array.get(i)->getCreatorUUID();
00580                                                         if(at.isBuddyOnline(id))
00581                                                         {
00582                                                                 members.put(id);
00583                                                         }
00584                                                 }
00585                                         }
00586                                 }
00587                                 else
00588                                 {
00589                                         LLFolderViewItem* folder_item = panel->getRootFolder()->getItemByID(item);
00590                                         if(!folder_item) return true;
00591                                         LLInvFVBridge* listenerp = (LLInvFVBridge*)folder_item->getListener();
00592 
00593                                         if (listenerp->getInventoryType() == LLInventoryType::IT_CALLINGCARD)
00594                                         {
00595                                                 LLInventoryItem* inv_item = gInventory.getItem(listenerp->getUUID());
00596 
00597                                                 if (inv_item)
00598                                                 {
00599                                                         LLAvatarTracker& at = LLAvatarTracker::instance();
00600                                                         LLUUID id = inv_item->getCreatorUUID();
00601 
00602                                                         if(at.isBuddyOnline(id))
00603                                                         {
00604                                                                 members.put(id);
00605                                                         }
00606                                                 }
00607                                         } //if IT_CALLINGCARD
00608                                 } //if !IT_CATEGORY
00609                         }
00610                 } //for selected_items  
00611 
00612                 // the session_id is randomly generated UUID which will be replaced later
00613                 // with a server side generated number
00614 
00615                 if (name.empty())
00616                 {
00617                         char buffer [50];
00618                         sprintf(buffer, "Session %d", session_num++);
00619                         name = buffer;
00620                 }
00621 
00622 
00623                 gIMMgr->addSession(
00624                         name,
00625                         type,
00626                         members[0],
00627                         members);
00628                 
00629                 return true;
00630         }
00631 };
00632 
00633 void rez_attachment(LLViewerInventoryItem* item, LLViewerJointAttachment* attachment);
00634 
00635 class LLAttachObject : public inventory_panel_listener_t
00636 {
00637         bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
00638         {
00639                 LLInventoryPanel *panel = mPtr;
00640                 LLFolderView* folder = panel->getRootFolder();
00641                 if(!folder) return true;
00642 
00643                 std::set<LLUUID> selected_items;
00644                 folder->getSelectionList(selected_items);
00645                 LLUUID id = *selected_items.begin();
00646 
00647                 LLString joint_name = userdata.asString();
00648                 LLVOAvatar *avatarp = gAgent.getAvatarObject();
00649                 LLViewerJointAttachment* attachmentp = NULL;
00650                 for (LLVOAvatar::attachment_map_t::iterator iter = avatarp->mAttachmentPoints.begin(); 
00651                          iter != avatarp->mAttachmentPoints.end(); )
00652                 {
00653                         LLVOAvatar::attachment_map_t::iterator curiter = iter++;
00654                         LLViewerJointAttachment* attachment = curiter->second;
00655                         if (attachment->getName() == joint_name)
00656                         {
00657                                 attachmentp = attachment;
00658                                 break;
00659                         }
00660                 }
00661                 if (attachmentp == NULL)
00662                 {
00663                         return true;
00664                 }
00665                 LLViewerInventoryItem* item = (LLViewerInventoryItem*)gInventory.getItem(id);
00666 
00667                 if(item && gInventory.isObjectDescendentOf(id, gAgent.getInventoryRootID()))
00668                 {
00669                         rez_attachment(item, attachmentp);
00670                 }
00671                 else if(item && item->isComplete())
00672                 {
00673                         // must be in library. copy it to our inventory and put it on.
00674                         LLPointer<LLInventoryCallback> cb = new RezAttachmentCallback(attachmentp);
00675                         copy_inventory_item(
00676                                 gAgent.getID(),
00677                                 item->getPermissions().getOwner(),
00678                                 item->getUUID(),
00679                                 LLUUID::null,
00680                                 std::string(),
00681                                 cb);
00682                 }
00683                 gFocusMgr.setKeyboardFocus(NULL);
00684 
00685                 return true;
00686         }
00687 };
00688 
00689 /*
00690 class LL : public listener_t
00691 {
00692         bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
00693         {
00694                 return true;
00695         }
00696 };
00697 */
00698 
00699 void init_object_inventory_panel_actions(LLPanelInventory *panel)
00700 {
00701         (new LLDoToSelectedPanel())->registerListener(panel, "Inventory.DoToSelected");
00702 }
00703 
00704 void init_inventory_actions(LLInventoryView *floater)
00705 {
00706         (new LLDoToSelectedFloater())->registerListener(floater, "Inventory.DoToSelected");
00707         (new LLCloseAllFoldersFloater())->registerListener(floater, "Inventory.CloseAllFolders");
00708         (new LLEmptyTrashFloater())->registerListener(floater, "Inventory.EmptyTrash");
00709         (new LLDoCreateFloater())->registerListener(floater, "Inventory.DoCreate");
00710 
00711         (new LLNewWindow())->registerListener(floater, "Inventory.NewWindow");
00712         (new LLShowFilters())->registerListener(floater, "Inventory.ShowFilters");
00713         (new LLResetFilter())->registerListener(floater, "Inventory.ResetFilter");
00714         (new LLSetSortBy())->registerListener(floater, "Inventory.SetSortBy");
00715 }
00716 
00717 void init_inventory_panel_actions(LLInventoryPanel *panel)
00718 {
00719         (new LLDoToSelected())->registerListener(panel, "Inventory.DoToSelected");
00720         (new LLAttachObject())->registerListener(panel, "Inventory.AttachObject");
00721         (new LLCloseAllFolders())->registerListener(panel, "Inventory.CloseAllFolders");
00722         (new LLEmptyTrash())->registerListener(panel, "Inventory.EmptyTrash");
00723         (new LLEmptyLostAndFound())->registerListener(panel, "Inventory.EmptyLostAndFound");
00724         (new LLDoCreate())->registerListener(panel, "Inventory.DoCreate");
00725         (new LLBeginIMSession())->registerListener(panel, "Inventory.BeginIMSession");
00726 }

Generated on Fri May 16 08:33:41 2008 for SecondLife by  doxygen 1.5.5