00001
00032 #include "llviewerprecompiledheaders.h"
00033
00034 #include <utility>
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"
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";
00088 const char* NEW_NOTECARD_NAME = "New Note";
00089 const char* NEW_GESTURE_NAME = "New Gesture";
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();
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();
00220
00221
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)
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)
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
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 }
00608 }
00609 }
00610 }
00611
00612
00613
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
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
00691
00692
00693
00694
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 }