00001
00032 #include "llviewerprecompiledheaders.h"
00033
00034 #include "llviewermenu.h"
00035
00036
00037 #include <iostream>
00038 #include <fstream>
00039 #include <sstream>
00040
00041
00042 #include "audioengine.h"
00043 #include "indra_constants.h"
00044 #include "llassetstorage.h"
00045 #include "llchat.h"
00046 #include "llfeaturemanager.h"
00047 #include "llfocusmgr.h"
00048 #include "llfontgl.h"
00049 #include "llinstantmessage.h"
00050 #include "llpermissionsflags.h"
00051 #include "llrect.h"
00052 #include "llsecondlifeurls.h"
00053 #include "lltransactiontypes.h"
00054 #include "llui.h"
00055 #include "llview.h"
00056 #include "llxfermanager.h"
00057 #include "message.h"
00058 #include "raytrace.h"
00059 #include "llsdserialize.h"
00060 #include "lltimer.h"
00061 #include "llvfile.h"
00062 #include "llvolumemgr.h"
00063 #include "llwindow.h"
00064
00065
00066 #include "llagent.h"
00067
00068 #include "llagentpilot.h"
00069 #include "llbox.h"
00070 #include "llcallingcard.h"
00071 #include "llcameraview.h"
00072 #include "llclipboard.h"
00073 #include "llcompilequeue.h"
00074 #include "llconsole.h"
00075 #include "llviewercontrol.h"
00076 #include "lldebugview.h"
00077 #include "lldir.h"
00078 #include "lldrawable.h"
00079 #include "lldrawpoolalpha.h"
00080 #include "lldrawpooltree.h"
00081 #include "llface.h"
00082 #include "llfirstuse.h"
00083 #include "llfloater.h"
00084 #include "llfloaterabout.h"
00085 #include "llfloaterbuycurrency.h"
00086 #include "llfloateractivespeakers.h"
00087 #include "llfloateranimpreview.h"
00088 #include "llfloateravatarinfo.h"
00089 #include "llfloateravatartextures.h"
00090 #include "llfloaterbuildoptions.h"
00091 #include "llfloaterbump.h"
00092 #include "llfloaterbuy.h"
00093 #include "llfloaterbuycontents.h"
00094 #include "llfloaterbuycurrency.h"
00095 #include "llfloaterbuyland.h"
00096 #include "llfloaterchat.h"
00097 #include "llfloatercustomize.h"
00098 #include "llfloaterdirectory.h"
00099 #include "llfloatereditui.h"
00100 #include "llfloatereventlog.h"
00101 #include "llfloaterchatterbox.h"
00102 #include "llfloaterfriends.h"
00103 #include "llfloatergesture.h"
00104 #include "llfloatergodtools.h"
00105 #include "llfloatergroupinfo.h"
00106 #include "llfloatergroupinvite.h"
00107 #include "llfloatergroups.h"
00108 #include "llfloaterhtml.h"
00109 #include "llfloaterhtmlhelp.h"
00110 #include "llfloaterinspect.h"
00111 #include "llfloaterlagmeter.h"
00112 #include "llfloaterland.h"
00113 #include "llfloaterlandholdings.h"
00114 #include "llfloatermap.h"
00115 #include "llfloatermute.h"
00116 #include "llfloateropenobject.h"
00117 #include "llfloaterpermissionsmgr.h"
00118 #include "llfloaterpreference.h"
00119 #include "llfloaterproject.h"
00120 #include "llfloaterregioninfo.h"
00121 #include "llfloaterreporter.h"
00122 #include "llfloaterscriptdebug.h"
00123 #include "llfloatertest.h"
00124 #include "llfloatertools.h"
00125 #include "llfloatertrustnetrate.h"
00126 #include "llfloaterworldmap.h"
00127 #include "llframestats.h"
00128 #include "llframestatview.h"
00129 #include "llfasttimerview.h"
00130 #include "llmemoryview.h"
00131 #include "llgivemoney.h"
00132 #include "llgroupmgr.h"
00133 #include "llhoverview.h"
00134 #include "llhudeffecttrail.h"
00135 #include "llhudmanager.h"
00136 #include "llimage.h"
00137 #include "llimagebmp.h"
00138 #include "llimagej2c.h"
00139 #include "llimagetga.h"
00140 #include "llinventorymodel.h"
00141 #include "llinventoryview.h"
00142 #include "llkeyboard.h"
00143 #include "llpanellogin.h"
00144 #include "llfloaterlandmark.h"
00145 #include "llmenucommands.h"
00146 #include "llmenugl.h"
00147 #include "llmorphview.h"
00148 #include "llmoveview.h"
00149 #include "llmutelist.h"
00150 #include "llnotify.h"
00151 #include "llpanelobject.h"
00152 #include "llparcel.h"
00153 #include "llprimitive.h"
00154 #include "llresmgr.h"
00155 #include "llselectmgr.h"
00156 #include "llsky.h"
00157 #include "llstatusbar.h"
00158 #include "llstatview.h"
00159 #include "llstring.h"
00160 #include "llsurfacepatch.h"
00161 #include "llimview.h"
00162 #include "lltextureview.h"
00163 #include "lltool.h"
00164 #include "lltoolbar.h"
00165 #include "lltoolcomp.h"
00166 #include "lltoolfocus.h"
00167 #include "lltoolgrab.h"
00168 #include "lltoolmgr.h"
00169 #include "lltoolpie.h"
00170 #include "lltoolplacer.h"
00171 #include "lltoolselectland.h"
00172 #include "llvieweruictrlfactory.h"
00173 #include "lluploaddialog.h"
00174 #include "lluserauth.h"
00175 #include "lluuid.h"
00176 #include "llvelocitybar.h"
00177 #include "llviewercamera.h"
00178 #include "llviewergenericmessage.h"
00179 #include "llviewergesture.h"
00180 #include "llviewerinventory.h"
00181 #include "llviewermenufile.h"
00182 #include "llviewermessage.h"
00183 #include "llviewernetwork.h"
00184 #include "llviewerobjectlist.h"
00185 #include "llviewerparcelmgr.h"
00186 #include "llviewerparceloverlay.h"
00187 #include "llviewerregion.h"
00188 #include "llviewerstats.h"
00189 #include "llviewerwindow.h"
00190 #include "llvoavatar.h"
00191 #include "llvolume.h"
00192 #include "llweb.h"
00193 #include "llworld.h"
00194 #include "llworldmap.h"
00195 #include "object_flags.h"
00196 #include "pipeline.h"
00197 #include "viewer.h"
00198 #include "roles_constants.h"
00199 #include "llfloateravatarlist.h"
00200 #include "llviewerjoystick.h"
00201
00202 #include "lltexlayer.h"
00203
00204 void init_landmark_menu(LLMenuGL* menu);
00205 void clear_landmark_menu(LLMenuGL* menu);
00206
00207 void init_client_menu(LLMenuGL* menu);
00208 void init_server_menu(LLMenuGL* menu);
00209
00210 void init_debug_world_menu(LLMenuGL* menu);
00211 void init_debug_rendering_menu(LLMenuGL* menu);
00212 void init_debug_ui_menu(LLMenuGL* menu);
00213 void init_debug_xui_menu(LLMenuGL* menu);
00214 void init_debug_avatar_menu(LLMenuGL* menu);
00215 void init_debug_baked_texture_menu(LLMenuGL* menu);
00216
00217 BOOL enable_land_build(void*);
00218 BOOL enable_object_build(void*);
00219
00220 LLVOAvatar* find_avatar_from_object( LLViewerObject* object );
00221 LLVOAvatar* find_avatar_from_object( const LLUUID& object_id );
00222
00223 void handle_test_load_url(void*);
00224
00225 extern void disconnect_viewer(void *);
00226
00227
00228
00229
00230 extern BOOL gRenderLightGlows;
00231 extern BOOL gRenderAvatar;
00232 extern BOOL gHideSelectedObjects;
00233 extern BOOL gShowOverlayTitle;
00234 extern BOOL gRandomizeFramerate;
00235 extern BOOL gPeriodicSlowFrame;
00236 extern BOOL gOcclusionCull;
00237 extern BOOL gAllowSelectAvatar;
00238
00239
00240
00241
00242
00243 LLMenuBarGL *gMenuBarView = NULL;
00244 LLViewerMenuHolderGL *gMenuHolder = NULL;
00245 LLMenuGL *gPopupMenuView = NULL;
00246
00247
00248 LLPieMenu *gPieSelf = NULL;
00249 LLPieMenu *gPieAvatar = NULL;
00250 LLPieMenu *gPieObject = NULL;
00251 LLPieMenu *gPieAttachment = NULL;
00252 LLPieMenu *gPieLand = NULL;
00253
00254
00255 const LLString LANDMARK_MENU_NAME("Landmarks");
00256 const LLString CLIENT_MENU_NAME("Client");
00257 const LLString SERVER_MENU_NAME("Server");
00258
00259 const LLString SAVE_INTO_INVENTORY("Save Object Back to My Inventory");
00260 const LLString SAVE_INTO_TASK_INVENTORY("Save Object Back to Object Contents");
00261
00262 #if LL_WINDOWS
00263 static const char* SOUND_EXTENSIONS = ".wav";
00264 static const char* IMAGE_EXTENSIONS = ".tga .bmp .jpg .jpeg .png";
00265 static const char* ANIM_EXTENSIONS = ".bvh";
00266 #ifdef _CORY_TESTING
00267 static const char* GEOMETRY_EXTENSIONS = ".slg";
00268 #endif
00269 static const char* XML_EXTENSIONS = ".xml";
00270 static const char* SLOBJECT_EXTENSIONS = ".slobject";
00271 #endif
00272 static const char* ALL_FILE_EXTENSIONS = "*.*";
00273
00274 LLMenuGL* gAttachSubMenu = NULL;
00275 LLMenuGL* gDetachSubMenu = NULL;
00276 LLMenuGL* gTakeOffClothes = NULL;
00277 LLPieMenu* gPieRate = NULL;
00278 LLPieMenu* gAttachScreenPieMenu = NULL;
00279 LLPieMenu* gAttachPieMenu = NULL;
00280 LLPieMenu* gAttachBodyPartPieMenus[8];
00281 LLPieMenu* gDetachPieMenu = NULL;
00282 LLPieMenu* gDetachScreenPieMenu = NULL;
00283 LLPieMenu* gDetachBodyPartPieMenus[8];
00284
00285 LLMenuGL* gLandmarkMenu = NULL;
00286 LLMenuItemCallGL* gAFKMenu = NULL;
00287 LLMenuItemCallGL* gBusyMenu = NULL;
00288
00289 typedef LLMemberListener<LLView> view_listener_t;
00290
00291
00292
00293
00294 void handle_leave_group(void *);
00295
00296
00297 const char* upload_pick(void* data);
00298 void handle_upload(void* data);
00299
00300 void handle_compress_image(void*);
00301 BOOL enable_save_as(void *);
00302
00303
00304 void handle_dump_group_info(void *);
00305 void handle_dump_capabilities_info(void *);
00306 void handle_dump_focus(void*);
00307
00308 void handle_region_dump_settings(void*);
00309 void handle_region_dump_temp_asset_data(void*);
00310 void handle_region_clear_temp_asset_data(void*);
00311
00312
00313 BOOL sitting_on_selection();
00314
00315 void near_sit_object();
00316 void label_sit_or_stand(LLString& label, void*);
00317
00318
00319 BOOL is_selection_buy_not_take();
00320 S32 selection_price();
00321 BOOL enable_take();
00322 void handle_take();
00323 void confirm_take(S32 option, void* data);
00324 BOOL enable_buy(void*);
00325 void handle_buy(void *);
00326 void handle_buy_object(LLSaleInfo sale_info);
00327 void handle_buy_contents(LLSaleInfo sale_info);
00328 void label_touch(LLString& label, void*);
00329
00330
00331 void near_sit_down_point(BOOL success, void *);
00332
00333
00334 void handle_follow(void *userdata);
00335 void handle_talk_to(void *userdata);
00336
00337
00338 void show_permissions_control(void*);
00339 void load_url_local_file(const char* file_name);
00340 void toggle_build_options(void* user_data);
00341 #if 0 // Unused
00342 void handle_audio_status_1(void*);
00343 void handle_audio_status_2(void*);
00344 void handle_audio_status_3(void*);
00345 void handle_audio_status_4(void*);
00346 #endif
00347 void manage_landmarks(void*);
00348 void create_new_landmark(void*);
00349 void landmark_menu_action(void*);
00350 void reload_ui(void*);
00351 void handle_agent_stop_moving(void*);
00352 void print_packets_lost(void*);
00353 void drop_packet(void*);
00354 void velocity_interpolate( void* data );
00355 void update_fov(S32 increments);
00356 void toggle_wind_audio(void);
00357 void toggle_water_audio(void);
00358 void handle_rebake_textures(void*);
00359 BOOL check_admin_override(void*);
00360 void handle_admin_override_toggle(void*);
00361 #ifdef TOGGLE_HACKED_GODLIKE_VIEWER
00362 void handle_toggle_hacked_godmode(void*);
00363 BOOL check_toggle_hacked_godmode(void*);
00364 #endif
00365
00366 void toggle_glow(void *);
00367 BOOL check_glow(void *);
00368
00369 void toggle_vertex_shaders(void *);
00370 BOOL check_vertex_shaders(void *);
00371
00372 void toggle_cull_small(void *);
00373
00374 void toggle_show_xui_names(void *);
00375 BOOL check_show_xui_names(void *);
00376
00377
00378 void handle_web_search_demo(void*);
00379 void handle_slurl_test(void*);
00380 void handle_save_to_xml(void*);
00381 void handle_load_from_xml(void*);
00382
00383 void handle_god_mode(void*);
00384
00385
00386 void handle_leave_god_mode(void*);
00387
00388 BOOL is_inventory_visible( void* user_data );
00389 void handle_reset_view();
00390
00391 void disabled_duplicate(void*);
00392 void handle_duplicate_in_place(void*);
00393 void handle_repeat_duplicate(void*);
00394
00395 void handle_export(void*);
00396 void handle_deed_object_to_group(void*);
00397 BOOL enable_deed_object_to_group(void*);
00398 void handle_object_owner_self(void*);
00399 void handle_object_owner_permissive(void*);
00400 void handle_object_lock(void*);
00401 void handle_object_asset_ids(void*);
00402 void force_take_copy(void*);
00403 #ifdef _CORY_TESTING
00404 void force_export_copy(void*);
00405 void force_import_geometry(void*);
00406 #endif
00407
00408 void handle_force_parcel_owner_to_me(void*);
00409 void handle_force_parcel_to_content(void*);
00410 void handle_claim_public_land(void*);
00411
00412 void handle_god_request_havok(void *);
00413 void handle_god_request_avatar_geometry(void *);
00414 void reload_personal_settings_overrides(void *);
00415 void force_breakpoint(void *);
00416 void reload_vertex_shader(void *);
00417 void slow_mo_animations(void *);
00418 void handle_disconnect_viewer(void *);
00419
00420 void handle_stopall(void*);
00421
00422
00423
00424
00425
00426 BOOL enable_dehinge(void*);
00427 void handle_force_delete(void*);
00428 void print_object_info(void*);
00429 void show_debug_menus();
00430 void toggle_debug_menus(void*);
00431 void toggle_map( void* user_data );
00432 void export_info_callback(LLAssetInfo *info, void **user_data, S32 result);
00433 void export_data_callback(LLVFS *vfs, const LLUUID& uuid, LLAssetType::EType type, void **user_data, S32 result);
00434 void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExtStat ext_status);
00435 BOOL menu_check_build_tool( void* user_data );
00436 void handle_reload_settings(void*);
00437 void focus_here(void*);
00438 void dump_select_mgr(void*);
00439 void dump_volume_mgr(void*);
00440 void dump_inventory(void*);
00441 void edit_ui(void*);
00442 void toggle_visibility(void*);
00443 BOOL get_visibility(void*);
00444
00445
00446 void request_friendship(const LLUUID& agent_id);
00447
00448
00449 void handle_force_unlock(void*);
00450 void handle_selected_texture_info(void*);
00451 void handle_dump_image_list(void*);
00452
00453 void handle_fullscreen_debug(void*);
00454 void handle_crash(void*);
00455 void handle_dump_followcam(void*);
00456 void handle_toggle_flycam(void*);
00457 BOOL check_flycam(void*);
00458 void handle_viewer_enable_message_log(void*);
00459 void handle_viewer_disable_message_log(void*);
00460 void handle_send_postcard(void*);
00461 void handle_gestures_old(void*);
00462 void handle_focus(void *);
00463 BOOL enable_buy_land(void*);
00464 void handle_move(void*);
00465 void handle_show_inventory(void*);
00466 void handle_activate(void*);
00467 BOOL enable_activate(void*);
00468
00469
00470 void handle_buy_currency(void*);
00471
00472 void handle_test_male(void *);
00473 void handle_test_female(void *);
00474 void handle_toggle_pg(void*);
00475 void handle_dump_attachments(void *);
00476 void handle_show_overlay_title(void*);
00477 void handle_dump_avatar_local_textures(void*);
00478 void handle_debug_avatar_textures(void*);
00479 void handle_grab_texture(void*);
00480 BOOL enable_grab_texture(void*);
00481 void handle_dump_region_object_cache(void*);
00482
00483 BOOL menu_ui_enabled(void *user_data);
00484 void check_toggle_control( LLUICtrl *, void* user_data );
00485 BOOL menu_check_control( void* user_data);
00486 void menu_toggle_variable( void* user_data );
00487 BOOL menu_check_variable( void* user_data);
00488 BOOL enable_land_selected( void* );
00489 BOOL enable_more_than_one_selected(void* );
00490 BOOL enable_selection_you_own_all(void*);
00491 BOOL enable_selection_you_own_one(void*);
00492 BOOL enable_save_into_inventory(void*);
00493 BOOL enable_save_into_task_inventory(void*);
00494 BOOL enable_not_thirdperson(void*);
00495 BOOL enable_export_selected(void *);
00496 BOOL enable_have_card(void*);
00497 BOOL enable_detach(void*);
00498 BOOL enable_region_owner(void*);
00499
00500 class LLLandmarkObserver : public LLInventoryObserver
00501 {
00502 public:
00503 LLLandmarkObserver();
00504 virtual ~LLLandmarkObserver();
00505
00506 virtual void changed(U32 mask)
00507 {
00508
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527
00528
00529 }
00530 };
00531
00532
00533
00534 void build_landmark_menu(void*)
00535 {
00536 init_landmark_menu(gLandmarkMenu);
00537 }
00538
00539 LLLandmarkObserver::LLLandmarkObserver()
00540 {
00541 gInventory.addObserver(this);
00542 }
00543
00544 LLLandmarkObserver::~LLLandmarkObserver()
00545 {
00546 gInventory.removeObserver(this);
00547 }
00548
00549 class LLMenuParcelObserver : public LLParcelObserver
00550 {
00551 public:
00552 LLMenuParcelObserver();
00553 ~LLMenuParcelObserver();
00554 virtual void changed();
00555 };
00556
00557 static LLMenuParcelObserver* gMenuParcelObserver = NULL;
00558 static LLLandmarkObserver* gLandmarkObserver = NULL;
00559
00560 LLMenuParcelObserver::LLMenuParcelObserver()
00561 {
00562 gParcelMgr->addObserver(this);
00563 }
00564
00565 LLMenuParcelObserver::~LLMenuParcelObserver()
00566 {
00567 gParcelMgr->removeObserver(this);
00568 }
00569
00570 void LLMenuParcelObserver::changed()
00571 {
00572 gMenuHolder->childSetEnabled("Land Buy Pass", LLPanelLandGeneral::enableBuyPass(NULL));
00573
00574 BOOL buyable = enable_buy_land(NULL);
00575 gMenuHolder->childSetEnabled("Land Buy", buyable);
00576 gMenuHolder->childSetEnabled("Buy Land...", buyable);
00577 }
00578
00579
00580
00581
00582
00583
00584
00585 void pre_init_menus()
00586 {
00587
00588 LLColor4 color;
00589 color = gColors.getColor( "MenuDefaultBgColor" );
00590 LLMenuGL::setDefaultBackgroundColor( color );
00591 color = gColors.getColor( "MenuItemEnabledColor" );
00592 LLMenuItemGL::setEnabledColor( color );
00593 color = gColors.getColor( "MenuItemDisabledColor" );
00594 LLMenuItemGL::setDisabledColor( color );
00595 color = gColors.getColor( "MenuItemHighlightBgColor" );
00596 LLMenuItemGL::setHighlightBGColor( color );
00597 color = gColors.getColor( "MenuItemHighlightFgColor" );
00598 LLMenuItemGL::setHighlightFGColor( color );
00599 }
00600
00601 void initialize_menus();
00602
00603
00604
00605
00606
00607
00608
00609
00610
00611
00612
00613
00614 void init_menus()
00615 {
00616 S32 top = gViewerWindow->getRootView()->getRect().getHeight();
00617 S32 width = gViewerWindow->getRootView()->getRect().getWidth();
00618
00619
00620
00621
00622 gMenuHolder = new LLViewerMenuHolderGL();
00623 gMenuHolder->setRect(LLRect(0, top, width, 0));
00624 gMenuHolder->setFollowsAll();
00625
00626 LLMenuGL::sMenuContainer = gMenuHolder;
00627
00628
00629 initialize_menus();
00630
00636
00637 gPopupMenuView = new LLMenuGL( "Popup" );
00638 gPopupMenuView->setVisible( FALSE );
00639 gMenuHolder->addChild( gPopupMenuView );
00640
00644 gPieSelf = gUICtrlFactory->buildPieMenu("menu_pie_self.xml", gMenuHolder);
00645
00646
00647 gDetachScreenPieMenu = (LLPieMenu*)gMenuHolder->getChildByName("Object Detach HUD", true);
00648 gDetachPieMenu = (LLPieMenu*)gMenuHolder->getChildByName("Object Detach", true);
00649
00650 if (gAgent.isTeen())
00651 {
00652 gMenuHolder->getChildByName("Self Underpants", TRUE)->setVisible(FALSE);
00653 gMenuHolder->getChildByName("Self Undershirt", TRUE)->setVisible(FALSE);
00654 }
00655
00656 gPieAvatar = gUICtrlFactory->buildPieMenu("menu_pie_avatar.xml", gMenuHolder);
00657
00658 gPieObject = gUICtrlFactory->buildPieMenu("menu_pie_object.xml", gMenuHolder);
00659
00660 gAttachScreenPieMenu = (LLPieMenu*)gMenuHolder->getChildByName("Object Attach HUD", true);
00661 gAttachPieMenu = (LLPieMenu*)gMenuHolder->getChildByName("Object Attach", true);
00662 gPieRate = (LLPieMenu*)gMenuHolder->getChildByName("Rate Menu", true);
00663
00664 gPieAttachment = gUICtrlFactory->buildPieMenu("menu_pie_attachment.xml", gMenuHolder);
00665
00666 gPieLand = gUICtrlFactory->buildPieMenu("menu_pie_land.xml", gMenuHolder);
00667
00671 LLColor4 color;
00672
00673 LLColor4 pie_color = gColors.getColor("PieMenuBgColor");
00674 gPieSelf->setBackgroundColor( pie_color );
00675 gPieAvatar->setBackgroundColor( pie_color );
00676 gPieObject->setBackgroundColor( pie_color );
00677 gPieAttachment->setBackgroundColor( pie_color );
00678 gPieLand->setBackgroundColor( pie_color );
00679
00680 color = gColors.getColor( "MenuPopupBgColor" );
00681 gPopupMenuView->setBackgroundColor( color );
00682
00683
00684 if (gInProductionGrid)
00685 {
00686 color = gColors.getColor( "MenuBarBgColor" );
00687 }
00688 else
00689 {
00690 color = gColors.getColor( "MenuNonProductionBgColor" );
00691 }
00692 gMenuBarView = (LLMenuBarGL*)gUICtrlFactory->buildMenu("menu_viewer.xml", gMenuHolder);
00693 gMenuBarView->setRect(LLRect(0, top, 0, top - MENU_BAR_HEIGHT));
00694 gMenuBarView->setBackgroundColor( color );
00695
00696 gMenuHolder->addChild(gMenuBarView);
00697
00698
00699
00700 gViewerWindow->getRootView()->addChild(gMenuHolder);
00701
00702
00703 const LLString upload_cost("10");
00704 gMenuHolder->childSetLabelArg("Upload Image", "[COST]", upload_cost);
00705 gMenuHolder->childSetLabelArg("Upload Sound", "[COST]", upload_cost);
00706 gMenuHolder->childSetLabelArg("Upload Animation", "[COST]", upload_cost);
00707 gMenuHolder->childSetLabelArg("Bulk Upload", "[COST]", upload_cost);
00708
00709 gAFKMenu = (LLMenuItemCallGL*)gMenuBarView->getChildByName("Set Away", TRUE);
00710 gBusyMenu = (LLMenuItemCallGL*)gMenuBarView->getChildByName("Set Busy", TRUE);
00711 gAttachSubMenu = gMenuBarView->getChildMenuByName("Attach Object", TRUE);
00712 gDetachSubMenu = gMenuBarView->getChildMenuByName("Detach Object", TRUE);
00713
00714 if (gAgent.isTeen())
00715 {
00716 gMenuBarView->getChildByName("Menu Underpants", TRUE)->setVisible(FALSE);
00717 gMenuBarView->getChildByName("Menu Undershirt", TRUE)->setVisible(FALSE);
00718 }
00719
00720
00721 LLMenuGL*menu;
00722
00723
00724
00725
00726
00727
00728
00729
00730
00731
00732
00733
00734 menu = new LLMenuGL(CLIENT_MENU_NAME);
00735 init_client_menu(menu);
00736 gMenuBarView->appendMenu( menu );
00737 menu->updateParent(LLMenuGL::sMenuContainer);
00738
00739 menu = new LLMenuGL(SERVER_MENU_NAME);
00740 init_server_menu(menu);
00741 gMenuBarView->appendMenu( menu );
00742 menu->updateParent(LLMenuGL::sMenuContainer);
00743
00744 gMenuBarView->createJumpKeys();
00745
00746
00747 gMenuParcelObserver = new LLMenuParcelObserver();
00748
00749
00750 gLandmarkObserver = new LLLandmarkObserver();
00751
00752
00753
00754
00755 show_debug_menus();
00756 }
00757
00758 void init_landmark_menu(LLMenuGL* menu)
00759 {
00760 if (!menu) return;
00761
00762
00763 clear_landmark_menu(menu);
00764
00765 menu->append(new LLMenuItemCallGL("Organize Landmarks",
00766 &manage_landmarks, NULL));
00767 menu->append(new LLMenuItemCallGL("New Landmark...",
00768 &create_new_landmark, NULL));
00769 menu->appendSeparator();
00770
00771
00772 LLInventoryModel::cat_array_t* cats;
00773 LLInventoryModel::item_array_t* items;
00774 gInventory.getDirectDescendentsOf(gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK), cats, items);
00775 if(items)
00776 {
00777 S32 count = items->count();
00778 for(S32 i = 0; i < count; ++i)
00779 {
00780 LLInventoryItem* item = items->get(i);
00781 LLString landmark_name = item->getName();
00782 LLUUID* landmark_id_ptr = new LLUUID( item->getUUID() );
00783 LLMenuItemCallGL* menu_item =
00784 new LLMenuItemCallGL(landmark_name, landmark_menu_action,
00785 NULL, NULL, landmark_id_ptr);
00786 menu->append(menu_item);
00787 }
00788 }
00789 }
00790
00791 void clear_landmark_menu(LLMenuGL* menu)
00792 {
00793 if (!menu) return;
00794
00795
00796
00797
00798 const LLView::child_list_t* child_list = menu->getChildList();
00799 LLView::child_list_const_iter_t it = child_list->begin();
00800 for ( ; it != child_list->end(); ++it)
00801 {
00802 LLView* view = *it;
00803 if (view->getWidgetType() == WIDGET_TYPE_MENU_ITEM_CALL)
00804 {
00805 LLMenuItemCallGL* menu_item = (LLMenuItemCallGL*)view;
00806 if (menu_item->getMenuCallback() == landmark_menu_action)
00807 {
00808 void* user_data = menu_item->getUserData();
00809 delete (LLUUID*)user_data;
00810 }
00811 }
00812 }
00813
00814 menu->empty();
00815 }
00816
00817 void init_client_menu(LLMenuGL* menu)
00818 {
00819 LLMenuGL* sub_menu = NULL;
00820
00821
00822
00823
00824 {
00825 LLMenuGL* sub = new LLMenuGL("Consoles");
00826 menu->appendMenu(sub);
00827 sub->append(new LLMenuItemCheckGL("Frame Console",
00828 &toggle_visibility,
00829 NULL,
00830 &get_visibility,
00831 (void*)gDebugView->mFrameStatView,
00832 '2', MASK_CONTROL|MASK_SHIFT ) );
00833 sub->append(new LLMenuItemCheckGL("Texture Console",
00834 &toggle_visibility,
00835 NULL,
00836 &get_visibility,
00837 (void*)gTextureView,
00838 '3', MASK_CONTROL|MASK_SHIFT ) );
00839 LLView* debugview = gDebugView->mDebugConsolep;
00840 sub->append(new LLMenuItemCheckGL("Debug Console",
00841 &toggle_visibility,
00842 NULL,
00843 &get_visibility,
00844 debugview,
00845 '4', MASK_CONTROL|MASK_SHIFT ) );
00846 #if 0 // Unused
00847 {
00848 LLMenuGL* sub = new LLMenuGL("Audio");
00849 menu->appendMenu(sub);
00850
00851 sub->append(new LLMenuItemCallGL("Global Pos",
00852 &handle_audio_status_1, NULL, NULL ,'5', MASK_CONTROL|MASK_SHIFT) );
00853 sub->append(new LLMenuItemCallGL("Cone",
00854 &handle_audio_status_2, NULL, NULL ,'6', MASK_CONTROL|MASK_SHIFT) );
00855 sub->append(new LLMenuItemCallGL("Local Pos",
00856 &handle_audio_status_3, NULL, NULL ,'7', MASK_CONTROL|MASK_SHIFT) );
00857 sub->append(new LLMenuItemCallGL("Duration",
00858 &handle_audio_status_4, NULL, NULL ,'8', MASK_CONTROL|MASK_SHIFT) );
00859 sub->createJumpKeys();
00860 }
00861 #endif
00862 sub->append(new LLMenuItemCheckGL("Fast Timers",
00863 &toggle_visibility,
00864 NULL,
00865 &get_visibility,
00866 (void*)gDebugView->mFastTimerView,
00867 '9', MASK_CONTROL|MASK_SHIFT ) );
00868 sub->append(new LLMenuItemCheckGL("Memory",
00869 &toggle_visibility,
00870 NULL,
00871 &get_visibility,
00872 (void*)gDebugView->mMemoryView,
00873 '0', MASK_CONTROL|MASK_SHIFT ) );
00874 sub->appendSeparator();
00875 sub->append(new LLMenuItemCallGL("Region Info to Debug Console",
00876 &handle_region_dump_settings, NULL));
00877 sub->append(new LLMenuItemCallGL("Group Info to Debug Console",
00878 &handle_dump_group_info, NULL, NULL));
00879 sub->append(new LLMenuItemCallGL("Capabilities Info to Debug Console",
00880 &handle_dump_capabilities_info, NULL, NULL));
00881 sub->createJumpKeys();
00882 }
00883
00884
00885
00886
00887
00888
00889 menu->append(new LLMenuItemCallGL("Reload personal setting overrides",
00890 &reload_personal_settings_overrides, NULL, NULL, KEY_F2, MASK_CONTROL|MASK_SHIFT));
00891
00892 sub_menu = new LLMenuGL("HUD Info");
00893 {
00894 sub_menu->append(new LLMenuItemCheckGL("Velocity",
00895 &toggle_visibility,
00896 NULL,
00897 &get_visibility,
00898 (void*)gVelocityBar));
00899
00900 sub_menu->append(new LLMenuItemToggleGL("Camera", &gDisplayCameraPos ) );
00901 sub_menu->append(new LLMenuItemToggleGL("Wind", &gDisplayWindInfo) );
00902 sub_menu->append(new LLMenuItemToggleGL("FOV", &gDisplayFOV ) );
00903 sub_menu->createJumpKeys();
00904 }
00905 menu->appendMenu(sub_menu);
00906
00907 menu->appendSeparator();
00908
00909 menu->append(new LLMenuItemCheckGL( "High-res Snapshot",
00910 &menu_toggle_control,
00911 NULL,
00912 &menu_check_control,
00913 (void*)"HighResSnapshot"));
00914
00915 menu->append(new LLMenuItemCheckGL( "Quiet Snapshots to Disk",
00916 &menu_toggle_control,
00917 NULL,
00918 &menu_check_control,
00919 (void*)"QuietSnapshotsToDisk"));
00920
00921 menu->append(new LLMenuItemCheckGL( "Compress Snapshots to Disk",
00922 &menu_toggle_control,
00923 NULL,
00924 &menu_check_control,
00925 (void*)"CompressSnapshotsToDisk"));
00926
00927 menu->append(new LLMenuItemCheckGL("Show Mouselook Crosshairs",
00928 &menu_toggle_control,
00929 NULL,
00930 &menu_check_control,
00931 (void*)"ShowCrosshairs"));
00932
00933 menu->append(new LLMenuItemCheckGL("Debug Permissions",
00934 &menu_toggle_control,
00935 NULL,
00936 &menu_check_control,
00937 (void*)"DebugPermissions"));
00938
00939
00940
00941 #ifdef TOGGLE_HACKED_GODLIKE_VIEWER
00942 if (!gInProductionGrid)
00943 {
00944 menu->append(new LLMenuItemCheckGL("Hacked Godmode",
00945 &handle_toggle_hacked_godmode,
00946 NULL,
00947 &check_toggle_hacked_godmode,
00948 (void*)"HackedGodmode"));
00949 }
00950 #endif
00951
00952 menu->append(new LLMenuItemCallGL("Clear Group Cache",
00953 LLGroupMgr::debugClearAllGroups));
00954 menu->appendSeparator();
00955
00956 sub_menu = new LLMenuGL("Rendering");
00957 init_debug_rendering_menu(sub_menu);
00958 menu->appendMenu(sub_menu);
00959
00960 sub_menu = new LLMenuGL("World");
00961 init_debug_world_menu(sub_menu);
00962 menu->appendMenu(sub_menu);
00963
00964 sub_menu = new LLMenuGL("UI");
00965 init_debug_ui_menu(sub_menu);
00966 menu->appendMenu(sub_menu);
00967
00968 sub_menu = new LLMenuGL("XUI");
00969 init_debug_xui_menu(sub_menu);
00970 menu->appendMenu(sub_menu);
00971
00972 sub_menu = new LLMenuGL("Character");
00973 init_debug_avatar_menu(sub_menu);
00974 menu->appendMenu(sub_menu);
00975
00976 {
00977 LLMenuGL* sub = NULL;
00978 sub = new LLMenuGL("Network");
00979
00980 sub->append(new LLMenuItemCallGL("Enable Message Log",
00981 &handle_viewer_enable_message_log, NULL));
00982 sub->append(new LLMenuItemCallGL("Disable Message Log",
00983 &handle_viewer_disable_message_log, NULL));
00984
00985 sub->appendSeparator();
00986
00987 sub->append(new LLMenuItemCheckGL("Velocity Interpolate Objects",
00988 &velocity_interpolate,
00989 NULL,
00990 &menu_check_control,
00991 (void*)"VelocityInterpolate"));
00992 sub->append(new LLMenuItemCheckGL("Ping Interpolate Object Positions",
00993 &menu_toggle_control,
00994 NULL,
00995 &menu_check_control,
00996 (void*)"PingInterpolate"));
00997
00998 sub->appendSeparator();
00999
01000 sub->append(new LLMenuItemCallGL("Drop a Packet",
01001 &drop_packet, NULL, NULL,
01002 'L', MASK_ALT | MASK_CONTROL));
01003
01004 menu->appendMenu( sub );
01005 sub->createJumpKeys();
01006 }
01007 {
01008 LLMenuGL* sub = NULL;
01009 sub = new LLMenuGL("Recorder");
01010
01011 sub->append(new LLMenuItemCheckGL("Full Session Logging", &menu_toggle_control, NULL, &menu_check_control, (void*)"StatsSessionTrackFrameStats"));
01012
01013 sub->append(new LLMenuItemCallGL("Start Logging", &LLFrameStats::startLogging, NULL));
01014 sub->append(new LLMenuItemCallGL("Stop Logging", &LLFrameStats::stopLogging, NULL));
01015 sub->append(new LLMenuItemCallGL("Log 10 Seconds", &LLFrameStats::timedLogging10, NULL));
01016 sub->append(new LLMenuItemCallGL("Log 30 Seconds", &LLFrameStats::timedLogging30, NULL));
01017 sub->append(new LLMenuItemCallGL("Log 60 Seconds", &LLFrameStats::timedLogging60, NULL));
01018 sub->appendSeparator();
01019 sub->append(new LLMenuItemCallGL("Start Playback", &LLAgentPilot::startPlayback, NULL));
01020 sub->append(new LLMenuItemCallGL("Stop Playback", &LLAgentPilot::stopPlayback, NULL));
01021 sub->append(new LLMenuItemToggleGL("Loop Playback", &LLAgentPilot::sLoop) );
01022 sub->append(new LLMenuItemCallGL("Start Record", &LLAgentPilot::startRecord, NULL));
01023 sub->append(new LLMenuItemCallGL("Stop Record", &LLAgentPilot::saveRecord, NULL));
01024
01025 menu->appendMenu( sub );
01026 sub->createJumpKeys();
01027 }
01028
01029 menu->appendSeparator();
01030
01031 menu->append(new LLMenuItemToggleGL("Show Updates",
01032 &gShowObjectUpdates,
01033 'U', MASK_ALT | MASK_SHIFT | MASK_CONTROL));
01034
01035 menu->appendSeparator();
01036
01037 menu->append(new LLMenuItemCallGL("Compress Image...",
01038 &handle_compress_image, NULL, NULL));
01039
01040 menu->append(new LLMenuItemCheckGL("Limit Select Distance",
01041 &menu_toggle_control,
01042 NULL,
01043 &menu_check_control,
01044 (void*)"LimitSelectDistance"));
01045
01046 menu->append(new LLMenuItemCheckGL("Disable Camera Constraints",
01047 &menu_toggle_control,
01048 NULL,
01049 &menu_check_control,
01050 (void*)"DisableCameraConstraints"));
01051
01052 menu->append(new LLMenuItemCheckGL("Joystick Flycam",
01053 &handle_toggle_flycam,NULL,&check_flycam,NULL));
01054
01055 menu->append(new LLMenuItemCheckGL("Mouse Smoothing",
01056 &menu_toggle_control,
01057 NULL,
01058 &menu_check_control,
01059 (void*) "MouseSmooth"));
01060 menu->appendSeparator();
01061
01062 menu->append(new LLMenuItemCheckGL( "Console Window",
01063 &menu_toggle_control,
01064 NULL,
01065 &menu_check_control,
01066 (void*)"ShowConsoleWindow"));
01067
01068 #ifndef LL_RELEASE_FOR_DOWNLOAD
01069 {
01070 LLMenuGL* sub = NULL;
01071 sub = new LLMenuGL("Debugging");
01072 sub->append(new LLMenuItemCallGL("Force Breakpoint", &force_breakpoint, NULL, NULL, 'B', MASK_CONTROL | MASK_ALT));
01073 sub->append(new LLMenuItemCallGL("LLError And Crash", &handle_crash));
01074 sub->createJumpKeys();
01075 menu->appendMenu(sub);
01076 }
01077 #endif
01078
01079
01080 menu->append(new LLMenuItemCheckGL("Clothing...",
01081 &handle_clothing,
01082 NULL,
01083 NULL,
01084 NULL));
01085
01086 menu->append(new LLMenuItemCallGL("Debug Settings", LLFloaterSettingsDebug::show, NULL, NULL));
01087 menu->append(new LLMenuItemCheckGL("View Admin Options", &handle_admin_override_toggle, NULL, &check_admin_override, NULL, 'V', MASK_CONTROL | MASK_ALT));
01088 menu->createJumpKeys();
01089 }
01090
01091 void init_debug_world_menu(LLMenuGL* menu)
01092 {
01093 menu->append(new LLMenuItemCheckGL("Mouse Moves Sun",
01094 &menu_toggle_control,
01095 NULL,
01096 &menu_check_control,
01097 (void*)"MouseSun",
01098 'M', MASK_CONTROL|MASK_ALT));
01099 menu->append(new LLMenuItemCheckGL("Sim Sun Override",
01100 &menu_toggle_control,
01101 NULL,
01102 &menu_check_control,
01103 (void*)"SkyOverrideSimSunPosition"));
01104 menu->append(new LLMenuItemCallGL("Dump Scripted Camera",
01105 &handle_dump_followcam, NULL, NULL));
01106 menu->append(new LLMenuItemCheckGL("Fixed Weather",
01107 &menu_toggle_control,
01108 NULL,
01109 &menu_check_control,
01110 (void*)"FixedWeather"));
01111 menu->append(new LLMenuItemCallGL("Dump Region Object Cache",
01112 &handle_dump_region_object_cache, NULL, NULL));
01113 menu->createJumpKeys();
01114 }
01115
01116
01117 void handle_export_menus_to_xml(void*)
01118 {
01119 LLFilePicker& picker = LLFilePicker::instance();
01120 if(!picker.getSaveFile(LLFilePicker::FFSAVE_XML))
01121 {
01122 llwarns << "No file" << llendl;
01123 return;
01124 }
01125 const char* filename = picker.getFirstFile();
01126
01127 llofstream out(filename);
01128 LLXMLNodePtr node = gMenuBarView->getXML();
01129 node->writeToOstream(out);
01130 out.close();
01131 }
01132
01133 extern BOOL gDebugClicks;
01134 extern BOOL gDebugWindowProc;
01135 extern BOOL gDebugTextEditorTips;
01136 extern BOOL gDebugSelectMgr;
01137 extern BOOL gVectorizePerfTest;
01138
01139 void init_debug_ui_menu(LLMenuGL* menu)
01140 {
01141 menu->append(new LLMenuItemCallGL("SLURL Test", &handle_slurl_test));
01142 menu->append(new LLMenuItemCallGL("Editable UI", &edit_ui));
01143 menu->append(new LLMenuItemToggleGL("Async Keystrokes", &gHandleKeysAsync));
01144 menu->append(new LLMenuItemCallGL( "Dump SelectMgr", &dump_select_mgr));
01145 menu->append(new LLMenuItemCallGL( "Dump Inventory", &dump_inventory));
01146 menu->append(new LLMenuItemCallGL( "Dump Focus Holder", &handle_dump_focus, NULL, NULL, 'F', MASK_ALT | MASK_CONTROL));
01147 menu->append(new LLMenuItemCallGL( "Dump VolumeMgr", &dump_volume_mgr, NULL, NULL));
01148 menu->append(new LLMenuItemCallGL( "Print Selected Object Info", &print_object_info, NULL, NULL, 'P', MASK_CONTROL|MASK_SHIFT ));
01149 menu->append(new LLMenuItemCallGL( "Print Agent Info", &print_agent_nvpairs, NULL, NULL, 'P', MASK_SHIFT ));
01150 menu->append(new LLMenuItemCallGL( "Texture Memory Stats", &output_statistics, NULL, NULL, 'M', MASK_SHIFT | MASK_ALT | MASK_CONTROL));
01151 menu->append(new LLMenuItemCheckGL("Double-Click Auto-Pilot",
01152 menu_toggle_control, NULL, menu_check_control,
01153 (void*)"DoubleClickAutoPilot"));
01154 menu->appendSeparator();
01155
01156 menu->append(new LLMenuItemToggleGL("Debug SelectMgr", &gDebugSelectMgr));
01157 menu->append(new LLMenuItemToggleGL("Debug Clicks", &gDebugClicks));
01158 menu->append(new LLMenuItemToggleGL("Debug Views", &LLView::sDebugRects));
01159 menu->append(new LLMenuItemCheckGL("Show Name Tooltips", toggle_show_xui_names, NULL, check_show_xui_names, NULL));
01160 menu->append(new LLMenuItemToggleGL("Debug Mouse Events", &LLView::sDebugMouseHandling));
01161 menu->append(new LLMenuItemToggleGL("Debug Keys", &LLView::sDebugKeys));
01162 menu->append(new LLMenuItemToggleGL("Debug WindowProc", &gDebugWindowProc));
01163 menu->append(new LLMenuItemToggleGL("Debug Text Editor Tips", &gDebugTextEditorTips));
01164 menu->appendSeparator();
01165 menu->append(new LLMenuItemCheckGL("Show Time", menu_toggle_control, NULL, menu_check_control, (void*)"DebugShowTime"));
01166 menu->append(new LLMenuItemCheckGL("Show Render Info", menu_toggle_control, NULL, menu_check_control, (void*)"DebugShowRenderInfo"));
01167
01168 menu->createJumpKeys();
01169 }
01170
01171 void init_debug_xui_menu(LLMenuGL* menu)
01172 {
01173 menu->append(new LLMenuItemCallGL("Floater Test...", LLFloaterTest::show));
01174 menu->append(new LLMenuItemCallGL("Export Menus to XML...", handle_export_menus_to_xml));
01175 menu->append(new LLMenuItemCallGL("Edit UI...", LLFloaterEditUI::show));
01176 menu->append(new LLMenuItemCallGL("Load from XML...", handle_load_from_xml));
01177 menu->append(new LLMenuItemCallGL("Save to XML...", handle_save_to_xml));
01178 menu->append(new LLMenuItemCheckGL("Show XUI Names", toggle_show_xui_names, NULL, check_show_xui_names, NULL));
01179
01180
01181 menu->createJumpKeys();
01182 }
01183
01184 void init_debug_rendering_menu(LLMenuGL* menu)
01185 {
01186 LLMenuGL* sub_menu = NULL;
01187
01189
01190
01191
01192 sub_menu = new LLMenuGL("Types");
01193 menu->appendMenu(sub_menu);
01194
01195 sub_menu->append(new LLMenuItemCheckGL("Simple",
01196 &LLPipeline::toggleRenderTypeControl, NULL,
01197 &LLPipeline::hasRenderTypeControl,
01198 (void*)LLPipeline::RENDER_TYPE_SIMPLE, '1', MASK_CONTROL|MASK_ALT|MASK_SHIFT));
01199 sub_menu->append(new LLMenuItemCheckGL("Alpha",
01200 &LLPipeline::toggleRenderTypeControl, NULL,
01201 &LLPipeline::hasRenderTypeControl,
01202 (void*)LLPipeline::RENDER_TYPE_ALPHA, '2', MASK_CONTROL|MASK_ALT|MASK_SHIFT));
01203 sub_menu->append(new LLMenuItemCheckGL("Tree",
01204 &LLPipeline::toggleRenderTypeControl, NULL,
01205 &LLPipeline::hasRenderTypeControl,
01206 (void*)LLPipeline::RENDER_TYPE_TREE, '3', MASK_CONTROL|MASK_ALT|MASK_SHIFT));
01207 sub_menu->append(new LLMenuItemCheckGL("Character",
01208 &LLPipeline::toggleRenderTypeControl, NULL,
01209 &LLPipeline::hasRenderTypeControl,
01210 (void*)LLPipeline::RENDER_TYPE_AVATAR, '4', MASK_CONTROL|MASK_ALT|MASK_SHIFT));
01211 sub_menu->append(new LLMenuItemCheckGL("SurfacePatch",
01212 &LLPipeline::toggleRenderTypeControl, NULL,
01213 &LLPipeline::hasRenderTypeControl,
01214 (void*)LLPipeline::RENDER_TYPE_TERRAIN, '5', MASK_CONTROL|MASK_ALT|MASK_SHIFT));
01215 sub_menu->append(new LLMenuItemCheckGL("Sky",
01216 &LLPipeline::toggleRenderTypeControl, NULL,
01217 &LLPipeline::hasRenderTypeControl,
01218 (void*)LLPipeline::RENDER_TYPE_SKY, '6', MASK_CONTROL|MASK_ALT|MASK_SHIFT));
01219 sub_menu->append(new LLMenuItemCheckGL("Water",
01220 &LLPipeline::toggleRenderTypeControl, NULL,
01221 &LLPipeline::hasRenderTypeControl,
01222 (void*)LLPipeline::RENDER_TYPE_WATER, '7', MASK_CONTROL|MASK_ALT|MASK_SHIFT));
01223 sub_menu->append(new LLMenuItemCheckGL("Ground",
01224 &LLPipeline::toggleRenderTypeControl, NULL,
01225 &LLPipeline::hasRenderTypeControl,
01226 (void*)LLPipeline::RENDER_TYPE_GROUND, '8', MASK_CONTROL|MASK_ALT|MASK_SHIFT));
01227 sub_menu->append(new LLMenuItemCheckGL("Volume",
01228 &LLPipeline::toggleRenderTypeControl, NULL,
01229 &LLPipeline::hasRenderTypeControl,
01230 (void*)LLPipeline::RENDER_TYPE_VOLUME, '9', MASK_CONTROL|MASK_ALT|MASK_SHIFT));
01231 sub_menu->append(new LLMenuItemCheckGL("Grass",
01232 &LLPipeline::toggleRenderTypeControl, NULL,
01233 &LLPipeline::hasRenderTypeControl,
01234 (void*)LLPipeline::RENDER_TYPE_GRASS, '0', MASK_CONTROL|MASK_ALT|MASK_SHIFT));
01235 sub_menu->append(new LLMenuItemCheckGL("Clouds",
01236 &LLPipeline::toggleRenderTypeControl, NULL,
01237 &LLPipeline::hasRenderTypeControl,
01238 (void*)LLPipeline::RENDER_TYPE_CLOUDS, '-', MASK_CONTROL|MASK_ALT| MASK_SHIFT));
01239 sub_menu->append(new LLMenuItemCheckGL("Particles",
01240 &LLPipeline::toggleRenderTypeControl, NULL,
01241 &LLPipeline::hasRenderTypeControl,
01242 (void*)LLPipeline::RENDER_TYPE_PARTICLES, '=', MASK_CONTROL|MASK_ALT|MASK_SHIFT));
01243 sub_menu->append(new LLMenuItemCheckGL("Bump",
01244 &LLPipeline::toggleRenderTypeControl, NULL,
01245 &LLPipeline::hasRenderTypeControl,
01246 (void*)LLPipeline::RENDER_TYPE_BUMP, '\\', MASK_CONTROL|MASK_ALT|MASK_SHIFT));
01247 sub_menu->createJumpKeys();
01248 sub_menu = new LLMenuGL("Features");
01249 menu->appendMenu(sub_menu);
01250 sub_menu->append(new LLMenuItemCheckGL("UI",
01251 &LLPipeline::toggleRenderDebugFeature, NULL,
01252 &LLPipeline::toggleRenderDebugFeatureControl,
01253 (void*)LLPipeline::RENDER_DEBUG_FEATURE_UI, KEY_F1, MASK_ALT|MASK_CONTROL));
01254 sub_menu->append(new LLMenuItemCheckGL("Selected",
01255 &LLPipeline::toggleRenderDebugFeature, NULL,
01256 &LLPipeline::toggleRenderDebugFeatureControl,
01257 (void*)LLPipeline::RENDER_DEBUG_FEATURE_SELECTED, KEY_F2, MASK_ALT|MASK_CONTROL));
01258 sub_menu->append(new LLMenuItemCheckGL("Highlighted",
01259 &LLPipeline::toggleRenderDebugFeature, NULL,
01260 &LLPipeline::toggleRenderDebugFeatureControl,
01261 (void*)LLPipeline::RENDER_DEBUG_FEATURE_HIGHLIGHTED, KEY_F3, MASK_ALT|MASK_CONTROL));
01262 sub_menu->append(new LLMenuItemCheckGL("Dynamic Textures",
01263 &LLPipeline::toggleRenderDebugFeature, NULL,
01264 &LLPipeline::toggleRenderDebugFeatureControl,
01265 (void*)LLPipeline::RENDER_DEBUG_FEATURE_DYNAMIC_TEXTURES, KEY_F4, MASK_ALT|MASK_CONTROL));
01266 sub_menu->append(new LLMenuItemCheckGL( "Foot Shadows",
01267 &LLPipeline::toggleRenderDebugFeature, NULL,
01268 &LLPipeline::toggleRenderDebugFeatureControl,
01269 (void*)LLPipeline::RENDER_DEBUG_FEATURE_FOOT_SHADOWS, KEY_F5, MASK_ALT|MASK_CONTROL));
01270 sub_menu->append(new LLMenuItemCheckGL("Fog",
01271 &LLPipeline::toggleRenderDebugFeature, NULL,
01272 &LLPipeline::toggleRenderDebugFeatureControl,
01273 (void*)LLPipeline::RENDER_DEBUG_FEATURE_FOG, KEY_F6, MASK_ALT|MASK_CONTROL));
01274 sub_menu->append(new LLMenuItemCheckGL("Palletized Textures",
01275 &LLPipeline::toggleRenderDebugFeature, NULL,
01276 &LLPipeline::toggleRenderDebugFeatureControl,
01277 (void*)LLPipeline::RENDER_DEBUG_FEATURE_PALETTE, KEY_F7, MASK_ALT|MASK_CONTROL));
01278 sub_menu->append(new LLMenuItemCheckGL("Test FRInfo",
01279 &LLPipeline::toggleRenderDebugFeature, NULL,
01280 &LLPipeline::toggleRenderDebugFeatureControl,
01281 (void*)LLPipeline::RENDER_DEBUG_FEATURE_FR_INFO, KEY_F8, MASK_ALT|MASK_CONTROL));
01282 sub_menu->append(new LLMenuItemCheckGL( "Flexible Objects",
01283 &LLPipeline::toggleRenderDebugFeature, NULL,
01284 &LLPipeline::toggleRenderDebugFeatureControl,
01285 (void*)LLPipeline::RENDER_DEBUG_FEATURE_FLEXIBLE, KEY_F9, MASK_ALT|MASK_CONTROL));
01286 sub_menu->createJumpKeys();
01287
01289
01290
01291
01292 sub_menu = new LLMenuGL("Info Displays");
01293 menu->appendMenu(sub_menu);
01294
01295 sub_menu->append(new LLMenuItemCheckGL("Verify", &LLPipeline::toggleRenderDebug, NULL,
01296 &LLPipeline::toggleRenderDebugControl,
01297 (void*)LLPipeline::RENDER_DEBUG_VERIFY));
01298 sub_menu->append(new LLMenuItemCheckGL("BBoxes", &LLPipeline::toggleRenderDebug, NULL,
01299 &LLPipeline::toggleRenderDebugControl,
01300 (void*)LLPipeline::RENDER_DEBUG_BBOXES));
01301 sub_menu->append(new LLMenuItemCheckGL("Points", &LLPipeline::toggleRenderDebug, NULL,
01302 &LLPipeline::toggleRenderDebugControl,
01303 (void*)LLPipeline::RENDER_DEBUG_POINTS));
01304 sub_menu->append(new LLMenuItemCheckGL("Octree", &LLPipeline::toggleRenderDebug, NULL,
01305 &LLPipeline::toggleRenderDebugControl,
01306 (void*)LLPipeline::RENDER_DEBUG_OCTREE));
01307 sub_menu->append(new LLMenuItemCheckGL("Occlusion", &LLPipeline::toggleRenderDebug, NULL,
01308 &LLPipeline::toggleRenderDebugControl,
01309 (void*)LLPipeline::RENDER_DEBUG_OCCLUSION));
01310 sub_menu->append(new LLMenuItemCheckGL("Animated Textures", &LLPipeline::toggleRenderDebug, NULL,
01311 &LLPipeline::toggleRenderDebugControl,
01312 (void*)LLPipeline::RENDER_DEBUG_TEXTURE_ANIM));
01313 sub_menu->append(new LLMenuItemCheckGL("Texture Priority", &LLPipeline::toggleRenderDebug, NULL,
01314 &LLPipeline::toggleRenderDebugControl,
01315 (void*)LLPipeline::RENDER_DEBUG_TEXTURE_PRIORITY));
01316 sub_menu->append(new LLMenuItemCheckGL("Texture Area (sqrt(A))",&LLPipeline::toggleRenderDebug, NULL,
01317 &LLPipeline::toggleRenderDebugControl,
01318 (void*)LLPipeline::RENDER_DEBUG_TEXTURE_AREA));
01319 sub_menu->append(new LLMenuItemCheckGL("Face Area (sqrt(A))",&LLPipeline::toggleRenderDebug, NULL,
01320 &LLPipeline::toggleRenderDebugControl,
01321 (void*)LLPipeline::RENDER_DEBUG_FACE_AREA));
01322 sub_menu->append(new LLMenuItemCheckGL("Pick Render", &LLPipeline::toggleRenderDebug, NULL,
01323 &LLPipeline::toggleRenderDebugControl,
01324 (void*)LLPipeline::RENDER_DEBUG_PICKING));
01325 sub_menu->append(new LLMenuItemCheckGL("Particles", &LLPipeline::toggleRenderDebug, NULL,
01326 &LLPipeline::toggleRenderDebugControl,
01327 (void*)LLPipeline::RENDER_DEBUG_PARTICLES));
01328 sub_menu->append(new LLMenuItemCheckGL("Composition", &LLPipeline::toggleRenderDebug, NULL,
01329 &LLPipeline::toggleRenderDebugControl,
01330 (void*)LLPipeline::RENDER_DEBUG_COMPOSITION));
01331 sub_menu->append(new LLMenuItemCheckGL("ShadowMap", &LLPipeline::toggleRenderDebug, NULL,
01332 &LLPipeline::toggleRenderDebugControl,
01333 (void*)LLPipeline::RENDER_DEBUG_SHADOW_MAP));
01334 sub_menu->append(new LLMenuItemCheckGL("LightTrace",&LLPipeline::toggleRenderDebug, NULL,
01335 &LLPipeline::toggleRenderDebugControl,
01336 (void*)LLPipeline::RENDER_DEBUG_LIGHT_TRACE));
01337 sub_menu->append(new LLMenuItemCheckGL("Glow",&LLPipeline::toggleRenderDebug, NULL,
01338 &LLPipeline::toggleRenderDebugControl,
01339 (void*)LLPipeline::RENDER_DEBUG_GLOW));
01340
01341 sub_menu->append(new LLMenuItemCheckGL("Show Depth Buffer",
01342 &menu_toggle_control,
01343 NULL,
01344 &menu_check_control,
01345 (void*)"ShowDepthBuffer"));
01346 sub_menu->append(new LLMenuItemToggleGL("Show Select Buffer", &gDebugSelect));
01347
01348 sub_menu->append(new LLMenuItemToggleGL("Vectorize Perf Test", &gVectorizePerfTest));
01349
01350 sub_menu = new LLMenuGL("Render Tests");
01351
01352 sub_menu->append(new LLMenuItemCheckGL("Camera Offset",
01353 &menu_toggle_control,
01354 NULL,
01355 &menu_check_control,
01356 (void*)"CameraOffset"));
01357
01358 sub_menu->append(new LLMenuItemToggleGL("Randomize Framerate", &gRandomizeFramerate));
01359
01360 sub_menu->append(new LLMenuItemToggleGL("Periodic Slow Frame", &gPeriodicSlowFrame));
01361 sub_menu->createJumpKeys();
01362
01363 menu->appendMenu( sub_menu );
01364
01365 menu->appendSeparator();
01366 menu->append(new LLMenuItemCheckGL("Axes", menu_toggle_control, NULL, menu_check_control, (void*)"ShowAxes"));
01367
01368
01369 menu->appendSeparator();
01370 menu->append(new LLMenuItemToggleGL("Hide Selected", &gHideSelectedObjects));
01371 menu->appendSeparator();
01372 menu->append(new LLMenuItemCheckGL("Tangent Basis", menu_toggle_control, NULL, menu_check_control, (void*)"ShowTangentBasis"));
01373 menu->append(new LLMenuItemCallGL("Selected Texture Info", handle_selected_texture_info, NULL, NULL, 'T', MASK_CONTROL|MASK_SHIFT|MASK_ALT));
01374
01375
01376 menu->append(new LLMenuItemToggleGL("Wireframe", &gUseWireframe,
01377 'R', MASK_CONTROL|MASK_SHIFT));
01378
01379 LLMenuItemCheckGL* item;
01380 item = new LLMenuItemCheckGL("Object-Object Occlusion", menu_toggle_control, NULL, menu_check_control, (void*)"UseOcclusion", 'O', MASK_CONTROL|MASK_SHIFT);
01381 item->setEnabled(gGLManager.mHasOcclusionQuery && gFeatureManagerp->isFeatureAvailable("UseOcclusion"));
01382 menu->append(item);
01383
01384
01385 item = new LLMenuItemCheckGL("Animate Textures", menu_toggle_control, NULL, menu_check_control, (void*)"AnimateTextures");
01386 menu->append(item);
01387
01388 item = new LLMenuItemCheckGL("Disable Textures", menu_toggle_variable, NULL, menu_check_variable, (void*)&LLViewerImage::sDontLoadVolumeTextures);
01389 menu->append(item);
01390
01391 #ifndef LL_RELEASE_FOR_DOWNLOAD
01392 item = new LLMenuItemCheckGL("HTTP Get Textures", menu_toggle_control, NULL, menu_check_control, (void*)"ImagePipelineUseHTTP");
01393 menu->append(item);
01394 #endif
01395
01396 item = new LLMenuItemCheckGL("Run Multiple Threads", menu_toggle_control, NULL, menu_check_control, (void*)"RunMultipleThreads");
01397 menu->append(item);
01398
01399 #ifndef LL_RELEASE_FOR_DOWNLOAD
01400 item = new LLMenuItemCheckGL("Dynamic Reflections", menu_toggle_control, NULL, menu_check_control, (void*)"RenderDynamicReflections");
01401 menu->append(item);
01402 #endif
01403
01404 item = new LLMenuItemCheckGL("Cheesy Beacon", menu_toggle_control, NULL, menu_check_control, (void*)"CheesyBeacon");
01405 menu->append(item);
01406
01407 menu->createJumpKeys();
01408 }
01409
01410 extern BOOL gDebugAvatarRotation;
01411
01412 void init_debug_avatar_menu(LLMenuGL* menu)
01413 {
01414 LLMenuGL* sub_menu = new LLMenuGL("Grab Baked Texture");
01415 init_debug_baked_texture_menu(sub_menu);
01416 menu->appendMenu(sub_menu);
01417
01418 sub_menu = new LLMenuGL("Character Tests");
01419 sub_menu->append(new LLMenuItemToggleGL("Go Away/AFK When Idle",
01420 &gAllowIdleAFK));
01421
01422 sub_menu->append(new LLMenuItemCallGL("Appearance To XML",
01423 &LLVOAvatar::dumpArchetypeXML));
01424
01425
01426 sub_menu->append(new LLMenuItemCallGL( "Toggle Character Geometry",
01427 &handle_god_request_avatar_geometry, &enable_god_customer_service, NULL));
01428
01429 sub_menu->append(new LLMenuItemCallGL("Test Male",
01430 handle_test_male));
01431
01432 sub_menu->append(new LLMenuItemCallGL("Test Female",
01433 handle_test_female));
01434
01435 sub_menu->append(new LLMenuItemCallGL("Toggle PG", handle_toggle_pg));
01436
01437 sub_menu->append(new LLMenuItemToggleGL("Allow Select Avatar", &gAllowSelectAvatar));
01438 sub_menu->createJumpKeys();
01439
01440 menu->appendMenu(sub_menu);
01441
01442 menu->append(new LLMenuItemCallGL("Force Params to Default", &LLAgent::clearVisualParams, NULL));
01443 menu->append(new LLMenuItemCallGL("Reload Vertex Shader", &reload_vertex_shader, NULL));
01444 menu->append(new LLMenuItemToggleGL("Animation Info", &LLVOAvatar::sShowAnimationDebug));
01445 menu->append(new LLMenuItemCallGL("Slow Motion Animations", &slow_mo_animations, NULL));
01446 menu->append(new LLMenuItemToggleGL("Show Look At", &LLHUDEffectLookAt::sDebugLookAt));
01447 menu->append(new LLMenuItemToggleGL("Show Point At", &LLHUDEffectPointAt::sDebugPointAt));
01448 menu->append(new LLMenuItemToggleGL("Debug Joint Updates", &LLVOAvatar::sJointDebug));
01449 menu->append(new LLMenuItemToggleGL("Disable LOD", &LLViewerJoint::sDisableLOD));
01450 menu->append(new LLMenuItemToggleGL("Debug Character Vis", &LLVOAvatar::sDebugInvisible));
01451
01452 menu->append(new LLMenuItemToggleGL("Show Collision Plane", &LLVOAvatar::sShowFootPlane));
01453 menu->append(new LLMenuItemToggleGL("Show Collision Skeleton", &LLVOAvatar::sShowCollisionVolumes));
01454 menu->append(new LLMenuItemToggleGL( "Display Agent Target", &LLAgent::sDebugDisplayTarget));
01455 menu->append(new LLMenuItemToggleGL( "Debug Rotation", &gDebugAvatarRotation));
01456 menu->append(new LLMenuItemCallGL("Dump Attachments", handle_dump_attachments));
01457 menu->append(new LLMenuItemCallGL("Rebake Textures", handle_rebake_textures, NULL, NULL, 'R', MASK_ALT | MASK_CONTROL ));
01458 #ifndef LL_RELEASE_FOR_DOWNLOAD
01459 menu->append(new LLMenuItemCallGL("Debug Avatar Textures", handle_debug_avatar_textures, NULL, NULL, 'A', MASK_SHIFT|MASK_CONTROL|MASK_ALT));
01460 menu->append(new LLMenuItemCallGL("Dump Local Textures", handle_dump_avatar_local_textures, NULL, NULL, 'M', MASK_SHIFT|MASK_ALT ));
01461 #endif
01462 menu->createJumpKeys();
01463 }
01464
01465 void init_debug_baked_texture_menu(LLMenuGL* menu)
01466 {
01467 menu->append(new LLMenuItemCallGL("Iris", handle_grab_texture, enable_grab_texture, (void*) LLVOAvatar::TEX_EYES_BAKED));
01468 menu->append(new LLMenuItemCallGL("Head", handle_grab_texture, enable_grab_texture, (void*) LLVOAvatar::TEX_HEAD_BAKED));
01469 menu->append(new LLMenuItemCallGL("Upper Body", handle_grab_texture, enable_grab_texture, (void*) LLVOAvatar::TEX_UPPER_BAKED));
01470 menu->append(new LLMenuItemCallGL("Lower Body", handle_grab_texture, enable_grab_texture, (void*) LLVOAvatar::TEX_LOWER_BAKED));
01471 menu->append(new LLMenuItemCallGL("Skirt", handle_grab_texture, enable_grab_texture, (void*) LLVOAvatar::TEX_SKIRT_BAKED));
01472 menu->createJumpKeys();
01473 }
01474
01475 void init_server_menu(LLMenuGL* menu)
01476 {
01477
01478
01479
01480
01481
01482
01483
01484
01485
01486
01487
01488
01489
01490
01491
01492
01493
01494
01495
01496
01497
01498
01499
01500
01501
01502
01503
01504
01505
01506
01507
01508 {
01509 LLMenuGL* sub = new LLMenuGL("Object");
01510 menu->appendMenu(sub);
01511
01512 sub->append(new LLMenuItemCallGL( "Take Copy",
01513 &force_take_copy, &enable_god_customer_service, NULL,
01514 'O', MASK_SHIFT | MASK_ALT | MASK_CONTROL));
01515 #ifdef _CORY_TESTING
01516 sub->append(new LLMenuItemCallGL( "Export Copy",
01517 &force_export_copy, NULL, NULL));
01518 sub->append(new LLMenuItemCallGL( "Import Geometry",
01519 &force_import_geometry, NULL, NULL));
01520 #endif
01521
01522
01523
01524
01525 sub->append(new LLMenuItemCallGL( "Force Owner To Me",
01526 &handle_object_owner_self, &enable_god_customer_service));
01527 sub->append(new LLMenuItemCallGL( "Force Owner Permissive",
01528 &handle_object_owner_permissive, &enable_god_customer_service));
01529
01530
01531 sub->append(new LLMenuItemCallGL( "Delete",
01532 &handle_force_delete, &enable_god_customer_service, NULL, KEY_DELETE, MASK_SHIFT | MASK_ALT | MASK_CONTROL));
01533 sub->append(new LLMenuItemCallGL( "Lock",
01534 &handle_object_lock, &enable_god_customer_service, NULL, 'L', MASK_SHIFT | MASK_ALT | MASK_CONTROL));
01535 sub->append(new LLMenuItemCallGL( "Get Asset IDs",
01536 &handle_object_asset_ids, &enable_god_customer_service, NULL, 'I', MASK_SHIFT | MASK_ALT | MASK_CONTROL));
01537 sub->createJumpKeys();
01538 }
01539 {
01540 LLMenuGL* sub = new LLMenuGL("Parcel");
01541 menu->appendMenu(sub);
01542
01543 sub->append(new LLMenuItemCallGL("Owner To Me",
01544 &handle_force_parcel_owner_to_me,
01545 &enable_god_customer_service, NULL));
01546 sub->append(new LLMenuItemCallGL("Set to Linden Content",
01547 &handle_force_parcel_to_content,
01548 &enable_god_customer_service, NULL,
01549 'C', MASK_SHIFT | MASK_ALT | MASK_CONTROL));
01550 sub->appendSeparator();
01551 sub->append(new LLMenuItemCallGL("Claim Public Land",
01552 &handle_claim_public_land, &enable_god_customer_service));
01553
01554 sub->createJumpKeys();
01555 }
01556 {
01557 LLMenuGL* sub = new LLMenuGL("Region");
01558 menu->appendMenu(sub);
01559 sub->append(new LLMenuItemCallGL("Dump Temp Asset Data",
01560 &handle_region_dump_temp_asset_data,
01561 &enable_god_customer_service, NULL));
01562 sub->createJumpKeys();
01563 }
01564 menu->append(new LLMenuItemCallGL( "God Tools...",
01565 &LLFloaterGodTools::show, &enable_god_basic, NULL));
01566
01567 menu->appendSeparator();
01568
01569 menu->append(new LLMenuItemCallGL("Save Region State",
01570 &LLPanelRegionTools::onSaveState, &enable_god_customer_service, NULL));
01571
01572
01573
01574
01575
01576 menu->appendSeparator();
01577
01578
01579
01580
01581 menu->append(new LLMenuItemCallGL("Request Admin Status",
01582 &handle_god_mode, NULL, NULL, 'G', MASK_ALT | MASK_CONTROL));
01583
01584 menu->append(new LLMenuItemCallGL("Leave Admin Status",
01585 &handle_leave_god_mode, NULL, NULL, 'G', MASK_ALT | MASK_SHIFT | MASK_CONTROL));
01586 menu->createJumpKeys();
01587 }
01588
01589 static std::vector<LLPointer<view_listener_t> > sMenus;
01590
01591
01592
01593
01594 void cleanup_menus()
01595 {
01596 clear_landmark_menu(gLandmarkMenu);
01597
01598 delete gMenuParcelObserver;
01599 gMenuParcelObserver = NULL;
01600
01601 delete gLandmarkObserver;
01602 gLandmarkObserver = NULL;
01603
01604 delete gPieSelf;
01605 gPieSelf = NULL;
01606
01607 delete gPieAvatar;
01608 gPieAvatar = NULL;
01609
01610 delete gPieObject;
01611 gPieObject = NULL;
01612
01613 delete gPieAttachment;
01614 gPieAttachment = NULL;
01615
01616 delete gPieLand;
01617 gPieLand = NULL;
01618
01619 delete gMenuBarView;
01620 gMenuBarView = NULL;
01621
01622 delete gPopupMenuView;
01623 gPopupMenuView = NULL;
01624
01625 delete gMenuHolder;
01626 gMenuHolder = NULL;
01627
01628 sMenus.clear();
01629 }
01630
01631
01632
01633
01634
01635 class LLObjectReportAbuse : public view_listener_t
01636 {
01637 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
01638 {
01639 LLFloaterReporter::showFromObject(gLastHitObjectID);
01640 return true;
01641 }
01642 };
01643
01644
01645 class LLObjectEnableReportAbuse : public view_listener_t
01646 {
01647 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
01648 {
01649 bool new_value = !gLastHitObjectID.isNull();
01650 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
01651 return true;
01652 }
01653 };
01654
01655 class LLObjectTouch : public view_listener_t
01656 {
01657 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
01658 {
01659 LLViewerObject* object = gObjectList.findObject(gLastHitObjectID);
01660 if (!object) return true;
01661
01662 LLMessageSystem *msg = gMessageSystem;
01663
01664 msg->newMessageFast(_PREHASH_ObjectGrab);
01665 msg->nextBlockFast( _PREHASH_AgentData);
01666 msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
01667 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
01668 msg->nextBlockFast( _PREHASH_ObjectData);
01669 msg->addU32Fast( _PREHASH_LocalID, object->mLocalID);
01670 msg->addVector3Fast(_PREHASH_GrabOffset, LLVector3::zero );
01671 msg->sendMessage( object->getRegion()->getHost());
01672
01673
01674
01675
01676 msg->newMessageFast(_PREHASH_ObjectDeGrab);
01677 msg->nextBlockFast(_PREHASH_AgentData);
01678 msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
01679 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
01680 msg->nextBlockFast(_PREHASH_ObjectData);
01681 msg->addU32Fast(_PREHASH_LocalID, object->mLocalID);
01682 msg->sendMessage(object->getRegion()->getHost());
01683
01684 return true;
01685 }
01686 };
01687
01688
01689
01690 class LLObjectEnableTouch : public view_listener_t
01691 {
01692 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
01693 {
01694 LLViewerObject* obj = gObjectList.findObject(gLastHitObjectID);
01695 bool new_value = obj && obj->flagHandleTouch();
01696 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
01697
01698
01699 LLSelectNode* node = gSelectMgr->getSelection()->getFirstRootNode();
01700 if (node && node->mValid && !node->mTouchName.empty())
01701 {
01702 gMenuHolder->childSetText("Object Touch", node->mTouchName);
01703 }
01704 else
01705 {
01706 gMenuHolder->childSetText("Object Touch", userdata["data"].asString());
01707 }
01708
01709 return true;
01710 }
01711 };
01712
01713 void label_touch(LLString& label, void*)
01714 {
01715 LLSelectNode* node = gSelectMgr->getSelection()->getFirstRootNode();
01716 if (node && node->mValid && !node->mTouchName.empty())
01717 {
01718 label.assign(node->mTouchName);
01719 }
01720 else
01721 {
01722 label.assign("Touch");
01723 }
01724 }
01725
01726 bool handle_object_open()
01727 {
01728 LLViewerObject* obj = gObjectList.findObject(gLastHitObjectID);
01729 if(!obj) return true;
01730
01731 LLFloaterOpenObject::show();
01732 return true;
01733 }
01734
01735 class LLObjectOpen : public view_listener_t
01736 {
01737 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
01738 {
01739 return handle_object_open();
01740 }
01741 };
01742
01743 class LLObjectEnableOpen : public view_listener_t
01744 {
01745 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
01746 {
01747
01748
01749 LLViewerObject* obj = gObjectList.findObject(gLastHitObjectID);
01750 bool new_value = (obj != NULL);
01751 if (new_value)
01752 {
01753 LLViewerObject* root = obj->getRootEdit();
01754 if (!root) new_value = false;
01755 else new_value = root->allowOpen();
01756 }
01757 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
01758 return true;
01759 }
01760 };
01761
01762
01763 class LLViewCheckBuildMode : public view_listener_t
01764 {
01765 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
01766 {
01767 bool new_value = gToolMgr->inEdit();
01768 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
01769 return true;
01770 }
01771 };
01772
01773 bool toggle_build_mode()
01774 {
01775 if (gToolMgr->inEdit())
01776 {
01777
01778 handle_reset_view();
01779 }
01780 else
01781 {
01782 if (gAgent.getFocusOnAvatar() && gSavedSettings.getBOOL("EditCameraMovement") )
01783 {
01784
01785 gAgent.setFocusOnAvatar(FALSE, ANIMATE);
01786 gAgent.setFocusGlobal(gAgent.getPositionGlobal() + 2.0 * LLVector3d(gAgent.getAtAxis()));
01787 gAgent.cameraZoomIn(0.666f);
01788 gAgent.cameraOrbitOver( 30.f * DEG_TO_RAD );
01789 }
01790
01791 gToolMgr->setCurrentToolset(gBasicToolset);
01792 gToolMgr->getCurrentToolset()->selectTool( gToolCreate );
01793
01794
01795 LLFirstUse::useBuild();
01796 }
01797 return true;
01798 }
01799
01800 class LLViewBuildMode : public view_listener_t
01801 {
01802 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
01803 {
01804 return toggle_build_mode();
01805 }
01806 };
01807
01808
01809 class LLObjectBuild : public view_listener_t
01810 {
01811 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
01812 {
01813 if (gAgent.getFocusOnAvatar() && !gToolMgr->inEdit() && gSavedSettings.getBOOL("EditCameraMovement") )
01814 {
01815
01816 gAgent.setFocusOnAvatar(FALSE, ANIMATE);
01817 gAgent.setFocusGlobal(gLastHitPosGlobal + gLastHitObjectOffset, gLastHitObjectID);
01818 gAgent.cameraZoomIn(0.666f);
01819 gAgent.cameraOrbitOver( 30.f * DEG_TO_RAD );
01820 gViewerWindow->moveCursorToCenter();
01821 }
01822 else if ( gSavedSettings.getBOOL("EditCameraMovement") )
01823 {
01824 gAgent.setFocusGlobal(gLastHitPosGlobal + gLastHitObjectOffset, gLastHitObjectID);
01825 gViewerWindow->moveCursorToCenter();
01826 }
01827
01828 gToolMgr->setCurrentToolset(gBasicToolset);
01829 gToolMgr->getCurrentToolset()->selectTool( gToolCreate );
01830
01831
01832 LLFirstUse::useBuild();
01833 return true;
01834 }
01835 };
01836
01837 class LLObjectEdit : public view_listener_t
01838 {
01839 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
01840 {
01841 gParcelMgr->deselectLand();
01842
01843 if (gAgent.getFocusOnAvatar() && !gToolMgr->inEdit())
01844 {
01845 LLObjectSelectionHandle selection = gSelectMgr->getSelection();
01846
01847 if (selection->getSelectType() == SELECT_TYPE_HUD || !gSavedSettings.getBOOL("EditCameraMovement"))
01848 {
01849
01850
01851 gAgent.setFocusGlobal(gAgent.calcFocusPositionTargetGlobal(), LLUUID::null);
01852 gAgent.setFocusOnAvatar(FALSE, ANIMATE);
01853 }
01854 else
01855 {
01856 gAgent.setFocusOnAvatar(FALSE, ANIMATE);
01857
01858 gAgent.setFocusGlobal(gLastHitPosGlobal , gLastHitObjectID);
01859 gAgent.cameraZoomIn(0.666f);
01860 gAgent.cameraOrbitOver( 30.f * DEG_TO_RAD );
01861 gViewerWindow->moveCursorToCenter();
01862 }
01863 }
01864
01865 gFloaterTools->open();
01866
01867 gToolMgr->setCurrentToolset(gBasicToolset);
01868 gFloaterTools->setEditTool( gToolTranslate );
01869
01870
01871 LLFirstUse::useBuild();
01872 return true;
01873 }
01874 };
01875
01876 class LLObjectInspect : public view_listener_t
01877 {
01878 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
01879 {
01880 LLFloaterInspect::show();
01881 return true;
01882 }
01883 };
01884
01885
01886
01887
01888
01889 class LLLandBuild : public view_listener_t
01890 {
01891 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
01892 {
01893 gParcelMgr->deselectLand();
01894
01895 if (gAgent.getFocusOnAvatar() && !gToolMgr->inEdit() && gSavedSettings.getBOOL("EditCameraMovement") )
01896 {
01897
01898 gAgent.setFocusOnAvatar(FALSE, ANIMATE);
01899 gAgent.setFocusGlobal(gLastHitPosGlobal + gLastHitObjectOffset, gLastHitObjectID);
01900 gAgent.cameraZoomIn(0.666f);
01901 gAgent.cameraOrbitOver( 30.f * DEG_TO_RAD );
01902 gViewerWindow->moveCursorToCenter();
01903 }
01904 else if ( gSavedSettings.getBOOL("EditCameraMovement") )
01905 {
01906
01907 gAgent.setFocusGlobal(gLastHitPosGlobal + gLastHitObjectOffset, gLastHitObjectID);
01908 gViewerWindow->moveCursorToCenter();
01909 }
01910
01911
01912 gToolMgr->setCurrentToolset(gBasicToolset);
01913 gToolMgr->getCurrentToolset()->selectTool( gToolCreate );
01914
01915
01916 LLFirstUse::useBuild();
01917 return true;
01918 }
01919 };
01920
01921 class LLLandBuyPass : public view_listener_t
01922 {
01923 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
01924 {
01925 LLPanelLandGeneral::onClickBuyPass((void *)FALSE);
01926 return true;
01927 }
01928 };
01929
01930 class LLLandEnableBuyPass : public view_listener_t
01931 {
01932 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
01933 {
01934 bool new_value = LLPanelLandGeneral::enableBuyPass(NULL);
01935 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
01936 return true;
01937 }
01938 };
01939
01940
01941 BOOL enable_land_build(void*)
01942 {
01943 if (gAgent.isGodlike()) return TRUE;
01944 if (gAgent.inPrelude()) return FALSE;
01945
01946 BOOL can_build = FALSE;
01947 LLParcel* agent_parcel = gParcelMgr->getAgentParcel();
01948 if (agent_parcel)
01949 {
01950 can_build = agent_parcel->getAllowModify();
01951 }
01952 return can_build;
01953 }
01954
01955
01956 BOOL enable_object_build(void*)
01957 {
01958 if (gAgent.isGodlike()) return TRUE;
01959 if (gAgent.inPrelude()) return FALSE;
01960
01961 BOOL can_build = FALSE;
01962 LLParcel* agent_parcel = gParcelMgr->getAgentParcel();
01963 if (agent_parcel)
01964 {
01965 can_build = agent_parcel->getAllowModify();
01966 }
01967 return can_build;
01968 }
01969
01970 class LLEnableEdit : public view_listener_t
01971 {
01972 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
01973 {
01974 bool new_value = gAgent.isGodlike() || !gAgent.inPrelude();
01975 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
01976 return true;
01977 }
01978 };
01979
01980 class LLSelfRemoveAllAttachments : public view_listener_t
01981 {
01982 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
01983 {
01984 LLAgent::userRemoveAllAttachments(NULL);
01985 return true;
01986 }
01987 };
01988
01989 class LLSelfEnableRemoveAllAttachments : public view_listener_t
01990 {
01991 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
01992 {
01993 bool new_value = false;
01994 if (gAgent.getAvatarObject())
01995 {
01996 LLVOAvatar* avatarp = gAgent.getAvatarObject();
01997 for (LLViewerJointAttachment* attachmentp = avatarp->mAttachmentPoints.getFirstData();
01998 attachmentp;
01999 attachmentp = avatarp->mAttachmentPoints.getNextData())
02000 {
02001 if (attachmentp->getObject())
02002 {
02003 new_value = true;
02004 break;
02005 }
02006 }
02007 }
02008 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
02009 return true;
02010 }
02011 };
02012
02013 BOOL enable_has_attachments(void*)
02014 {
02015
02016 return FALSE;
02017 }
02018
02019
02020
02021
02022 void handle_follow(void *userdata)
02023 {
02024
02025 gAgent.startFollowPilot(gLastHitObjectID);
02026 }
02027
02028 class LLObjectEnableMute : public view_listener_t
02029 {
02030 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
02031 {
02032 LLViewerObject* object = gViewerWindow->lastObjectHit();
02033 bool new_value = (object != NULL);
02034 if (new_value)
02035 {
02036 LLVOAvatar* avatar = find_avatar_from_object(object);
02037 if (avatar)
02038 {
02039
02040 LLNameValue *lastname = avatar->getNVPair("LastName");
02041 BOOL is_linden = lastname && !LLString::compareStrings(lastname->getString(), "Linden");
02042 BOOL is_self = avatar->isSelf();
02043 new_value = !is_linden && !is_self;
02044 }
02045 }
02046 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
02047 return true;
02048 }
02049 };
02050
02051 class LLObjectMute : public view_listener_t
02052 {
02053 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
02054 {
02055 LLViewerObject* object = gViewerWindow->lastObjectHit();
02056 if (!object) return true;
02057
02058 LLUUID id;
02059 LLString name;
02060 LLMute::EType type;
02061 LLVOAvatar* avatar = find_avatar_from_object(object);
02062 if (avatar)
02063 {
02064 id = avatar->getID();
02065
02066 LLNameValue *firstname = avatar->getNVPair("FirstName");
02067 LLNameValue *lastname = avatar->getNVPair("LastName");
02068 if (firstname && lastname)
02069 {
02070 name = firstname->getString();
02071 name += " ";
02072 name += lastname->getString();
02073 }
02074
02075 type = LLMute::AGENT;
02076 }
02077 else
02078 {
02079
02080 id = object->getID();
02081
02082 LLSelectNode* node = gSelectMgr->getSelection()->getFirstRootNode();
02083 if (node)
02084 {
02085 name = node->mName;
02086 }
02087
02088 type = LLMute::OBJECT;
02089 }
02090
02091 LLMute mute(id, name, type);
02092 if (gMuteListp->isMuted(mute.mID, mute.mName))
02093 {
02094 gMuteListp->remove(mute);
02095 }
02096 else
02097 {
02098 gMuteListp->add(mute);
02099 gFloaterMute->show();
02100 }
02101
02102 return true;
02103 }
02104 };
02105
02106 bool handle_go_to()
02107 {
02108
02109 std::vector<std::string> strings;
02110 std::string val;
02111 val = llformat("%g", gLastHitPosGlobal.mdV[VX]);
02112 strings.push_back(val);
02113 val = llformat("%g", gLastHitPosGlobal.mdV[VY]);
02114 strings.push_back(val);
02115 val = llformat("%g", gLastHitPosGlobal.mdV[VZ]);
02116 strings.push_back(val);
02117 send_generic_message("autopilot", strings);
02118
02119 gParcelMgr->deselectLand();
02120
02121 if (gAgent.getAvatarObject() && !gSavedSettings.getBOOL("AutoPilotLocksCamera"))
02122 {
02123 gAgent.setFocusGlobal(gAgent.getFocusTargetGlobal(), gAgent.getAvatarObject()->getID());
02124 }
02125 else
02126 {
02127
02128 gAgent.setFocusOnAvatar(TRUE, ANIMATE);
02129 }
02130
02131
02132 LLFirstUse::useGoTo();
02133 return true;
02134 }
02135
02136 class LLGoToObject : public view_listener_t
02137 {
02138 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
02139 {
02140 return handle_go_to();
02141 }
02142 };
02143
02144
02145
02146
02147 void callback_freeze(S32 option, void* data)
02148 {
02149 LLUUID* avatar_id = (LLUUID*) data;
02150
02151 if (0 == option || 1 == option)
02152 {
02153 U32 flags = 0x0;
02154 if (1 == option)
02155 {
02156
02157 flags |= 0x1;
02158 }
02159
02160 LLMessageSystem* msg = gMessageSystem;
02161 LLViewerObject* avatar = gObjectList.findObject(*avatar_id);
02162
02163 if (avatar)
02164 {
02165 msg->newMessage("FreezeUser");
02166 msg->nextBlock("AgentData");
02167 msg->addUUID("AgentID", gAgent.getID());
02168 msg->addUUID("SessionID", gAgent.getSessionID());
02169 msg->nextBlock("Data");
02170 msg->addUUID("TargetID", *avatar_id );
02171 msg->addU32("Flags", flags );
02172 msg->sendReliable( avatar->getRegion()->getHost() );
02173 }
02174 }
02175
02176 delete avatar_id;
02177 avatar_id = NULL;
02178 }
02179
02180 class LLAvatarFreeze : public view_listener_t
02181 {
02182 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
02183 {
02184 LLVOAvatar* avatar = find_avatar_from_object( gViewerWindow->lastObjectHit() );
02185 if( avatar )
02186 {
02187 LLUUID* avatar_id = new LLUUID( avatar->getID() );
02188
02189 gViewerWindow->alertXml("FreezeAvatar",
02190 callback_freeze, (void*)avatar_id);
02191
02192 }
02193 return true;
02194 }
02195 };
02196
02197 class LLAvatarVisibleDebug : public view_listener_t
02198 {
02199 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
02200 {
02201 bool new_value = gAgent.isGodlike();
02202 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
02203 return true;
02204 }
02205 };
02206
02207 class LLAvatarEnableDebug : public view_listener_t
02208 {
02209 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
02210 {
02211 bool new_value = gAgent.isGodlike();
02212 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
02213 return true;
02214 }
02215 };
02216
02217 class LLAvatarDebug : public view_listener_t
02218 {
02219 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
02220 {
02221 LLVOAvatar* avatar = find_avatar_from_object( gViewerWindow->lastObjectHit() );
02222 if( avatar )
02223 {
02224 avatar->dumpLocalTextures();
02225 llinfos << "Dumping temporary asset data to simulator logs for avatar " << avatar->getID() << llendl;
02226 std::vector<std::string> strings;
02227 strings.push_back(avatar->getID().asString());
02228 LLUUID invoice;
02229 send_generic_message("dumptempassetdata", strings, invoice);
02230 LLFloaterAvatarTextures::show( avatar->getID() );
02231 }
02232 return true;
02233 }
02234 };
02235
02236 void callback_eject(S32 option, void* data)
02237 {
02238 LLUUID* avatar_id = (LLUUID*) data;
02239
02240 if (0 == option || 1 == option)
02241 {
02242 LLMessageSystem* msg = gMessageSystem;
02243 LLViewerObject* avatar = gObjectList.findObject(*avatar_id);
02244
02245 if (avatar)
02246 {
02247 U32 flags = 0x0;
02248 if (1 == option)
02249 {
02250
02251 flags |= 0x1;
02252 }
02253
02254 msg->newMessage("EjectUser");
02255 msg->nextBlock("AgentData");
02256 msg->addUUID("AgentID", gAgent.getID() );
02257 msg->addUUID("SessionID", gAgent.getSessionID() );
02258 msg->nextBlock("Data");
02259 msg->addUUID("TargetID", *avatar_id );
02260 msg->addU32("Flags", flags );
02261 msg->sendReliable( avatar->getRegion()->getHost() );
02262 }
02263 }
02264
02265 delete avatar_id;
02266 avatar_id = NULL;
02267 }
02268
02269 class LLAvatarEject : public view_listener_t
02270 {
02271 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
02272 {
02273 LLVOAvatar* avatar = find_avatar_from_object( gViewerWindow->lastObjectHit() );
02274 if( avatar )
02275 {
02276 LLUUID* avatar_id = new LLUUID( avatar->getID() );
02277 gViewerWindow->alertXml("EjectAvatar",
02278 callback_eject, (void*)avatar_id);
02279
02280 }
02281 return true;
02282 }
02283 };
02284
02285 class LLAvatarEnableFreezeEject : public view_listener_t
02286 {
02287 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
02288 {
02289 LLVOAvatar* avatar = find_avatar_from_object( gViewerWindow->lastObjectHit() );
02290 bool new_value = (avatar != NULL);
02291
02292 if (new_value)
02293 {
02294 const LLVector3& pos = avatar->getPositionRegion();
02295 LLViewerRegion* region = avatar->getRegion();
02296 new_value = (region != NULL);
02297
02298 if (new_value)
02299 {
02300 new_value = (region->isOwnedSelf(pos) || region->isOwnedGroup(pos));
02301 }
02302 }
02303
02304 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
02305 return true;
02306 }
02307 };
02308
02309 class LLAvatarGiveCard : public view_listener_t
02310 {
02311 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
02312 {
02313 llinfos << "handle_give_card()" << llendl;
02314 LLViewerObject* dest = gViewerWindow->lastObjectHit();
02315 if(dest && dest->isAvatar())
02316 {
02317 bool found_name = false;
02318 LLString::format_map_t args;
02319 LLNameValue* nvfirst = dest->getNVPair("FirstName");
02320 LLNameValue* nvlast = dest->getNVPair("LastName");
02321 if(nvfirst && nvlast)
02322 {
02323 args["[FIRST]"] = nvfirst->getString();
02324 args["[LAST]"] = nvlast->getString();
02325 found_name = true;
02326 }
02327 LLViewerRegion* region = dest->getRegion();
02328 LLHost dest_host;
02329 if(region)
02330 {
02331 dest_host = region->getHost();
02332 }
02333 if(found_name && dest_host.isOk())
02334 {
02335 LLMessageSystem* msg = gMessageSystem;
02336 msg->newMessage("OfferCallingCard");
02337 msg->nextBlockFast(_PREHASH_AgentData);
02338 msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
02339 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
02340 msg->nextBlockFast(_PREHASH_AgentBlock);
02341 msg->addUUIDFast(_PREHASH_DestID, dest->getID());
02342 LLUUID transaction_id;
02343 transaction_id.generate();
02344 msg->addUUIDFast(_PREHASH_TransactionID, transaction_id);
02345 msg->sendReliable(dest_host);
02346 LLNotifyBox::showXml("OfferedCard", args);
02347 }
02348 else
02349 {
02350 gViewerWindow->alertXml("CantOfferCallingCard", args);
02351 }
02352 }
02353 return true;
02354 }
02355 };
02356
02357
02358
02359 void login_done(S32 which, void *user)
02360 {
02361 llinfos << "Login done " << which << llendl;
02362
02363 LLPanelLogin::close();
02364 }
02365
02366
02367 void callback_leave_group(S32 option, void *userdata)
02368 {
02369 if (option == 0)
02370 {
02371 LLMessageSystem *msg = gMessageSystem;
02372
02373 msg->newMessageFast(_PREHASH_LeaveGroupRequest);
02374 msg->nextBlockFast(_PREHASH_AgentData);
02375 msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
02376 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
02377 msg->nextBlockFast(_PREHASH_GroupData);
02378 msg->addUUIDFast(_PREHASH_GroupID, gAgent.mGroupID );
02379
02380 gAgent.sendReliableMessage();
02381 }
02382 }
02383
02384 void handle_leave_group(void *)
02385 {
02386 if (gAgent.getGroupID() != LLUUID::null)
02387 {
02388 LLString::format_map_t args;
02389 args["[GROUP]"] = gAgent.mGroupName;
02390 gViewerWindow->alertXml("GroupLeaveConfirmMember", args, callback_leave_group);
02391 }
02392 }
02393
02394 void append_aggregate(LLString& string, const LLAggregatePermissions& ag_perm, PermissionBit bit, const char* txt)
02395 {
02396 LLAggregatePermissions::EValue val = ag_perm.getValue(bit);
02397 char buffer[MAX_STRING];
02398 buffer[0] = '\0';
02399 switch(val)
02400 {
02401 case LLAggregatePermissions::AP_NONE:
02402 snprintf(buffer, MAX_STRING, "* %s None\n", txt);
02403 break;
02404 case LLAggregatePermissions::AP_SOME:
02405 snprintf(buffer, MAX_STRING, "* %s Some\n", txt);
02406 break;
02407 case LLAggregatePermissions::AP_ALL:
02408 snprintf(buffer, MAX_STRING, "* %s All\n", txt);
02409 break;
02410 case LLAggregatePermissions::AP_EMPTY:
02411 default:
02412 break;
02413 }
02414 string.append(buffer);
02415 }
02416
02417 const char* build_extensions_string(LLFilePicker::ELoadFilter filter)
02418 {
02419 switch(filter)
02420 {
02421 #if LL_WINDOWS
02422 case LLFilePicker::FFLOAD_IMAGE:
02423 return IMAGE_EXTENSIONS;
02424 case LLFilePicker::FFLOAD_WAV:
02425 return SOUND_EXTENSIONS;
02426 case LLFilePicker::FFLOAD_ANIM:
02427 return ANIM_EXTENSIONS;
02428 case LLFilePicker::FFLOAD_SLOBJECT:
02429 return SLOBJECT_EXTENSIONS;
02430 #ifdef _CORY_TESTING
02431 case LLFilePicker::FFLOAD_GEOMETRY:
02432 return GEOMETRY_EXTENSIONS;
02433 #endif
02434 case LLFilePicker::FFLOAD_XML:
02435 return XML_EXTENSIONS;
02436 case LLFilePicker::FFLOAD_ALL:
02437 return ALL_FILE_EXTENSIONS;
02438 #endif
02439 default:
02440 return ALL_FILE_EXTENSIONS;
02441 }
02442 }
02443
02444
02445 BOOL enable_buy(void*)
02446 {
02447
02448
02449 if(gSelectMgr->getSelection()->getRootObjectCount() != 1) return FALSE;
02450 LLViewerObject* obj = NULL;
02451 LLSelectNode* node = gSelectMgr->getSelection()->getFirstRootNode();
02452 if(node)
02453 {
02454 obj = node->getObject();
02455 if(!obj) return FALSE;
02456
02457 if(node->mSaleInfo.isForSale() && node->mPermissions->getMaskOwner() & PERM_TRANSFER &&
02458 (node->mPermissions->getMaskOwner() & PERM_COPY || node->mSaleInfo.getSaleType() != LLSaleInfo::FS_COPY))
02459 {
02460 if(obj->permAnyOwner()) return TRUE;
02461 }
02462 }
02463 return FALSE;
02464 }
02465
02466 class LLObjectEnableBuy : public view_listener_t
02467 {
02468 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
02469 {
02470 bool new_value = enable_buy(NULL);
02471 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
02472 return true;
02473 }
02474 };
02475
02476
02477
02478 void handle_buy_object(LLSaleInfo sale_info)
02479 {
02480 if(!gSelectMgr->selectGetAllRootsValid())
02481 {
02482 LLNotifyBox::showXml("UnableToBuyWhileDownloading");
02483 return;
02484 }
02485
02486 LLUUID owner_id;
02487 LLString owner_name;
02488 BOOL owners_identical = gSelectMgr->selectGetOwner(owner_id, owner_name);
02489 if (!owners_identical)
02490 {
02491 LLNotifyBox::showXml("CannotBuyObjectsFromDifferentOwners");
02492 return;
02493 }
02494
02495 LLPermissions perm;
02496 BOOL valid = gSelectMgr->selectGetPermissions(perm);
02497 LLAggregatePermissions ag_perm;
02498 valid &= gSelectMgr->selectGetAggregatePermissions(ag_perm);
02499 if(!valid || !sale_info.isForSale() || !perm.allowTransferTo(gAgent.getID()))
02500 {
02501 LLNotifyBox::showXml("ObjectNotForSale");
02502 return;
02503 }
02504
02505 S32 price = sale_info.getSalePrice();
02506
02507 if (price > 0 && price > gStatusBar->getBalance())
02508 {
02509 LLFloaterBuyCurrency::buyCurrency("This object costs", price);
02510 return;
02511 }
02512
02513 LLFloaterBuy::show(sale_info);
02514 }
02515
02516
02517 void handle_buy_contents(LLSaleInfo sale_info)
02518 {
02519 LLFloaterBuyContents::show(sale_info);
02520 }
02521
02522 void handle_region_dump_temp_asset_data(void*)
02523 {
02524 llinfos << "Dumping temporary asset data to simulator logs" << llendl;
02525 std::vector<std::string> strings;
02526 LLUUID invoice;
02527 send_generic_message("dumptempassetdata", strings, invoice);
02528 }
02529
02530 void handle_region_clear_temp_asset_data(void*)
02531 {
02532 llinfos << "Clearing temporary asset data" << llendl;
02533 std::vector<std::string> strings;
02534 LLUUID invoice;
02535 send_generic_message("cleartempassetdata", strings, invoice);
02536 }
02537
02538 void handle_region_dump_settings(void*)
02539 {
02540 LLViewerRegion* regionp = gAgent.getRegion();
02541 if (regionp)
02542 {
02543 llinfos << "Damage: " << (regionp->getAllowDamage() ? "on" : "off") << llendl;
02544 llinfos << "Landmark: " << (regionp->getAllowLandmark() ? "on" : "off") << llendl;
02545 llinfos << "SetHome: " << (regionp->getAllowSetHome() ? "on" : "off") << llendl;
02546 llinfos << "ResetHome: " << (regionp->getResetHomeOnTeleport() ? "on" : "off") << llendl;
02547 llinfos << "SunFixed: " << (regionp->getSunFixed() ? "on" : "off") << llendl;
02548 llinfos << "BlockFly: " << (regionp->getBlockFly() ? "on" : "off") << llendl;
02549 llinfos << "AllowP2P: " << (regionp->getAllowDirectTeleport() ? "on" : "off") << llendl;
02550 llinfos << "Water: " << (regionp->getWaterHeight()) << llendl;
02551 }
02552 }
02553
02554 void handle_dump_group_info(void *)
02555 {
02556 llinfos << "group " << gAgent.mGroupName << llendl;
02557 llinfos << "ID " << gAgent.mGroupID << llendl;
02558 llinfos << "powers " << gAgent.mGroupPowers << llendl;
02559 llinfos << "title " << gAgent.mGroupTitle << llendl;
02560
02561 }
02562
02563 void handle_dump_capabilities_info(void *)
02564 {
02565 LLViewerRegion* regionp = gAgent.getRegion();
02566 if (regionp)
02567 {
02568 regionp->logActiveCapabilities();
02569 }
02570 }
02571
02572 void handle_dump_region_object_cache(void*)
02573 {
02574 LLViewerRegion* regionp = gAgent.getRegion();
02575 if (regionp)
02576 {
02577 regionp->dumpCache();
02578 }
02579 }
02580
02581 void handle_dump_focus(void *)
02582 {
02583 LLView *view = gFocusMgr.getKeyboardFocus();
02584
02585 llinfos << "Keyboard focus " << (view ? view->getName() : "(none)") << llendl;
02586 }
02587
02588 class LLSelfStandUp : public view_listener_t
02589 {
02590 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
02591 {
02592 gAgent.setControlFlags(AGENT_CONTROL_STAND_UP);
02593 return true;
02594 }
02595 };
02596
02597 class LLSelfEnableStandUp : public view_listener_t
02598 {
02599 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
02600 {
02601 bool new_value = gAgent.getAvatarObject() && gAgent.getAvatarObject()->mIsSitting;
02602 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
02603 return true;
02604 }
02605 };
02606
02607 BOOL check_admin_override(void*)
02608 {
02609 return gAgent.getAdminOverride();
02610 }
02611
02612 void handle_admin_override_toggle(void*)
02613 {
02614 if(!gAgent.getAdminOverride())
02615 {
02616 gAgent.setAdminOverride(TRUE);
02617 show_debug_menus();
02618 }
02619 else gAgent.setAdminOverride(FALSE);
02620 }
02621
02622 void handle_god_mode(void*)
02623 {
02624 gAgent.requestEnterGodMode();
02625 }
02626
02627 void handle_leave_god_mode(void*)
02628 {
02629 gAgent.requestLeaveGodMode();
02630 }
02631
02632 void set_god_level(U8 god_level)
02633 {
02634 U8 old_god_level = gAgent.getGodLevel();
02635 gAgent.setGodLevel( god_level );
02636 show_debug_menus();
02637 gIMMgr->refresh();
02638 gParcelMgr->notifyObservers();
02639
02640
02641 LLFloaterDirectory::requestClassifieds();
02642
02643
02644 gWorldMap->reset();
02645 gWorldMap->setCurrentLayer(0);
02646
02647
02648 gObjectList.dirtyAllObjectInventory();
02649
02650 LLString::format_map_t args;
02651 if(god_level > GOD_NOT)
02652 {
02653 args["[LEVEL]"] = llformat("%d",(S32)god_level);
02654 if (gInProductionGrid)
02655 {
02656 gMenuBarView->setBackgroundColor( gColors.getColor( "MenuBarGodBgColor" ) );
02657 gStatusBar->setBackgroundColor( gColors.getColor( "MenuBarGodBgColor" ) );
02658 }
02659 else
02660 {
02661 gMenuBarView->setBackgroundColor( gColors.getColor( "MenuNonProductionGodBgColor" ) );
02662 gStatusBar->setBackgroundColor( gColors.getColor( "MenuNonProductionGodBgColor" ) );
02663 }
02664 LLNotifyBox::showXml("EnteringGodMode", args);
02665 }
02666 else
02667 {
02668 args["[LEVEL]"] = llformat("%d",(S32)old_god_level);
02669 if (gInProductionGrid)
02670 {
02671 gMenuBarView->setBackgroundColor( gColors.getColor( "MenuBarBgColor" ) );
02672 gStatusBar->setBackgroundColor( gColors.getColor( "MenuBarBgColor" ) );
02673 }
02674 else
02675 {
02676 gMenuBarView->setBackgroundColor( gColors.getColor( "MenuNonProductionBgColor" ) );
02677 gStatusBar->setBackgroundColor( gColors.getColor( "MenuNonProductionBgColor" ) );
02678 }
02679 LLNotifyBox::showXml("LeavingGodMode", args);
02680 }
02681 }
02682
02683 #ifdef TOGGLE_HACKED_GODLIKE_VIEWER
02684 void handle_toggle_hacked_godmode(void*)
02685 {
02686 gHackGodmode = !gHackGodmode;
02687 set_god_level(gHackGodmode ? GOD_MAINTENANCE : GOD_NOT);
02688 }
02689
02690 BOOL check_toggle_hacked_godmode(void*)
02691 {
02692 return gHackGodmode;
02693 }
02694 #endif
02695
02696 void process_grant_godlike_powers(LLMessageSystem* msg, void**)
02697 {
02698 LLUUID agent_id;
02699 msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id);
02700 LLUUID session_id;
02701 msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_SessionID, session_id);
02702 if((agent_id == gAgent.getID()) && (session_id == gAgent.getSessionID()))
02703 {
02704 U8 god_level;
02705 msg->getU8Fast(_PREHASH_GrantData, _PREHASH_GodLevel, god_level);
02706 set_god_level(god_level);
02707 }
02708 else
02709 {
02710 llwarns << "Grant godlike for wrong agent " << agent_id << llendl;
02711 }
02712 }
02713
02714 void load_url_local_file(const char* file_name)
02715 {
02716 if( gAgent.cameraMouselook() )
02717 {
02718 gAgent.changeCameraToDefault();
02719 }
02720
02721 #if LL_DARWIN || LL_LINUX || LL_SOLARIS
02722
02723 if(gViewerWindow->mWindow->getFullscreen())
02724 {
02725 gViewerWindow->toggleFullscreen(TRUE);
02726 }
02727 #endif
02728
02729
02730
02731
02732
02733 std::string full_path = "file:///";
02734 full_path.append(gDirUtilp->getAppRODataDir());
02735 full_path.append(gDirUtilp->getDirDelimiter());
02736 full_path.append(file_name);
02737
02738 LLWeb::loadURL(full_path.c_str());
02739 }
02740
02741
02742
02743
02744
02745
02746
02747
02748
02749
02750
02751
02752
02753
02754
02755
02756
02757
02758
02759
02760
02761
02762
02763
02764
02765
02766
02767
02768
02769
02770
02771
02772
02773
02774
02775
02776 BOOL is_agent_friend(const LLUUID& agent_id)
02777 {
02778 return (LLAvatarTracker::instance().getBuddyInfo(agent_id) != NULL);
02779 }
02780
02781 BOOL is_agent_mappable(const LLUUID& agent_id)
02782 {
02783 return (is_agent_friend(agent_id) &&
02784 LLAvatarTracker::instance().getBuddyInfo(agent_id)->isOnline() &&
02785 LLAvatarTracker::instance().getBuddyInfo(agent_id)->isRightGrantedFrom(LLRelationship::GRANT_MAP_LOCATION)
02786 );
02787 }
02788
02789
02790
02791
02792
02793
02794
02795
02796
02797
02798
02799
02800
02801
02802
02803
02804
02805
02806
02807
02808
02809
02810 class LLAvatarEnableAddFriend : public view_listener_t
02811 {
02812 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
02813 {
02814 LLVOAvatar* avatar = find_avatar_from_object(gViewerWindow->lastObjectHit());
02815 bool new_value = avatar && !is_agent_friend(avatar->getID());
02816 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
02817 return true;
02818 }
02819 };
02820
02821 void request_friendship(const LLUUID& dest_id)
02822 {
02823 LLViewerObject* dest = gObjectList.findObject(dest_id);
02824 if(dest && dest->isAvatar())
02825 {
02826 LLString fullname;
02827 LLString::format_map_t args;
02828 LLNameValue* nvfirst = dest->getNVPair("FirstName");
02829 LLNameValue* nvlast = dest->getNVPair("LastName");
02830 if(nvfirst && nvlast)
02831 {
02832 args["[FIRST]"] = nvfirst->getString();
02833 args["[LAST]"] = nvlast->getString();
02834 fullname = nvfirst->getString();
02835 fullname += " ";
02836 fullname += nvlast->getString();
02837 }
02838 if (!fullname.empty())
02839 {
02840 LLPanelFriends::requestFriendship(dest_id, fullname);
02841 LLNotifyBox::showXml("OfferedFriendship", args);
02842 }
02843 else
02844 {
02845 gViewerWindow->alertXml("CantOfferFriendship");
02846 }
02847 }
02848 }
02849
02850
02851 class LLEditEnableCustomizeAvatar : public view_listener_t
02852 {
02853 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
02854 {
02855 bool new_value = gAgent.getWearablesLoaded();
02856 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
02857 return true;
02858 }
02859 };
02860
02861 bool handle_sit_or_stand()
02862 {
02863 LLViewerObject *object = gObjectList.findObject(gLastHitNonFloraObjectID);
02864 if (!object)
02865 {
02866 return true;
02867 }
02868
02869 if (sitting_on_selection())
02870 {
02871 gAgent.setControlFlags(AGENT_CONTROL_STAND_UP);
02872 return true;
02873 }
02874
02875
02876
02877 if (object && object->getPCode() == LL_PCODE_VOLUME)
02878 {
02879 LLVector3d offset_double = gViewerWindow->lastNonFloraObjectHitOffset();
02880 LLVector3 offset_single;
02881 offset_single.setVec(offset_double);
02882
02883 gMessageSystem->newMessageFast(_PREHASH_AgentRequestSit);
02884 gMessageSystem->nextBlockFast(_PREHASH_AgentData);
02885 gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
02886 gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
02887 gMessageSystem->nextBlockFast(_PREHASH_TargetObject);
02888 gMessageSystem->addUUIDFast(_PREHASH_TargetID, object->mID);
02889 gMessageSystem->addVector3Fast(_PREHASH_Offset, offset_single);
02890
02891 object->getRegion()->sendReliableMessage();
02892 }
02893 return true;
02894 }
02895
02896 class LLObjectSitOrStand : public view_listener_t
02897 {
02898 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
02899 {
02900 return handle_sit_or_stand();
02901 }
02902 };
02903
02904 void near_sit_down_point(BOOL success, void *)
02905 {
02906 if (success)
02907 {
02908 gAgent.setFlying(FALSE);
02909 gAgent.setControlFlags(AGENT_CONTROL_SIT_ON_GROUND);
02910
02911
02912 LLFirstUse::useSit();
02913 }
02914 }
02915
02916 class LLLandSit : public view_listener_t
02917 {
02918 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
02919 {
02920 gAgent.setControlFlags(AGENT_CONTROL_STAND_UP);
02921 gParcelMgr->deselectLand();
02922
02923 LLVector3d posGlobal = gLastHitPosGlobal;
02924
02925 LLQuaternion target_rot;
02926 if (gAgent.getAvatarObject())
02927 {
02928 target_rot = gAgent.getAvatarObject()->getRotation();
02929 }
02930 else
02931 {
02932 target_rot = gAgent.getFrameAgent().getQuaternion();
02933 }
02934 gAgent.startAutoPilotGlobal(posGlobal, "Sit", &target_rot, near_sit_down_point, NULL, 0.7f);
02935 return true;
02936 }
02937 };
02938
02939 void show_permissions_control(void*)
02940 {
02941 LLFloaterPermissionsMgr* floaterp = LLFloaterPermissionsMgr::show();
02942 floaterp->mPermissions->addPermissionsData("foo1", LLUUID::null, 0);
02943 floaterp->mPermissions->addPermissionsData("foo2", LLUUID::null, 0);
02944 floaterp->mPermissions->addPermissionsData("foo3", LLUUID::null, 0);
02945 }
02946
02947 #if 0 // Unused (these just modify AudioInfoPage which is not used anywhere in the code
02948 void handle_audio_status_1(void*)
02949 {
02950 S32 page = gSavedSettings.getS32("AudioInfoPage");
02951 if (1 == page)
02952 {
02953 page = 0;
02954 }
02955 else
02956 {
02957 page = 1;
02958 }
02959 gSavedSettings.setS32("AudioInfoPage", page);
02960 }
02961
02962 void handle_audio_status_2(void*)
02963 {
02964 S32 page = gSavedSettings.getS32("AudioInfoPage");
02965 if (2 == page)
02966 {
02967 page = 0;
02968 }
02969 else
02970 {
02971 page = 2;
02972 }
02973 gSavedSettings.setS32("AudioInfoPage", page);
02974 }
02975
02976 void handle_audio_status_3(void*)
02977 {
02978 S32 page = gSavedSettings.getS32("AudioInfoPage");
02979 if (3 == page)
02980 {
02981 page = 0;
02982 }
02983 else
02984 {
02985 page = 3;
02986 }
02987 gSavedSettings.setS32("AudioInfoPage", page);
02988 }
02989
02990 void handle_audio_status_4(void*)
02991 {
02992 S32 page = gSavedSettings.getS32("AudioInfoPage");
02993 if (4 == page)
02994 {
02995 page = 0;
02996 }
02997 else
02998 {
02999 page = 4;
03000 }
03001 gSavedSettings.setS32("AudioInfoPage", page);
03002 }
03003 #endif
03004
03005 void manage_landmarks(void*)
03006 {
03007 LLFloaterLandmark::showInstance(1);
03008 }
03009
03010 void create_new_landmark(void*)
03011 {
03012
03013
03014
03015 LLViewerRegion* agent_region = gAgent.getRegion();
03016 if(!agent_region)
03017 {
03018 llwarns << "No agent region" << llendl;
03019 return;
03020 }
03021 LLParcel* agent_parcel = gParcelMgr->getAgentParcel();
03022 if (!agent_parcel)
03023 {
03024 llwarns << "No agent parcel" << llendl;
03025 return;
03026 }
03027 if (!agent_parcel->getAllowLandmark()
03028 && !LLViewerParcelMgr::isParcelOwnedByAgent(agent_parcel, GP_LAND_ALLOW_LANDMARK))
03029 {
03030 gViewerWindow->alertXml("CannotCreateLandmarkNotOwner");
03031 return;
03032 }
03033
03034 LLUUID folder_id;
03035 folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK);
03036 std::string pos_string;
03037 gAgent.buildLocationString(pos_string);
03038
03039 create_inventory_item(gAgent.getID(), gAgent.getSessionID(),
03040 folder_id, LLTransactionID::tnull,
03041 pos_string, pos_string,
03042 LLAssetType::AT_LANDMARK,
03043 LLInventoryType::IT_LANDMARK,
03044 NOT_WEARABLE, PERM_ALL,
03045 NULL);
03046 }
03047
03048 void landmark_menu_action(void* userdata)
03049 {
03050 LLUUID item_id = *(LLUUID*)userdata;
03051
03052 LLViewerInventoryItem* itemp = gInventory.getItem(item_id);
03053 if (itemp)
03054 {
03055 open_landmark(itemp, itemp->getName(), FALSE);
03056 }
03057 }
03058
03059 void reload_ui(void *)
03060 {
03061 gUICtrlFactory->rebuild();
03062 }
03063
03064 class LLWorldFly : public view_listener_t
03065 {
03066 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
03067 {
03068 gAgent.toggleFlying();
03069 return true;
03070 }
03071 };
03072
03073 void handle_agent_stop_moving(void*)
03074 {
03075
03076 gAgent.setControlFlags(AGENT_CONTROL_STOP);
03077
03078
03079 gAgent.stopAutoPilot();
03080 }
03081
03082 void print_packets_lost(void*)
03083 {
03084 gWorldPointer->printPacketsLost();
03085 }
03086
03087
03088 void drop_packet(void*)
03089 {
03090 gMessageSystem->mPacketRing.dropPackets(1);
03091 }
03092
03093
03094 void velocity_interpolate( void* data )
03095 {
03096 BOOL toggle = gSavedSettings.getBOOL("VelocityInterpolate");
03097 LLMessageSystem* msg = gMessageSystem;
03098 if ( !toggle )
03099 {
03100 msg->newMessageFast(_PREHASH_VelocityInterpolateOn);
03101 msg->nextBlockFast(_PREHASH_AgentData);
03102 msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
03103 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
03104 gAgent.sendReliableMessage();
03105 llinfos << "Velocity Interpolation On" << llendl;
03106 }
03107 else
03108 {
03109 msg->newMessageFast(_PREHASH_VelocityInterpolateOff);
03110 msg->nextBlockFast(_PREHASH_AgentData);
03111 msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
03112 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
03113 gAgent.sendReliableMessage();
03114 llinfos << "Velocity Interpolation Off" << llendl;
03115 }
03116
03117
03118
03119
03120
03121
03122
03123
03124 if( data )
03125 {
03126 gSavedSettings.setBOOL( static_cast<char*>(data), !toggle );
03127 }
03128 }
03129
03130
03131 void update_fov(S32 increments)
03132 {
03133 F32 old_fov = gCamera->getDefaultFOV();
03134
03135 F32 new_fov = old_fov * pow(1.2f, increments);
03136
03137
03138 new_fov = llclamp(new_fov, MIN_FIELD_OF_VIEW, MAX_FIELD_OF_VIEW);
03139
03140 if (new_fov != old_fov)
03141 {
03142 LLMessageSystem* msg = gMessageSystem;
03143 msg->newMessageFast(_PREHASH_AgentFOV);
03144 msg->nextBlockFast(_PREHASH_AgentData);
03145 msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
03146 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
03147 msg->addU32Fast(_PREHASH_CircuitCode, gMessageSystem->mOurCircuitCode);
03148
03149 msg->nextBlockFast(_PREHASH_FOVBlock);
03150 msg->addU32Fast(_PREHASH_GenCounter, 0);
03151 msg->addF32Fast(_PREHASH_VerticalAngle, new_fov);
03152
03153 gAgent.sendReliableMessage();
03154
03155
03156 gCamera->setDefaultFOV(new_fov);
03157 gCamera->setView(new_fov);
03158 }
03159 }
03160
03161 class LLViewZoomOut : public view_listener_t
03162 {
03163 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
03164 {
03165 update_fov(1);
03166 return true;
03167 }
03168 };
03169
03170 class LLViewZoomIn : public view_listener_t
03171 {
03172 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
03173 {
03174 update_fov(-1);
03175 return true;
03176 }
03177 };
03178
03179 class LLViewZoomDefault : public view_listener_t
03180 {
03181 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
03182 {
03183 F32 old_fov = gCamera->getView();
03184
03185 F32 new_fov = DEFAULT_FIELD_OF_VIEW;
03186
03187 if (new_fov != old_fov)
03188 {
03189 LLMessageSystem* msg = gMessageSystem;
03190 msg->newMessageFast(_PREHASH_AgentFOV);
03191 msg->nextBlockFast(_PREHASH_AgentData);
03192 msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
03193 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
03194 msg->addU32Fast(_PREHASH_CircuitCode, gMessageSystem->mOurCircuitCode);
03195 msg->nextBlockFast(_PREHASH_FOVBlock);
03196 msg->addU32Fast(_PREHASH_GenCounter, 0);
03197 msg->addF32Fast(_PREHASH_VerticalAngle, new_fov);
03198
03199 gAgent.sendReliableMessage();
03200
03201
03202 gCamera->setDefaultFOV(new_fov);
03203 gCamera->setView(new_fov);
03204 }
03205 return true;
03206 }
03207 };
03208
03209
03210
03211 void toggle_wind_audio(void)
03212 {
03213 if (gAudiop)
03214 {
03215 gAudiop->enableWind(!(gAudiop->isWindEnabled()));
03216 }
03217 }
03218
03219
03220
03221 BOOL is_inventory_visible( void* user_data )
03222 {
03223 LLInventoryView* iv = reinterpret_cast<LLInventoryView*>(user_data);
03224 if( iv )
03225 {
03226 return iv->getVisible();
03227 }
03228 return FALSE;
03229 }
03230
03231 void handle_show_newest_map(void*)
03232 {
03233 LLFloaterWorldMap::show(NULL, FALSE);
03234 }
03235
03236
03237
03238
03239
03240 class LLHelpMOTD : public view_listener_t
03241 {
03242 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
03243 {
03244 LLString::format_map_t args;
03245 args["[MOTD]"] = gAgent.mMOTD;
03246 gViewerWindow->alertXml("MOTD", args, NULL, NULL);
03247 return true;
03248 }
03249 };
03250
03251
03252
03253
03254 void reset_view_final( BOOL proceed, void* );
03255
03256 void handle_reset_view()
03257 {
03258 if( (CAMERA_MODE_CUSTOMIZE_AVATAR == gAgent.getCameraMode()) && gFloaterCustomize )
03259 {
03260
03261 gFloaterCustomize->askToSaveAllIfDirty( reset_view_final, NULL );
03262 }
03263 else
03264 {
03265 reset_view_final( TRUE, NULL );
03266 }
03267 }
03268
03269 class LLViewResetView : public view_listener_t
03270 {
03271 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
03272 {
03273 handle_reset_view();
03274 return true;
03275 }
03276 };
03277
03278
03279 void reset_view_final( BOOL proceed, void* )
03280 {
03281 if( !proceed )
03282 {
03283 return;
03284 }
03285
03286 gAgent.changeCameraToDefault();
03287
03288 if (LLViewerJoystick::sOverrideCamera)
03289 {
03290 handle_toggle_flycam(NULL);
03291 }
03292
03293 gAgent.resetView(!gFloaterTools->getVisible());
03294 gFloaterTools->close();
03295
03296 gViewerWindow->showCursor();
03297
03298
03299 gToolMgr->setCurrentToolset(gBasicToolset);
03300 }
03301
03302 class LLViewLookAtLastChatter : public view_listener_t
03303 {
03304 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
03305 {
03306 gAgent.lookAtLastChat();
03307 return true;
03308 }
03309 };
03310
03311 class LLViewMouselook : public view_listener_t
03312 {
03313 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
03314 {
03315 if (!gAgent.cameraMouselook())
03316 {
03317 gAgent.changeCameraToMouselook();
03318 }
03319 else
03320 {
03321 gAgent.changeCameraToDefault();
03322 }
03323 return true;
03324 }
03325 };
03326
03327 class LLViewFullscreen : public view_listener_t
03328 {
03329 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
03330 {
03331 gViewerWindow->toggleFullscreen(TRUE);
03332 return true;
03333 }
03334 };
03335
03336 class LLViewDefaultUISize : public view_listener_t
03337 {
03338 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
03339 {
03340 gSavedSettings.setF32("UIScaleFactor", 1.0f);
03341 gSavedSettings.setBOOL("UIAutoScale", FALSE);
03342 gViewerWindow->reshape(gViewerWindow->getWindowDisplayWidth(), gViewerWindow->getWindowDisplayHeight());
03343 return true;
03344 }
03345 };
03346
03347 class LLEditDuplicate : public view_listener_t
03348 {
03349 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
03350 {
03351 if(gEditMenuHandler)
03352 {
03353 gEditMenuHandler->duplicate();
03354 }
03355 return true;
03356 }
03357 };
03358
03359 class LLEditEnableDuplicate : public view_listener_t
03360 {
03361 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
03362 {
03363 bool new_value = gEditMenuHandler && gEditMenuHandler->canDuplicate();
03364 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
03365 return true;
03366 }
03367 };
03368
03369
03370 void disabled_duplicate(void*)
03371 {
03372 if (gSelectMgr->getSelection()->getFirstObject())
03373 {
03374 LLNotifyBox::showXml("CopyFailed");
03375 }
03376 }
03377
03378 void handle_duplicate_in_place(void*)
03379 {
03380 llinfos << "handle_duplicate_in_place" << llendl;
03381
03382 LLVector3 offset(0.f, 0.f, 0.f);
03383 gSelectMgr->selectDuplicate(offset, TRUE);
03384 }
03385
03386 void handle_repeat_duplicate(void*)
03387 {
03388 gSelectMgr->repeatDuplicate();
03389 }
03390
03391 void handle_deed_object_to_group(void*)
03392 {
03393 LLUUID group_id;
03394
03395 gSelectMgr->selectGetGroup(group_id);
03396 gSelectMgr->sendOwner(LLUUID::null, group_id, FALSE);
03397 gViewerStats->incStat(LLViewerStats::ST_RELEASE_COUNT);
03398 }
03399
03400 BOOL enable_deed_object_to_group(void*)
03401 {
03402 if(gSelectMgr->getSelection()->isEmpty()) return FALSE;
03403 LLPermissions perm;
03404 LLUUID group_id;
03405
03406 if (gSelectMgr->selectGetGroup(group_id) &&
03407 gAgent.hasPowerInGroup(group_id, GP_OBJECT_DEED) &&
03408 gSelectMgr->selectGetPermissions(perm) &&
03409 perm.deedToGroup(gAgent.getID(), group_id))
03410 {
03411 return TRUE;
03412 }
03413 return FALSE;
03414 }
03415
03416
03417
03418
03419
03420
03421
03422
03423
03424
03425
03426
03427
03428
03429
03430
03431
03432
03433
03434
03435
03436
03437
03438
03439
03440
03441
03442
03443
03444
03445
03446
03447
03448
03449
03450
03451
03452
03453
03454
03455 void handle_object_owner_permissive(void*)
03456 {
03457
03458 if(gAgent.isGodlike())
03459 {
03460
03461 gSelectMgr->selectionSetObjectPermissions(PERM_BASE, TRUE, PERM_ALL, TRUE);
03462 gSelectMgr->selectionSetObjectPermissions(PERM_OWNER, TRUE, PERM_ALL, TRUE);
03463 }
03464 }
03465
03466 void handle_object_owner_self(void*)
03467 {
03468
03469 if(gAgent.isGodlike())
03470 {
03471 gSelectMgr->sendOwner(gAgent.getID(), gAgent.getGroupID(), TRUE);
03472 }
03473 }
03474
03475
03476 void handle_object_lock(void*)
03477 {
03478 gSelectMgr->selectionSetObjectPermissions(PERM_OWNER, FALSE, PERM_MODIFY);
03479 }
03480
03481 void handle_object_asset_ids(void*)
03482 {
03483
03484 if (gAgent.isGodlike())
03485 {
03486 gSelectMgr->sendGodlikeRequest("objectinfo", "assetids");
03487 }
03488 }
03489
03490 void handle_force_parcel_owner_to_me(void*)
03491 {
03492 gParcelMgr->sendParcelGodForceOwner( gAgent.getID() );
03493 }
03494
03495 void handle_force_parcel_to_content(void*)
03496 {
03497 gParcelMgr->sendParcelGodForceToContent();
03498 }
03499
03500 void handle_claim_public_land(void*)
03501 {
03502 if (gParcelMgr->getSelectionRegion() != gAgent.getRegion())
03503 {
03504 LLNotifyBox::showXml("ClaimPublicLand");
03505 return;
03506 }
03507
03508 LLVector3d west_south_global;
03509 LLVector3d east_north_global;
03510 gParcelMgr->getSelection(west_south_global, east_north_global);
03511 LLVector3 west_south = gAgent.getPosAgentFromGlobal(west_south_global);
03512 LLVector3 east_north = gAgent.getPosAgentFromGlobal(east_north_global);
03513
03514 LLMessageSystem* msg = gMessageSystem;
03515 msg->newMessage("GodlikeMessage");
03516 msg->nextBlock("AgentData");
03517 msg->addUUID("AgentID", gAgent.getID());
03518 msg->addUUID("SessionID", gAgent.getSessionID());
03519 msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null);
03520 msg->nextBlock("MethodData");
03521 msg->addString("Method", "claimpublicland");
03522 msg->addUUID("Invoice", LLUUID::null);
03523 char buffer[32];
03524 snprintf(buffer, sizeof(buffer), "%f", west_south.mV[VX]);
03525 msg->nextBlock("ParamList");
03526 msg->addString("Parameter", buffer);
03527 snprintf(buffer, sizeof(buffer), "%f", west_south.mV[VY]);
03528 msg->nextBlock("ParamList");
03529 msg->addString("Parameter", buffer);
03530 snprintf(buffer, sizeof(buffer), "%f", east_north.mV[VX]);
03531 msg->nextBlock("ParamList");
03532 msg->addString("Parameter", buffer);
03533 snprintf(buffer, sizeof(buffer), "%f", east_north.mV[VY]);
03534 msg->nextBlock("ParamList");
03535 msg->addString("Parameter", buffer);
03536 gAgent.sendReliableMessage();
03537 }
03538
03539 void handle_god_request_havok(void *)
03540 {
03541 if (gAgent.isGodlike())
03542 {
03543 gSelectMgr->sendGodlikeRequest("havok", "infoverbose");
03544 }
03545 }
03546
03547
03548
03549
03550
03551
03552
03553
03554
03555
03556
03557
03558
03559
03560
03561
03562
03563
03564
03565
03566
03567
03568
03569
03570
03571
03572
03573 void handle_god_request_avatar_geometry(void *)
03574 {
03575 if (gAgent.isGodlike())
03576 {
03577 gSelectMgr->sendGodlikeRequest("avatar toggle", NULL);
03578 }
03579 }
03580
03581
03582 void handle_show_overlay_title(void*)
03583 {
03584 gShowOverlayTitle = !gShowOverlayTitle;
03585 gSavedSettings.setBOOL("ShowOverlayTitle", gShowOverlayTitle);
03586 }
03587
03588 void derez_objects(EDeRezDestination dest, const LLUUID& dest_id)
03589 {
03590 if(gAgent.cameraMouselook())
03591 {
03592 gAgent.changeCameraToDefault();
03593 }
03594
03595
03596 std::string error;
03597 LLDynamicArray<LLViewerObject*> derez_objects;
03598
03599
03600
03601 LLViewerRegion* first_region = NULL;
03602 for (LLObjectSelection::valid_root_iterator iter = gSelectMgr->getSelection()->valid_root_begin();
03603 iter != gSelectMgr->getSelection()->valid_root_end(); iter++)
03604 {
03605 LLSelectNode* node = *iter;
03606 LLViewerObject* object = node->getObject();
03607 LLViewerRegion* region = object->getRegion();
03608 if (!first_region)
03609 {
03610 first_region = region;
03611 }
03612 else
03613 {
03614 if(region != first_region)
03615 {
03616
03617
03618
03619
03620 error = "AcquireErrorObjectSpan";
03621 break;
03622 }
03623 }
03624 if (object->isAvatar())
03625 {
03626
03627 continue;
03628 }
03629
03630
03631
03632 if (object->getNVPair("AssetContainer")
03633 && dest != DRD_RETURN_TO_OWNER)
03634 {
03635
03636 llwarns << "Attempt to derez deprecated AssetContainer object type not supported." << llendl;
03637
03638
03639
03640
03641 continue;
03642 }
03643 BOOL can_derez_current = FALSE;
03644 switch(dest)
03645 {
03646 case DRD_TAKE_INTO_AGENT_INVENTORY:
03647 case DRD_TRASH:
03648 if( (node->mPermissions->allowTransferTo(gAgent.getID()) && object->permModify())
03649 || (node->allowOperationOnNode(PERM_OWNER, GP_OBJECT_MANIPULATE)) )
03650 {
03651 can_derez_current = TRUE;
03652 }
03653 break;
03654
03655 case DRD_RETURN_TO_OWNER:
03656 can_derez_current = TRUE;
03657 break;
03658
03659 default:
03660 if((node->mPermissions->allowTransferTo(gAgent.getID())
03661 && object->permCopy())
03662 || gAgent.isGodlike())
03663 {
03664 can_derez_current = TRUE;
03665 }
03666 break;
03667 }
03668 if(can_derez_current)
03669 {
03670 derez_objects.put(object);
03671 }
03672 }
03673
03674
03675
03676
03677
03678
03679 const S32 MAX_ROOTS_PER_PACKET = 250;
03680 const S32 MAX_PACKET_COUNT = 254;
03681 F32 packets = ceil((F32)derez_objects.count() / (F32)MAX_ROOTS_PER_PACKET);
03682 if(packets > (F32)MAX_PACKET_COUNT)
03683 {
03684 error = "AcquireErrorTooManyObjects";
03685 }
03686
03687 if(error.empty() && derez_objects.count() > 0)
03688 {
03689 U8 d = (U8)dest;
03690 LLUUID tid;
03691 tid.generate();
03692 U8 packet_count = (U8)packets;
03693 S32 object_index = 0;
03694 S32 objects_in_packet = 0;
03695 LLMessageSystem* msg = gMessageSystem;
03696 for(U8 packet_number = 0;
03697 packet_number < packet_count;
03698 ++packet_number)
03699 {
03700 msg->newMessageFast(_PREHASH_DeRezObject);
03701 msg->nextBlockFast(_PREHASH_AgentData);
03702 msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
03703 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
03704 msg->nextBlockFast(_PREHASH_AgentBlock);
03705 msg->addUUIDFast(_PREHASH_GroupID, gAgent.getGroupID());
03706 msg->addU8Fast(_PREHASH_Destination, d);
03707 msg->addUUIDFast(_PREHASH_DestinationID, dest_id);
03708 msg->addUUIDFast(_PREHASH_TransactionID, tid);
03709 msg->addU8Fast(_PREHASH_PacketCount, packet_count);
03710 msg->addU8Fast(_PREHASH_PacketNumber, packet_number);
03711 objects_in_packet = 0;
03712 while((object_index < derez_objects.count())
03713 && (objects_in_packet++ < MAX_ROOTS_PER_PACKET))
03714
03715 {
03716 LLViewerObject* object = derez_objects.get(object_index++);
03717 msg->nextBlockFast(_PREHASH_ObjectData);
03718 msg->addU32Fast(_PREHASH_ObjectLocalID, object->getLocalID());
03719
03720 LLHUDEffectSpiral* effectp = (LLHUDEffectSpiral*)gHUDManager->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINT, TRUE);
03721 effectp->setPositionGlobal(object->getPositionGlobal());
03722 effectp->setColor(LLColor4U(gAgent.getEffectColor()));
03723 }
03724 msg->sendReliable(first_region->getHost());
03725 }
03726 make_ui_sound("UISndObjectRezOut");
03727
03728
03729
03730 if (dest != DRD_RETURN_TO_OWNER)
03731 {
03732 gViewerWindow->getWindow()->incBusyCount();
03733 }
03734 }
03735 else if(!error.empty())
03736 {
03737 gViewerWindow->alertXml(error);
03738 }
03739 }
03740
03741 class LLToolsTakeCopy : public view_listener_t
03742 {
03743 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
03744 {
03745 if (gSelectMgr->getSelection()->isEmpty()) return true;
03746
03747 const LLUUID& category_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_OBJECT);
03748 derez_objects(DRD_ACQUIRE_TO_AGENT_INVENTORY, category_id);
03749
03750 return true;
03751 }
03752 };
03753
03754
03755
03756 class LLObjectReturn : public view_listener_t
03757 {
03758 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
03759 {
03760 if (gSelectMgr->getSelection()->isEmpty()) return true;
03761
03762 mObjectSelection = gSelectMgr->getEditSelection();
03763
03764 gViewerWindow->alertXml("ReturnToOwner",
03765 onReturnToOwner,
03766 (void*)this);
03767 return true;
03768 }
03769
03770 static void onReturnToOwner(S32 option, void* data)
03771 {
03772 LLObjectReturn* object_return = (LLObjectReturn*)data;
03773
03774 if (0 == option)
03775 {
03776
03777 derez_objects(DRD_RETURN_TO_OWNER, LLUUID::null);
03778 }
03779
03780
03781 object_return->mObjectSelection = NULL;
03782 }
03783
03784 protected:
03785 LLObjectSelectionHandle mObjectSelection;
03786 };
03787
03788
03789
03790
03791 class LLObjectEnableReturn : public view_listener_t
03792 {
03793 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
03794 {
03795 #ifdef HACKED_GODLIKE_VIEWER
03796 bool new_value = true;
03797 #else
03798 bool new_value = false;
03799 if (gAgent.isGodlike())
03800 {
03801 new_value = true;
03802 }
03803 else
03804 {
03805 LLViewerRegion* region = gAgent.getRegion();
03806 if (region)
03807 {
03808
03809 if (region->canManageEstate())
03810 {
03811 new_value = true;
03812 }
03813 else
03814 {
03815 struct f : public LLSelectedObjectFunctor
03816 {
03817 virtual bool apply(LLViewerObject* obj)
03818 {
03819 return (obj->isOverAgentOwnedLand() ||
03820 obj->isOverGroupOwnedLand() ||
03821 obj->permModify());
03822 }
03823 } func;
03824 const bool firstonly = true;
03825 new_value = gSelectMgr->getSelection()->applyToRootObjects(&func, firstonly);
03826 }
03827 }
03828 }
03829 #endif
03830 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
03831 return true;
03832 }
03833 };
03834
03835 void force_take_copy(void*)
03836 {
03837 if (gSelectMgr->getSelection()->isEmpty()) return;
03838 const LLUUID& category_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_OBJECT);
03839 derez_objects(DRD_FORCE_TO_GOD_INVENTORY, category_id);
03840 }
03841
03842 void handle_take()
03843 {
03844
03845
03846 if(gSelectMgr->getSelection()->isEmpty())
03847 {
03848 return;
03849 }
03850
03851 BOOL you_own_everything = TRUE;
03852 BOOL locked_but_takeable_object = FALSE;
03853 LLUUID category_id;
03854
03855 for (LLObjectSelection::root_iterator iter = gSelectMgr->getSelection()->root_begin();
03856 iter != gSelectMgr->getSelection()->root_end(); iter++)
03857 {
03858 LLSelectNode* node = *iter;
03859 LLViewerObject* object = node->getObject();
03860 if(object)
03861 {
03862 if(!object->permYouOwner())
03863 {
03864 you_own_everything = FALSE;
03865 }
03866
03867 if(!object->permMove())
03868 {
03869 locked_but_takeable_object = TRUE;
03870 }
03871 }
03872 if(node->mFolderID.notNull())
03873 {
03874 if(category_id.isNull())
03875 {
03876 category_id = node->mFolderID;
03877 }
03878 else if(category_id != node->mFolderID)
03879 {
03880
03881
03882 category_id.setNull();
03883 break;
03884 }
03885 }
03886 }
03887 if(category_id.notNull())
03888 {
03889
03890
03891 if(!gInventory.getCategory(category_id))
03892 {
03893
03894 category_id.setNull();
03895 }
03896 if(category_id.notNull())
03897 {
03898
03899 LLUUID trash;
03900 trash = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH);
03901 if(category_id == trash || gInventory.isObjectDescendentOf(category_id, trash))
03902 {
03903 category_id.setNull();
03904 }
03905
03906
03907 if(gInventory.isObjectDescendentOf(category_id, gInventoryLibraryRoot))
03908 {
03909 category_id.setNull();
03910 }
03911
03912 }
03913 }
03914 if(category_id.isNull())
03915 {
03916 category_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_OBJECT);
03917 }
03918 LLUUID* cat_id = new LLUUID(category_id);
03919 if(locked_but_takeable_object ||
03920 !you_own_everything)
03921 {
03922 if(locked_but_takeable_object && you_own_everything)
03923 {
03924 gViewerWindow->alertXml("ConfirmObjectTakeLock",
03925 confirm_take,
03926 (void*)cat_id);
03927
03928 }
03929 else if(!locked_but_takeable_object && !you_own_everything)
03930 {
03931 gViewerWindow->alertXml("ConfirmObjectTakeNoOwn",
03932 confirm_take,
03933 (void*)cat_id);
03934 }
03935 else
03936 {
03937 gViewerWindow->alertXml("ConfirmObjectTakeLockNoOwn",
03938 confirm_take,
03939 (void*)cat_id);
03940 }
03941
03942
03943 }
03944
03945 else
03946 {
03947 confirm_take(0, (void*)cat_id);
03948 }
03949 }
03950
03951 void confirm_take(S32 option, void* data)
03952 {
03953 LLUUID* cat_id = (LLUUID*)data;
03954 if(!cat_id) return;
03955 if(enable_take() && (option == 0))
03956 {
03957 derez_objects(DRD_TAKE_INTO_AGENT_INVENTORY, *cat_id);
03958 }
03959 delete cat_id;
03960 }
03961
03962
03963
03964
03965 BOOL enable_take()
03966 {
03967 if (sitting_on_selection())
03968 {
03969 return FALSE;
03970 }
03971
03972 for (LLObjectSelection::valid_root_iterator iter = gSelectMgr->getSelection()->valid_root_begin();
03973 iter != gSelectMgr->getSelection()->valid_root_end(); iter++)
03974 {
03975 LLSelectNode* node = *iter;
03976 LLViewerObject* object = node->getObject();
03977 if (object->isAvatar())
03978 {
03979
03980 continue;
03981 }
03982
03983 #ifdef HACKED_GODLIKE_VIEWER
03984 return TRUE;
03985 #else
03986 # ifdef TOGGLE_HACKED_GODLIKE_VIEWER
03987 if (!gInProductionGrid && gAgent.isGodlike())
03988 {
03989 return TRUE;
03990 }
03991 # endif
03992 if((node->mPermissions->allowTransferTo(gAgent.getID())
03993 && object->permModify())
03994 || (node->mPermissions->getOwner() == gAgent.getID()))
03995 {
03996 return TRUE;
03997 }
03998 #endif
03999 }
04000 return FALSE;
04001 }
04002
04003 class LLToolsBuyOrTake : public view_listener_t
04004 {
04005 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
04006 {
04007 if (gSelectMgr->getSelection()->isEmpty())
04008 {
04009 return true;
04010 }
04011
04012 if (is_selection_buy_not_take())
04013 {
04014 S32 total_price = selection_price();
04015
04016 if (total_price <= gStatusBar->getBalance() || total_price == 0)
04017 {
04018 handle_buy(NULL);
04019 }
04020 else
04021 {
04022 LLFloaterBuyCurrency::buyCurrency(
04023 "Buying this costs", total_price);
04024 }
04025 }
04026 else
04027 {
04028 handle_take();
04029 }
04030 return true;
04031 }
04032 };
04033
04034 class LLToolsEnableBuyOrTake : public view_listener_t
04035 {
04036 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
04037 {
04038 bool is_buy = is_selection_buy_not_take();
04039 bool new_value = is_buy ? enable_buy(NULL) : enable_take();
04040 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
04041
04042
04043 LLString label;
04044 LLString buy_text;
04045 LLString take_text;
04046 LLString param = userdata["data"].asString();
04047 LLString::size_type offset = param.find(",");
04048 if (offset != param.npos)
04049 {
04050 buy_text = param.substr(0, offset);
04051 take_text = param.substr(offset+1);
04052 }
04053 if (is_buy)
04054 {
04055 label = buy_text;
04056 }
04057 else
04058 {
04059 label = take_text;
04060 }
04061 gMenuHolder->childSetText("Pie Object Take", label);
04062 gMenuHolder->childSetText("Menu Object Take", label);
04063
04064 return true;
04065 }
04066 };
04067
04068
04069
04070
04071
04072
04073
04074
04075
04076
04077
04078
04079
04080
04081
04082
04083
04084 BOOL is_selection_buy_not_take()
04085 {
04086 for (LLObjectSelection::root_iterator iter = gSelectMgr->getSelection()->root_begin();
04087 iter != gSelectMgr->getSelection()->root_end(); iter++)
04088 {
04089 LLSelectNode* node = *iter;
04090 LLViewerObject* obj = node->getObject();
04091 if(obj && !(obj->permYouOwner()) && (node->mSaleInfo.isForSale()))
04092 {
04093
04094
04095 return TRUE;
04096 }
04097 }
04098 return FALSE;
04099 }
04100
04101 S32 selection_price()
04102 {
04103 S32 total_price = 0;
04104 for (LLObjectSelection::root_iterator iter = gSelectMgr->getSelection()->root_begin();
04105 iter != gSelectMgr->getSelection()->root_end(); iter++)
04106 {
04107 LLSelectNode* node = *iter;
04108 LLViewerObject* obj = node->getObject();
04109 if(obj && !(obj->permYouOwner()) && (node->mSaleInfo.isForSale()))
04110 {
04111
04112
04113 total_price += node->mSaleInfo.getSalePrice();
04114 }
04115 }
04116
04117 return total_price;
04118 }
04119
04120 void callback_show_buy_currency(S32 option, void*)
04121 {
04122 if (0 == option)
04123 {
04124 llinfos << "Loading page " << BUY_CURRENCY_URL << llendl;
04125 LLWeb::loadURL(BUY_CURRENCY_URL);
04126 }
04127 }
04128
04129
04130 void show_buy_currency(const char* extra)
04131 {
04132
04133
04134 std::ostringstream mesg;
04135 if (extra != NULL)
04136 {
04137 mesg << extra << "\n \n";
04138 }
04139 mesg << "Go to " << BUY_CURRENCY_URL << "\nfor information on purchasing currency?";
04140
04141 LLString::format_map_t args;
04142 if (extra != NULL)
04143 {
04144 args["[EXTRA]"] = extra;
04145 }
04146 args["[URL]"] = BUY_CURRENCY_URL;
04147 gViewerWindow->alertXml("PromptGoToCurrencyPage", args,
04148 callback_show_buy_currency);
04149 }
04150
04151 void handle_buy_currency(void*)
04152 {
04153
04154 }
04155
04156 void handle_buy(void*)
04157 {
04158 if (gSelectMgr->getSelection()->isEmpty()) return;
04159
04160 LLSaleInfo sale_info;
04161 BOOL valid = gSelectMgr->selectGetSaleInfo(sale_info);
04162 if (!valid) return;
04163
04164 if (sale_info.getSaleType() == LLSaleInfo::FS_CONTENTS)
04165 {
04166 handle_buy_contents(sale_info);
04167 }
04168 else
04169 {
04170 handle_buy_object(sale_info);
04171 }
04172 }
04173
04174 class LLObjectBuy : public view_listener_t
04175 {
04176 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
04177 {
04178 handle_buy(NULL);
04179 return true;
04180 }
04181 };
04182
04183 BOOL sitting_on_selection()
04184 {
04185 LLSelectNode* node = gSelectMgr->getSelection()->getFirstRootNode();
04186 if (!node)
04187 {
04188 return FALSE;
04189 }
04190
04191 if (!node->mValid)
04192 {
04193 return FALSE;
04194 }
04195
04196 LLViewerObject* root_object = node->getObject();
04197 if (!root_object)
04198 {
04199 return FALSE;
04200 }
04201
04202
04203 LLVOAvatar* avatar = gAgent.getAvatarObject();
04204 if (!avatar)
04205 {
04206 return FALSE;
04207 }
04208
04209 return (avatar->mIsSitting && avatar->getRoot() == root_object);
04210 }
04211
04212 class LLToolsSaveToInventory : public view_listener_t
04213 {
04214 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
04215 {
04216 if(enable_save_into_inventory(NULL))
04217 {
04218 derez_objects(DRD_SAVE_INTO_AGENT_INVENTORY, LLUUID::null);
04219 }
04220 return true;
04221 }
04222 };
04223
04224 class LLToolsSaveToObjectInventory : public view_listener_t
04225 {
04226 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
04227 {
04228 if(gSelectMgr)
04229 {
04230 LLSelectNode* node = gSelectMgr->getSelection()->getFirstRootNode();
04231 if(node && (node->mValid) && (!node->mFromTaskID.isNull()))
04232 {
04233
04234 derez_objects(DRD_SAVE_INTO_TASK_INVENTORY, node->mFromTaskID);
04235 }
04236 }
04237 return true;
04238 }
04239 };
04240
04241
04242 class LLToolsSnapObjectXY : public view_listener_t
04243 {
04244 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
04245 {
04246 F64 snap_size = (F64)gSavedSettings.getF32("GridResolution");
04247
04248 for (LLObjectSelection::root_iterator iter = gSelectMgr->getSelection()->root_begin();
04249 iter != gSelectMgr->getSelection()->root_end(); iter++)
04250 {
04251 LLSelectNode* node = *iter;
04252 LLViewerObject* obj = node->getObject();
04253 if (obj->permModify())
04254 {
04255 LLVector3d pos_global = obj->getPositionGlobal();
04256 F64 round_x = fmod(pos_global.mdV[VX], snap_size);
04257 if (round_x < snap_size * 0.5)
04258 {
04259
04260 pos_global.mdV[VX] -= round_x;
04261 }
04262 else
04263 {
04264
04265 pos_global.mdV[VX] -= round_x;
04266 pos_global.mdV[VX] += snap_size;
04267 }
04268
04269 F64 round_y = fmod(pos_global.mdV[VY], snap_size);
04270 if (round_y < snap_size * 0.5)
04271 {
04272 pos_global.mdV[VY] -= round_y;
04273 }
04274 else
04275 {
04276 pos_global.mdV[VY] -= round_y;
04277 pos_global.mdV[VY] += snap_size;
04278 }
04279
04280 obj->setPositionGlobal(pos_global, FALSE);
04281 }
04282 }
04283 gSelectMgr->sendMultipleUpdate(UPD_POSITION);
04284 return true;
04285 }
04286 };
04287
04288
04289
04290
04291
04292
04293
04294
04295
04296 class LLToolsEnableLink : public view_listener_t
04297 {
04298 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
04299 {
04300 bool new_value = false;
04301
04302
04303
04304
04305 if (!gSavedSettings.getBOOL("EditLinkedParts"))
04306 {
04307 if(gSelectMgr->selectGetAllRootsValid() && gSelectMgr->getSelection()->getRootObjectCount() >= 2)
04308 {
04309 struct f : public LLSelectedObjectFunctor
04310 {
04311 virtual bool apply(LLViewerObject* object)
04312 {
04313 return object->permModify();
04314 }
04315 } func;
04316 const bool firstonly = true;
04317 new_value = gSelectMgr->getSelection()->applyToRootObjects(&func, firstonly);
04318 }
04319 }
04320 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
04321 return true;
04322 }
04323 };
04324
04325 class LLToolsLink : public view_listener_t
04326 {
04327 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
04328 {
04329 if(!gSelectMgr->selectGetAllRootsValid())
04330 {
04331 LLNotifyBox::showXml("UnableToLinkWhileDownloading");
04332 return true;
04333 }
04334
04335 S32 object_count = gSelectMgr->getSelection()->getObjectCount();
04336 if (object_count > MAX_CHILDREN_PER_TASK + 1)
04337 {
04338 LLStringBase<char>::format_map_t args;
04339 args["[COUNT]"] = llformat("%d", object_count);
04340 int max = MAX_CHILDREN_PER_TASK+1;
04341 args["[MAX]"] = llformat("%d", max);
04342 gViewerWindow->alertXml("UnableToLinkObjects", args);
04343 return true;
04344 }
04345
04346 if(gSelectMgr->getSelection()->getRootObjectCount() < 2)
04347 {
04348 gViewerWindow->alertXml("CannotLinkIncompleteSet");
04349 return true;
04350 }
04351 if(!gSelectMgr->selectGetRootsModify())
04352 {
04353 gViewerWindow->alertXml("CannotLinkModify");
04354 return true;
04355 }
04356 LLUUID owner_id;
04357 LLString owner_name;
04358 if(!gSelectMgr->selectGetOwner(owner_id, owner_name))
04359 {
04360
04361
04362
04363 gViewerWindow->alertXml("CannotLinkDifferentOwners");
04364 return true;
04365 }
04366 gSelectMgr->sendLink();
04367 return true;
04368 }
04369 };
04370
04371 class LLToolsEnableUnlink : public view_listener_t
04372 {
04373 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
04374 {
04375 bool new_value = gSelectMgr->selectGetAllRootsValid() &&
04376 gSelectMgr->getSelection()->getFirstEditableObject() &&
04377 !gSelectMgr->getSelection()->getFirstEditableObject()->isAttachment();
04378 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
04379 return true;
04380 }
04381 };
04382
04383 class LLToolsUnlink : public view_listener_t
04384 {
04385 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
04386 {
04387 gSelectMgr->sendDelink();
04388 return true;
04389 }
04390 };
04391
04392
04393 class LLToolsStopAllAnimations : public view_listener_t
04394 {
04395 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
04396 {
04397 LLVOAvatar* avatarp = gAgent.getAvatarObject();
04398
04399 if (!avatarp) return true;
04400
04401 avatarp->deactivateAllMotions();
04402
04403 avatarp->processAnimationStateChanges();
04404 return true;
04405 }
04406 };
04407
04408
04409
04410
04411
04412
04413
04414
04415
04416
04417
04418
04419
04420
04421
04422
04423
04424
04425
04426
04427
04428
04429
04430
04431
04432
04433
04434
04435
04436
04437
04438
04439
04440 class LLEditEnableCut : public view_listener_t
04441 {
04442 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
04443 {
04444 bool new_value = gEditMenuHandler && gEditMenuHandler->canCut();
04445 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
04446 return true;
04447 }
04448 };
04449
04450 class LLEditCut : public view_listener_t
04451 {
04452 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
04453 {
04454 if( gEditMenuHandler )
04455 {
04456 gEditMenuHandler->cut();
04457 }
04458 return true;
04459 }
04460 };
04461
04462 class LLEditEnableCopy : public view_listener_t
04463 {
04464 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
04465 {
04466 bool new_value = gEditMenuHandler && gEditMenuHandler->canCopy();
04467 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
04468 return true;
04469 }
04470 };
04471
04472 class LLEditCopy : public view_listener_t
04473 {
04474 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
04475 {
04476 if( gEditMenuHandler )
04477 {
04478 gEditMenuHandler->copy();
04479 }
04480 return true;
04481 }
04482 };
04483
04484 class LLEditEnablePaste : public view_listener_t
04485 {
04486 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
04487 {
04488 bool new_value = gEditMenuHandler && gEditMenuHandler->canPaste();
04489 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
04490 return true;
04491 }
04492 };
04493
04494 class LLEditPaste : public view_listener_t
04495 {
04496 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
04497 {
04498 if( gEditMenuHandler )
04499 {
04500 gEditMenuHandler->paste();
04501 }
04502 return true;
04503 }
04504 };
04505
04506 class LLEditEnableDelete : public view_listener_t
04507 {
04508 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
04509 {
04510 bool new_value = gEditMenuHandler && gEditMenuHandler->canDoDelete();
04511 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
04512 return true;
04513 }
04514 };
04515
04516 class LLEditDelete : public view_listener_t
04517 {
04518 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
04519 {
04520
04521
04522 if( gEditMenuHandler && gEditMenuHandler->canDoDelete())
04523 {
04524 gEditMenuHandler->doDelete();
04525 }
04526
04527
04528 gMenuHolder->hideMenus();
04529
04530
04531
04532 gPieObject->hide(TRUE);
04533 return true;
04534 }
04535 };
04536
04537 class LLObjectEnableDelete : public view_listener_t
04538 {
04539 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
04540 {
04541 bool new_value =
04542 #ifdef HACKED_GODLIKE_VIEWER
04543 TRUE;
04544 #else
04545 # ifdef TOGGLE_HACKED_GODLIKE_VIEWER
04546 (!gInProductionGrid && gAgent.isGodlike()) ||
04547 # endif
04548 (gSelectMgr && gSelectMgr->canDoDelete());
04549 #endif
04550 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
04551 return true;
04552 }
04553 };
04554
04555 class LLEditSearch : public view_listener_t
04556 {
04557 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
04558 {
04559 LLFloaterDirectory::toggleFind(NULL);
04560 return true;
04561 }
04562 };
04563
04564 class LLObjectDelete : public view_listener_t
04565 {
04566 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
04567 {
04568 if (gSelectMgr)
04569 {
04570 gSelectMgr->doDelete();
04571 }
04572
04573
04574 gMenuHolder->hideMenus();
04575
04576
04577
04578 gPieObject->hide(TRUE);
04579 return true;
04580 }
04581 };
04582
04583 void handle_force_delete(void*)
04584 {
04585 gSelectMgr->selectForceDelete();
04586 }
04587
04588 class LLViewEnableLastChatter : public view_listener_t
04589 {
04590 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
04591 {
04592
04593 bool new_value = (gAgent.cameraThirdPerson() && gAgent.getLastChatter().notNull());
04594 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
04595 return true;
04596 }
04597 };
04598
04599 class LLEditEnableDeselect : public view_listener_t
04600 {
04601 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
04602 {
04603 bool new_value = gEditMenuHandler && gEditMenuHandler->canDeselect();
04604 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
04605 return true;
04606 }
04607 };
04608
04609 class LLEditDeselect : public view_listener_t
04610 {
04611 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
04612 {
04613 if( gEditMenuHandler )
04614 {
04615 gEditMenuHandler->deselect();
04616 }
04617 return true;
04618 }
04619 };
04620
04621 class LLEditEnableSelectAll : public view_listener_t
04622 {
04623 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
04624 {
04625 bool new_value = gEditMenuHandler && gEditMenuHandler->canSelectAll();
04626 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
04627 return true;
04628 }
04629 };
04630
04631
04632 class LLEditSelectAll : public view_listener_t
04633 {
04634 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
04635 {
04636 if( gEditMenuHandler )
04637 {
04638 gEditMenuHandler->selectAll();
04639 }
04640 return true;
04641 }
04642 };
04643
04644
04645 class LLEditEnableUndo : public view_listener_t
04646 {
04647 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
04648 {
04649 bool new_value = gEditMenuHandler && gEditMenuHandler->canUndo();
04650 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
04651 return true;
04652 }
04653 };
04654
04655 class LLEditUndo : public view_listener_t
04656 {
04657 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
04658 {
04659 if( gEditMenuHandler && gEditMenuHandler->canUndo() )
04660 {
04661 gEditMenuHandler->undo();
04662 }
04663 return true;
04664 }
04665 };
04666
04667 class LLEditEnableRedo : public view_listener_t
04668 {
04669 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
04670 {
04671 bool new_value = gEditMenuHandler && gEditMenuHandler->canRedo();
04672 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
04673 return true;
04674 }
04675 };
04676
04677 class LLEditRedo : public view_listener_t
04678 {
04679 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
04680 {
04681 if( gEditMenuHandler && gEditMenuHandler->canRedo() )
04682 {
04683 gEditMenuHandler->redo();
04684 }
04685 return true;
04686 }
04687 };
04688
04689
04690
04691 void print_object_info(void*)
04692 {
04693 gSelectMgr->selectionDump();
04694 }
04695
04696
04697 void show_debug_menus()
04698 {
04699
04700 if ( gMenuBarView )
04701 {
04702 BOOL debug = gSavedSettings.getBOOL("UseDebugMenus");
04703
04704 if(debug)
04705 {
04706 LLFirstUse::useDebugMenus();
04707 }
04708
04709 gMenuBarView->setItemVisible(CLIENT_MENU_NAME, debug);
04710 gMenuBarView->setItemEnabled(CLIENT_MENU_NAME, debug);
04711 gMenuBarView->setItemVisible(SERVER_MENU_NAME, debug);
04712 gMenuBarView->setItemEnabled(SERVER_MENU_NAME, debug);
04713
04714
04715 };
04716 }
04717
04718 void toggle_debug_menus(void*)
04719 {
04720 BOOL visible = ! gSavedSettings.getBOOL("UseDebugMenus");
04721 gSavedSettings.setBOOL("UseDebugMenus", visible);
04722 show_debug_menus();
04723 }
04724
04725
04726 void toggle_map( void* user_data )
04727 {
04728
04729 BOOL checked = gSavedSettings.getBOOL( static_cast<char*>(user_data) );
04730 gSavedSettings.setBOOL( static_cast<char*>(user_data), !checked );
04731 if (checked)
04732 {
04733 gFloaterMap->close();
04734 }
04735 else
04736 {
04737 gFloaterMap->open();
04738 }
04739 }
04740
04741
04742 LLUUID gExporterRequestID;
04743 LLString gExportDirectory;
04744
04745 LLUploadDialog *gExportDialog = NULL;
04746
04747 void handle_export_selected( void * )
04748 {
04749 LLObjectSelectionHandle selection = gSelectMgr->getSelection();
04750 if (selection->isEmpty())
04751 {
04752 return;
04753 }
04754 llinfos << "Exporting selected objects:" << llendl;
04755
04756 gExporterRequestID.generate();
04757 gExportDirectory = "";
04758
04759 LLMessageSystem* msg = gMessageSystem;
04760 msg->newMessageFast(_PREHASH_ObjectExportSelected);
04761 msg->nextBlockFast(_PREHASH_AgentData);
04762 msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
04763 msg->addUUIDFast(_PREHASH_RequestID, gExporterRequestID);
04764 msg->addS16Fast(_PREHASH_VolumeDetail, 4);
04765
04766 for (LLObjectSelection::root_iterator iter = selection->root_begin();
04767 iter != selection->root_end(); iter++)
04768 {
04769 LLSelectNode* node = *iter;
04770 LLViewerObject* object = node->getObject();
04771 msg->nextBlockFast(_PREHASH_ObjectData);
04772 msg->addUUIDFast(_PREHASH_ObjectID, object->getID());
04773 llinfos << "Object: " << object->getID() << llendl;
04774 }
04775 msg->sendReliable(gAgent.getRegion()->getHost());
04776
04777 gExportDialog = LLUploadDialog::modalUploadDialog("Exporting selected objects...");
04778 }
04779
04780 BOOL menu_check_build_tool( void* user_data )
04781 {
04782 S32 index = (intptr_t) user_data;
04783 return gToolMgr->getCurrentToolset()->isToolSelected( index );
04784 }
04785
04786 void handle_reload_settings(void*)
04787 {
04788 gSavedSettings.resetToDefaults();
04789 gSavedSettings.loadFromFile(gSettingsFileName, TRUE);
04790
04791 llinfos << "Loading colors from colors.xml" << llendl;
04792 std::string color_file = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"colors.xml");
04793 gColors.resetToDefaults();
04794 gColors.loadFromFile(color_file, FALSE, TYPE_COL4U);
04795 }
04796
04797 class LLWorldSetHomeLocation : public view_listener_t
04798 {
04799 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
04800 {
04801
04802
04803
04804 gAgent.setStartPosition(START_LOCATION_ID_HOME);
04805 return true;
04806 }
04807 };
04808
04809 class LLWorldTeleportHome : public view_listener_t
04810 {
04811 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
04812 {
04813 gAgent.teleportHome();
04814 return true;
04815 }
04816 };
04817
04818 class LLWorldAlwaysRun : public view_listener_t
04819 {
04820 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
04821 {
04822 if (gAgent.getAlwaysRun())
04823 {
04824 gAgent.clearAlwaysRun();
04825 }
04826 else
04827 {
04828 gAgent.setAlwaysRun();
04829 }
04830 LLMessageSystem *msg = gMessageSystem;
04831
04832
04833 msg->newMessageFast(_PREHASH_SetAlwaysRun);
04834 msg->nextBlockFast(_PREHASH_AgentData);
04835 msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
04836 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
04837 msg->addBOOLFast(_PREHASH_AlwaysRun, gAgent.getAlwaysRun() );
04838 gAgent.sendReliableMessage();
04839 return true;
04840 }
04841 };
04842
04843 class LLWorldCheckAlwaysRun : public view_listener_t
04844 {
04845 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
04846 {
04847 bool new_value = gAgent.getAlwaysRun();
04848 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
04849 return true;
04850 }
04851 };
04852
04853 class LLWorldSetAway : public view_listener_t
04854 {
04855 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
04856 {
04857 if (gAgent.getAFK())
04858 {
04859 gAgent.clearAFK();
04860 }
04861 else
04862 {
04863 gAgent.setAFK();
04864 }
04865 return true;
04866 }
04867 };
04868
04869 class LLWorldSetBusy : public view_listener_t
04870 {
04871 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
04872 {
04873 if (gAgent.getBusy())
04874 {
04875 gAgent.clearBusy();
04876 }
04877 else
04878 {
04879 gAgent.setBusy();
04880 gViewerWindow->alertXml("BusyModeSet");
04881 }
04882 return true;
04883 }
04884 };
04885
04886
04887 class LLWorldCreateLandmark : public view_listener_t
04888 {
04889 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
04890 {
04891 LLViewerRegion* agent_region = gAgent.getRegion();
04892 if(!agent_region)
04893 {
04894 llwarns << "No agent region" << llendl;
04895 return true;
04896 }
04897 LLParcel* agent_parcel = gParcelMgr->getAgentParcel();
04898 if (!agent_parcel)
04899 {
04900 llwarns << "No agent parcel" << llendl;
04901 return true;
04902 }
04903 if (!agent_parcel->getAllowLandmark()
04904 && !LLViewerParcelMgr::isParcelOwnedByAgent(agent_parcel, GP_LAND_ALLOW_LANDMARK))
04905 {
04906 gViewerWindow->alertXml("CannotCreateLandmarkNotOwner");
04907 return true;
04908 }
04909
04910 LLUUID folder_id;
04911 folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK);
04912 std::string pos_string;
04913 gAgent.buildLocationString(pos_string);
04914
04915 create_inventory_item(gAgent.getID(), gAgent.getSessionID(),
04916 folder_id, LLTransactionID::tnull,
04917 pos_string, pos_string,
04918 LLAssetType::AT_LANDMARK,
04919 LLInventoryType::IT_LANDMARK,
04920 NOT_WEARABLE, PERM_ALL,
04921 NULL);
04922 return true;
04923 }
04924 };
04925
04926 class LLToolsLookAtSelection : public view_listener_t
04927 {
04928 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
04929 {
04930 const F32 PADDING_FACTOR = 2.f;
04931 BOOL zoom = (userdata.asString() == "zoom");
04932 if (!gSelectMgr->getSelection()->isEmpty())
04933 {
04934 gAgent.setFocusOnAvatar(FALSE, ANIMATE);
04935
04936 LLBBox selection_bbox = gSelectMgr->getBBoxOfSelection();
04937 F32 angle_of_view = llmax(0.1f, gCamera->getAspect() > 1.f ? gCamera->getView() * gCamera->getAspect() : gCamera->getView());
04938 F32 distance = selection_bbox.getExtentLocal().magVec() * PADDING_FACTOR / atan(angle_of_view);
04939
04940 LLVector3 obj_to_cam = gCamera->getOrigin() - selection_bbox.getCenterAgent();
04941 obj_to_cam.normVec();
04942
04943 if (zoom)
04944 {
04945 gAgent.setCameraPosAndFocusGlobal(gSelectMgr->getSelectionCenterGlobal() + LLVector3d(obj_to_cam * distance), gSelectMgr->getSelectionCenterGlobal(), gSelectMgr->getSelection()->getFirstObject()->mID );
04946 }
04947 else
04948 {
04949 gAgent.setFocusGlobal( gSelectMgr->getSelectionCenterGlobal(), gSelectMgr->getSelection()->getFirstObject()->mID );
04950 }
04951 }
04952 return true;
04953 }
04954 };
04955
04956 void callback_invite_to_group(LLUUID group_id, void *user_data)
04957 {
04958 std::vector<LLUUID> agent_ids;
04959 agent_ids.push_back(*(LLUUID *)user_data);
04960
04961 LLFloaterGroupInvite::showForGroup(group_id, &agent_ids);
04962 }
04963
04964 void invite_to_group(const LLUUID& dest_id)
04965 {
04966 LLViewerObject* dest = gObjectList.findObject(dest_id);
04967 if(dest && dest->isAvatar())
04968 {
04969 LLFloaterGroupPicker* widget;
04970 widget = LLFloaterGroupPicker::showInstance(LLSD(gAgent.getID()));
04971 if (widget)
04972 {
04973 widget->center();
04974 widget->setPowersMask(GP_MEMBER_INVITE);
04975 widget->setSelectCallback(callback_invite_to_group, (void *)&dest_id);
04976 }
04977 }
04978 }
04979
04980 class LLAvatarInviteToGroup : public view_listener_t
04981 {
04982 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
04983 {
04984 LLVOAvatar* avatar = find_avatar_from_object( gViewerWindow->lastObjectHit() );
04985 if(avatar)
04986 {
04987 invite_to_group(avatar->getID());
04988 }
04989 return true;
04990 }
04991 };
04992
04993 class LLAvatarAddFriend : public view_listener_t
04994 {
04995 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
04996 {
04997 LLVOAvatar* avatar = find_avatar_from_object( gViewerWindow->lastObjectHit() );
04998 if(avatar && !is_agent_friend(avatar->getID()))
04999 {
05000 request_friendship(avatar->getID());
05001 }
05002 return true;
05003 }
05004 };
05005
05006 void complete_give_money(S32 option, void* user_data)
05007 {
05008 if (option == 0)
05009 {
05010 gAgent.clearBusy();
05011 }
05012
05013 LLObjectSelectionHandle handle(*(LLObjectSelectionHandle*)user_data);
05014 delete (LLObjectSelectionHandle*)user_data;
05015
05016 LLViewerObject* objectp = handle->getPrimaryObject();
05017
05018
05019 if (objectp && objectp->isAttachment())
05020 {
05021 while (objectp && !objectp->isAvatar())
05022 {
05023 objectp = (LLViewerObject*)objectp->getParent();
05024 }
05025 }
05026
05027 if (objectp)
05028 {
05029 if (objectp->isAvatar())
05030 {
05031 const BOOL is_group = FALSE;
05032 LLFloaterPay::payDirectly(&give_money,
05033 objectp->getID(),
05034 is_group);
05035 }
05036 else
05037 {
05038 LLFloaterPay::payViaObject(&give_money, objectp->getID());
05039 }
05040 }
05041 }
05042
05043 bool handle_give_money_dialog()
05044 {
05045 LLObjectSelectionHandle* handlep = new LLObjectSelectionHandle(gSelectMgr->getSelection());
05046 if (gAgent.getBusy())
05047 {
05048
05049 gViewerWindow->alertXml("BusyModePay", complete_give_money, handlep);
05050 }
05051 else
05052 {
05053 complete_give_money(1, handlep);
05054 }
05055 return true;
05056 }
05057
05058 class LLPayObject : public view_listener_t
05059 {
05060 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
05061 {
05062 return handle_give_money_dialog();
05063 }
05064 };
05065
05066 class LLEnablePayObject : public view_listener_t
05067 {
05068 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
05069 {
05070 LLVOAvatar* avatar = find_avatar_from_object(gViewerWindow->lastObjectHit());
05071 bool new_value = (avatar != NULL);
05072 if (!new_value)
05073 {
05074 LLViewerObject* object = gViewerWindow->lastObjectHit();
05075 if( object )
05076 {
05077 LLViewerObject *parent = (LLViewerObject *)object->getParent();
05078 if((object->flagTakesMoney()) || (parent && parent->flagTakesMoney()))
05079 {
05080 new_value = true;
05081 }
05082 }
05083 }
05084 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
05085 return true;
05086 }
05087 };
05088
05089 class LLObjectEnableSitOrStand : public view_listener_t
05090 {
05091 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
05092 {
05093 bool new_value = false;
05094 LLViewerObject* dest_object = NULL;
05095 if((dest_object = gObjectList.findObject(gLastHitObjectID)))
05096 {
05097 if(dest_object->getPCode() == LL_PCODE_VOLUME)
05098 {
05099 new_value = true;
05100 }
05101 }
05102 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
05103
05104
05105 LLString label;
05106 LLString sit_text;
05107 LLString stand_text;
05108 LLString param = userdata["data"].asString();
05109 LLString::size_type offset = param.find(",");
05110 if (offset != param.npos)
05111 {
05112 sit_text = param.substr(0, offset);
05113 stand_text = param.substr(offset+1);
05114 }
05115 if (sitting_on_selection())
05116 {
05117 label = stand_text;
05118 }
05119 else
05120 {
05121 LLSelectNode* node = gSelectMgr->getSelection()->getFirstRootNode();
05122 if (node && node->mValid && !node->mSitName.empty())
05123 {
05124 label.assign(node->mSitName);
05125 }
05126 else
05127 {
05128 label = sit_text;
05129 }
05130 }
05131 gMenuHolder->childSetText("Object Sit", label);
05132
05133 return true;
05134 }
05135 };
05136
05137 void edit_ui(void*)
05138 {
05139 LLFloater::setEditModeEnabled(!LLFloater::getEditModeEnabled());
05140 }
05141
05142 void dump_select_mgr(void*)
05143 {
05144 gSelectMgr->dump();
05145 }
05146
05147 void dump_volume_mgr(void*)
05148 {
05149 gVolumeMgr->dump();
05150 }
05151
05152 void dump_inventory(void*)
05153 {
05154 gInventory.dumpInventory();
05155 }
05156
05157
05158 void handle_force_unlock(void*)
05159 {
05160
05161 gSelectMgr->sendOwner(LLUUID::null, LLUUID::null, TRUE);
05162
05163
05164
05165 struct f : public LLSelectedObjectFunctor
05166 {
05167 virtual bool apply(LLViewerObject* object)
05168 {
05169 object->mFlags |= FLAGS_OBJECT_MOVE;
05170 object->mFlags |= FLAGS_OBJECT_MODIFY;
05171 object->mFlags |= FLAGS_OBJECT_COPY;
05172
05173 object->mFlags &= ~FLAGS_OBJECT_ANY_OWNER;
05174 object->mFlags &= ~FLAGS_OBJECT_YOU_OWNER;
05175 return true;
05176 }
05177 } func;
05178 gSelectMgr->getSelection()->applyToObjects(&func);
05179 }
05180
05181
05182 void handle_fullscreen_debug(void*)
05183 {
05184 llinfos << "Width " << gViewerWindow->getWindowWidth() << " Height " << gViewerWindow->getWindowHeight() << llendl;
05185 llinfos << "mouse_x_from_center(100) " << mouse_x_from_center(100) << " y " << mouse_y_from_center(100) << llendl;
05186 }
05187
05188 void handle_crash(void*)
05189 {
05190 llerrs << "This is an llerror" << llendl;
05191 }
05192
05193 class LLWorldForceSun : public view_listener_t
05194 {
05195 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
05196 {
05197 LLString tod = userdata.asString();
05198 LLVector3 sun_direction;
05199 if (tod == "sunrise")
05200 {
05201 sun_direction.setVec(1.0f, 0.f, 0.2f);
05202 }
05203 else if (tod == "noon")
05204 {
05205 sun_direction.setVec(0.0f, 0.3f, 1.0f);
05206 }
05207 else if (tod == "sunset")
05208 {
05209 sun_direction.setVec(-1.0f, 0.f, 0.2f);
05210 }
05211 else if (tod == "midnight")
05212 {
05213 sun_direction.setVec(0.0f, 0.3f, -1.0f);
05214 }
05215 else
05216 {
05217 gSky.setOverrideSun(FALSE);
05218 return true;
05219 }
05220 sun_direction.normVec();
05221 gSky.setOverrideSun(TRUE);
05222 gSky.setSunDirection( sun_direction, LLVector3(0.f, 0.f, 0.f));
05223 return true;
05224 }
05225 };
05226
05227 void handle_dump_followcam(void*)
05228 {
05229 LLFollowCamMgr::dump();
05230 }
05231
05232 BOOL check_flycam(void*)
05233 {
05234 return LLViewerJoystick::sOverrideCamera;
05235 }
05236
05237 void handle_toggle_flycam(void*)
05238 {
05239 LLViewerJoystick::sOverrideCamera = !LLViewerJoystick::sOverrideCamera;
05240 if (LLViewerJoystick::sOverrideCamera)
05241 {
05242 LLViewerJoystick::updateCamera(TRUE);
05243 LLFloaterJoystick::show(NULL);
05244 }
05245 }
05246
05247 void handle_viewer_enable_message_log(void*)
05248 {
05249 gMessageSystem->startLogging();
05250 }
05251
05252 void handle_viewer_disable_message_log(void*)
05253 {
05254 gMessageSystem->stopLogging();
05255 }
05256
05257
05258 class LLShowFloater : public view_listener_t
05259 {
05260 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
05261 {
05262 LLString floater_name = userdata.asString();
05263 if (floater_name == "gestures")
05264 {
05265 LLFloaterGesture::toggleVisibility();
05266 }
05267 else if (floater_name == "appearance")
05268 {
05269 if (gAgent.getWearablesLoaded())
05270 {
05271 gAgent.changeCameraToCustomizeAvatar();
05272 }
05273 }
05274 else if (floater_name == "friends")
05275 {
05276 LLFloaterMyFriends::toggleInstance(0);
05277 }
05278 else if (floater_name == "preferences")
05279 {
05280 LLFloaterPreference::show(NULL);
05281 }
05282 else if (floater_name == "toolbar")
05283 {
05284 LLToolBar::toggle(NULL);
05285 }
05286 else if (floater_name == "chat history")
05287 {
05288 LLFloaterChat::toggleInstance(LLSD());
05289 }
05290 else if (floater_name == "im")
05291 {
05292 LLFloaterChatterBox::toggleInstance(LLSD());
05293 }
05294 else if (floater_name == "inventory")
05295 {
05296 LLInventoryView::toggleVisibility(NULL);
05297 }
05298 else if (floater_name == "mute list")
05299 {
05300 LLFloaterMute::toggle(NULL);
05301 }
05302 else if (floater_name == "camera controls")
05303 {
05304 LLFloaterCamera::toggle(NULL);
05305 }
05306 else if (floater_name == "movement controls")
05307 {
05308 LLFloaterMove::show(NULL);
05309 }
05310 else if (floater_name == "world map")
05311 {
05312 LLFloaterWorldMap::toggle(NULL);
05313 }
05314 else if (floater_name == "mini map")
05315 {
05316 LLFloaterMap::toggle(NULL);
05317 }
05318 else if (floater_name == "stat bar")
05319 {
05320 gDebugView->mStatViewp->setVisible(!gDebugView->mStatViewp->getVisible());
05321 }
05322 else if (floater_name == "my land")
05323 {
05324 LLFloaterLandHoldings::show(NULL);
05325 }
05326 else if (floater_name == "about land")
05327 {
05328 if (gParcelMgr->selectionEmpty())
05329 {
05330 gParcelMgr->selectParcelAt(gAgent.getPositionGlobal());
05331 }
05332
05333 LLFloaterLand::show();
05334 }
05335 else if (floater_name == "buy land")
05336 {
05337 if (gParcelMgr->selectionEmpty())
05338 {
05339 gParcelMgr->selectParcelAt(gAgent.getPositionGlobal());
05340 }
05341
05342 gParcelMgr->startBuyLand();
05343 }
05344 else if (floater_name == "about region")
05345 {
05346 LLFloaterRegionInfo::show((void *)NULL);
05347 }
05348 else if (floater_name == "grid options")
05349 {
05350 LLFloaterBuildOptions::show(NULL);
05351 }
05352 else if (floater_name == "script errors")
05353 {
05354 LLFloaterScriptDebug::show(LLUUID::null);
05355 }
05356 else if (floater_name == "help f1")
05357 {
05358 #if LL_LIBXUL_ENABLED
05359 gViewerHtmlHelp.show( gSavedSettings.getString("HelpHomeURL") );
05360 #endif
05361 }
05362 else if (floater_name == "help in-world")
05363 {
05364 #if LL_LIBXUL_ENABLED
05365 LLFloaterHtml::getInstance()->show( "in-world_help" );
05366 #endif
05367 }
05368 else if (floater_name == "help additional")
05369 {
05370 #if LL_LIBXUL_ENABLED
05371 LLFloaterHtml::getInstance()->show( "additional_help" );
05372 #endif
05373 }
05374 else if (floater_name == "complaint reporter")
05375 {
05376
05377 gMenuHolder->hideMenus();
05378 LLFloaterReporter::showFromMenu(COMPLAINT_REPORT);
05379 }
05380 else if (floater_name == "mean events")
05381 {
05382 if (!gNoRender)
05383 {
05384 LLFloaterBump::show(NULL);
05385 }
05386 }
05387 else if (floater_name == "lag meter")
05388 {
05389 LLFloaterLagMeter::show(NULL);
05390 }
05391 else if (floater_name == "bug reporter")
05392 {
05393
05394 gMenuHolder->hideMenus();
05395 LLFloaterReporter::showFromMenu(BUG_REPORT);
05396 }
05397 else if (floater_name == "buy currency")
05398 {
05399 LLFloaterBuyCurrency::buyCurrency();
05400 }
05401 else if (floater_name == "about")
05402 {
05403 LLFloaterAbout::show(NULL);
05404 }
05405 else if (floater_name == "avatar list")
05406 {
05407 LLFloaterAvatarList::toggle(NULL);
05408 }
05409 else if (floater_name == "event log")
05410 {
05411 LLFloaterEventLog::toggle(NULL);
05412 }
05413 else if (floater_name == "active speakers")
05414 {
05415 LLFloaterActiveSpeakers::toggleInstance(LLSD());
05416 }
05417 else if (floater_name == "project")
05418 {
05419 LLFloaterNetwork2080::toggle(NULL);
05420 }
05421 return true;
05422 }
05423 };
05424
05425 class LLFloaterVisible : public view_listener_t
05426 {
05427 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
05428 {
05429 LLString control_name = userdata["control"].asString();
05430 LLString floater_name = userdata["data"].asString();
05431 bool new_value = false;
05432 if (floater_name == "friends")
05433 {
05434 new_value = LLFloaterMyFriends::instanceVisible(0);
05435 }
05436 else if (floater_name == "toolbar")
05437 {
05438 new_value = LLToolBar::visible(NULL);
05439 }
05440 else if (floater_name == "chat history")
05441 {
05442 new_value = LLFloaterChat::visible(NULL);
05443 }
05444 else if (floater_name == "im")
05445 {
05446 new_value = LLFloaterMyFriends::instanceVisible(0);
05447 }
05448 else if (floater_name == "mute list")
05449 {
05450 new_value = LLFloaterMute::visible(NULL);
05451 }
05452 else if (floater_name == "camera controls")
05453 {
05454 new_value = LLFloaterCamera::visible(NULL);
05455 }
05456 else if (floater_name == "movement controls")
05457 {
05458 new_value = LLFloaterMove::visible(NULL);
05459 }
05460 else if (floater_name == "stat bar")
05461 {
05462 new_value = gDebugView->mStatViewp->getVisible();
05463 }
05464 else if (floater_name == "active speakers")
05465 {
05466 new_value = LLFloaterActiveSpeakers::instanceVisible(LLSD());
05467 }
05468 gMenuHolder->findControl(control_name)->setValue(new_value);
05469 return true;
05470 }
05471 };
05472
05473 void callback_show_url(S32 option, void* url)
05474 {
05475 const char* urlp = (const char*)url;
05476 if (0 == option)
05477 {
05478 LLWeb::loadURL(urlp);
05479 }
05480 delete urlp;
05481 }
05482
05483 class LLPromptShowURL : public view_listener_t
05484 {
05485 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
05486 {
05487 LLString param = userdata.asString();
05488 LLString::size_type offset = param.find(",");
05489 if (offset != param.npos)
05490 {
05491 LLString alert = param.substr(0, offset);
05492 LLString url = param.substr(offset+1);
05493 char *url_copy = new char[url.size()+1];
05494 if (url_copy != NULL)
05495 {
05496 strcpy(url_copy, url.c_str());
05497 }
05498 else
05499 {
05500 llerrs << "Memory Allocation Failed" << llendl;
05501 return false;
05502 }
05503 gViewerWindow->alertXml(alert, callback_show_url, url_copy);
05504 }
05505 else
05506 {
05507 llinfos << "PromptShowURL invalid parameters! Expecting \"ALERT,URL\"." << llendl;
05508 }
05509 return true;
05510 }
05511 };
05512
05513 void callback_show_file(S32 option, void* filename)
05514 {
05515 const char* filenamep = (const char*)filename;
05516 if (0 == option)
05517 {
05518 load_url_local_file(filenamep);
05519 }
05520 delete filenamep;
05521 }
05522
05523 class LLPromptShowFile : public view_listener_t
05524 {
05525 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
05526 {
05527 LLString param = userdata.asString();
05528 LLString::size_type offset = param.find(",");
05529 if (offset != param.npos)
05530 {
05531 LLString alert = param.substr(0, offset);
05532 LLString file = param.substr(offset+1);
05533 char *file_copy = new char[file.size()+1];
05534 if (file_copy != NULL)
05535 {
05536 strcpy(file_copy, file.c_str());
05537 }
05538 else
05539 {
05540 llerrs << "Memory Allocation Failed" << llendl;
05541 return false;
05542 }
05543 gViewerWindow->alertXml(alert, callback_show_file, file_copy);
05544 }
05545 else
05546 {
05547 llinfos << "PromptShowFile invalid parameters! Expecting \"ALERT,FILE\"." << llendl;
05548 }
05549 return true;
05550 }
05551 };
05552
05553 class LLShowAgentProfile : public view_listener_t
05554 {
05555 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
05556 {
05557 LLUUID agent_id;
05558 if (userdata.asString() == "agent")
05559 {
05560 agent_id = gAgent.getID();
05561 }
05562 else if (userdata.asString() == "hit object")
05563 {
05564 agent_id = gLastHitObjectID;
05565 }
05566 else
05567 {
05568 agent_id = userdata.asUUID();
05569 }
05570
05571 LLVOAvatar* avatar = find_avatar_from_object(agent_id);
05572 if (avatar)
05573 {
05574 LLFloaterAvatarInfo::show( avatar->getID() );
05575 }
05576 return true;
05577 }
05578 };
05579
05580 class LLShowAgentGroups : public view_listener_t
05581 {
05582 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
05583 {
05584 LLFloaterMyFriends::toggleInstance(1);
05585 return true;
05586 }
05587 };
05588
05589 void handle_focus(void *)
05590 {
05591 if (gDisconnected)
05592 {
05593 return;
05594 }
05595
05596 if (gAgent.getFocusOnAvatar())
05597 {
05598
05599 gAgent.setFocusOnAvatar(FALSE, ANIMATE);
05600 gAgent.setFocusGlobal(gLastHitPosGlobal + gLastHitObjectOffset, gLastHitObjectID);
05601 gAgent.cameraZoomIn(0.666f);
05602 }
05603 else
05604 {
05605 gAgent.setFocusGlobal(gLastHitPosGlobal + gLastHitObjectOffset, gLastHitObjectID);
05606 }
05607
05608 gViewerWindow->moveCursorToCenter();
05609
05610
05611
05612 gToolMgr->getCurrentToolset()->selectTool( gToolCamera );
05613 }
05614
05615 class LLLandEdit : public view_listener_t
05616 {
05617 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
05618 {
05619 if (gAgent.getFocusOnAvatar() && gSavedSettings.getBOOL("EditCameraMovement") )
05620 {
05621
05622 gAgent.setFocusOnAvatar(FALSE, ANIMATE);
05623 gAgent.setFocusGlobal(gLastHitPosGlobal + gLastHitObjectOffset, gLastHitObjectID);
05624
05625 gAgent.cameraOrbitOver( F_PI * 0.25f );
05626 gViewerWindow->moveCursorToCenter();
05627 }
05628 else if ( gSavedSettings.getBOOL("EditCameraMovement") )
05629 {
05630 gAgent.setFocusGlobal(gLastHitPosGlobal + gLastHitObjectOffset, gLastHitObjectID);
05631 gViewerWindow->moveCursorToCenter();
05632 }
05633
05634
05635 gParcelMgr->selectParcelAt( gLastHitPosGlobal );
05636
05637 gFloaterTools->showMore(TRUE);
05638 gFloaterView->bringToFront( gFloaterTools );
05639
05640
05641 gToolMgr->getCurrentToolset()->selectTool( gToolParcel );
05642 return true;
05643 }
05644 };
05645
05646 class LLWorldEnableBuyLand : public view_listener_t
05647 {
05648 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
05649 {
05650 bool new_value = gParcelMgr->canAgentBuyParcel(
05651 gParcelMgr->selectionEmpty()
05652 ? gParcelMgr->getAgentParcel()
05653 : gParcelMgr->getParcelSelection()->getParcel(),
05654 false);
05655 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
05656 return true;
05657 }
05658 };
05659
05660 BOOL enable_buy_land(void*)
05661 {
05662 return gParcelMgr->canAgentBuyParcel(
05663 gParcelMgr->getParcelSelection()->getParcel(), false);
05664 }
05665
05666
05667 void handle_move(void*)
05668 {
05669 if (gAgent.getFocusOnAvatar())
05670 {
05671
05672 gAgent.setFocusOnAvatar(FALSE, ANIMATE);
05673 gAgent.setFocusGlobal(gLastHitPosGlobal + gLastHitObjectOffset, gLastHitObjectID);
05674
05675 gAgent.cameraZoomIn(0.666f);
05676 }
05677 else
05678 {
05679 gAgent.setFocusGlobal(gLastHitPosGlobal + gLastHitObjectOffset, gLastHitObjectID);
05680 }
05681
05682 gViewerWindow->moveCursorToCenter();
05683
05684 gToolMgr->setCurrentToolset(gBasicToolset);
05685 gToolMgr->getCurrentToolset()->selectTool( gToolGrab );
05686 }
05687
05688 class LLObjectAttachToAvatar : public view_listener_t
05689 {
05690 public:
05691 static void setObjectSelection(LLObjectSelectionHandle selection) { sObjectSelection = selection; }
05692
05693 private:
05694 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
05695 {
05696 setObjectSelection(gSelectMgr->getSelection());
05697 LLViewerObject* selectedObject = sObjectSelection->getFirstRootObject();
05698 if (selectedObject)
05699 {
05700 S32 index = userdata.asInteger();
05701 LLViewerJointAttachment* attachment_point = index > 0 ?
05702 gAgent.getAvatarObject()->mAttachmentPoints[index] :
05703 NULL;
05704 confirm_replace_attachment(0, attachment_point);
05705 }
05706 return true;
05707 }
05708
05709 protected:
05710 static LLObjectSelectionHandle sObjectSelection;
05711 };
05712
05713 LLObjectSelectionHandle LLObjectAttachToAvatar::sObjectSelection;
05714
05715 void near_attach_object(BOOL success, void *user_data)
05716 {
05717 if (success)
05718 {
05719 LLViewerJointAttachment *attachment = (LLViewerJointAttachment *)user_data;
05720
05721 U8 attachment_id;
05722 if (attachment)
05723 {
05724 attachment_id = gAgent.getAvatarObject()->mAttachmentPoints.reverseLookup(attachment);
05725 }
05726 else
05727 {
05728
05729 attachment_id = 0;
05730 }
05731 gSelectMgr->sendAttach(attachment_id);
05732 }
05733 LLObjectAttachToAvatar::setObjectSelection(NULL);
05734 }
05735
05736 void confirm_replace_attachment(S32 option, void* user_data)
05737 {
05738 if (option == 0)
05739 {
05740 LLViewerObject* selectedObject = gSelectMgr->getSelection()->getFirstRootObject();
05741 if (selectedObject)
05742 {
05743 const F32 MIN_STOP_DISTANCE = 1.f;
05744 const F32 ARM_LENGTH = 0.5f;
05745 const F32 SCALE_FUDGE = 1.5f;
05746
05747 F32 stop_distance = SCALE_FUDGE * selectedObject->getMaxScale() + ARM_LENGTH;
05748 if (stop_distance < MIN_STOP_DISTANCE)
05749 {
05750 stop_distance = MIN_STOP_DISTANCE;
05751 }
05752
05753 LLVector3 walkToSpot = selectedObject->getPositionAgent();
05754
05755
05756 LLVector3 delta = walkToSpot - gAgent.getPositionAgent();
05757 delta.normVec();
05758 delta = delta * 0.5f;
05759 walkToSpot -= delta;
05760
05761 gAgent.startAutoPilotGlobal(gAgent.getPosGlobalFromAgent(walkToSpot), "Attach", NULL, near_attach_object, user_data, stop_distance);
05762 gAgent.clearFocusObject();
05763 }
05764 }
05765 }
05766
05767 class LLAttachmentDrop : public view_listener_t
05768 {
05769 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
05770 {
05771
05772
05773 LLViewerObject *object = gViewerWindow->lastObjectHit();
05774 if (!object)
05775 {
05776 llwarns << "handle_drop_attachment() - no object to drop" << llendl;
05777 return true;
05778 }
05779
05780 LLViewerObject *parent = (LLViewerObject*)object->getParent();
05781 while (parent)
05782 {
05783 if(parent->isAvatar())
05784 {
05785 break;
05786 }
05787 object = parent;
05788 parent = (LLViewerObject*)parent->getParent();
05789 }
05790
05791 if (!object)
05792 {
05793 llwarns << "handle_detach() - no object to detach" << llendl;
05794 return true;
05795 }
05796
05797 if (object->isAvatar())
05798 {
05799 llwarns << "Trying to detach avatar from avatar." << llendl;
05800 return true;
05801 }
05802
05803
05804
05805
05806
05807 gSelectMgr->sendDropAttachment();
05808 return true;
05809 }
05810 };
05811
05812
05813 void handle_detach_from_avatar(void* user_data)
05814 {
05815 LLViewerJointAttachment *attachment = (LLViewerJointAttachment *)user_data;
05816
05817 LLViewerObject* attached_object = attachment->getObject();
05818
05819 if (attached_object)
05820 {
05821 gMessageSystem->newMessage("ObjectDetach");
05822 gMessageSystem->nextBlockFast(_PREHASH_AgentData);
05823 gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
05824 gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
05825
05826 gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
05827 gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, attached_object->getLocalID());
05828 gMessageSystem->sendReliable( gAgent.getRegionHost() );
05829 }
05830 }
05831
05832 void attach_label(LLString& label, void* user_data)
05833 {
05834 LLViewerJointAttachment* attachmentp = (LLViewerJointAttachment*)user_data;
05835 if (attachmentp)
05836 {
05837 label = attachmentp->getName();
05838 if (attachmentp->getObject())
05839 {
05840 LLViewerInventoryItem* itemp = gInventory.getItem(attachmentp->getItemID());
05841 if (itemp)
05842 {
05843 label += LLString(" (") + itemp->getName() + LLString(")");
05844 }
05845 }
05846 }
05847 }
05848
05849 void detach_label(LLString& label, void* user_data)
05850 {
05851 LLViewerJointAttachment* attachmentp = (LLViewerJointAttachment*)user_data;
05852 if (attachmentp)
05853 {
05854 label = attachmentp->getName();
05855 if (attachmentp->getObject())
05856 {
05857 LLViewerInventoryItem* itemp = gInventory.getItem(attachmentp->getItemID());
05858 if (itemp)
05859 {
05860 label += LLString(" (") + itemp->getName() + LLString(")");
05861 }
05862 }
05863 }
05864 }
05865
05866
05867 class LLAttachmentDetach : public view_listener_t
05868 {
05869 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
05870 {
05871
05872
05873 LLViewerObject *object = gViewerWindow->lastObjectHit();
05874 if (!object)
05875 {
05876 llwarns << "handle_detach() - no object to detach" << llendl;
05877 return true;
05878 }
05879
05880 LLViewerObject *parent = (LLViewerObject*)object->getParent();
05881 while (parent)
05882 {
05883 if(parent->isAvatar())
05884 {
05885 break;
05886 }
05887 object = parent;
05888 parent = (LLViewerObject*)parent->getParent();
05889 }
05890
05891 if (!object)
05892 {
05893 llwarns << "handle_detach() - no object to detach" << llendl;
05894 return true;
05895 }
05896
05897 if (object->isAvatar())
05898 {
05899 llwarns << "Trying to detach avatar from avatar." << llendl;
05900 return true;
05901 }
05902
05903
05904
05905
05906
05907
05908
05909
05910 if (gSelectMgr->getSelection()->isAttachment())
05911 {
05912 gSelectMgr->sendDetach();
05913 }
05914 return true;
05915 }
05916 };
05917
05918
05919
05920 class LLWornItemFetchedObserver : public LLInventoryFetchObserver
05921 {
05922 public:
05923 LLWornItemFetchedObserver() {}
05924 virtual ~LLWornItemFetchedObserver() {}
05925
05926 protected:
05927 virtual void done()
05928 {
05929 gPieAttachment->buildDrawLabels();
05930 gInventory.removeObserver(this);
05931 delete this;
05932 }
05933 };
05934
05935
05936 class LLAttachmentEnableDrop : public view_listener_t
05937 {
05938 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
05939 {
05940 LLParcel* parcel = gParcelMgr->getAgentParcel();
05941 BOOL can_build = gAgent.isGodlike() || (parcel && parcel->getAllowModify());
05942
05943
05944
05945
05946
05947
05948
05949
05950
05951
05952
05953 LLViewerObject* object = gViewerWindow->lastObjectHit();
05954 LLViewerJointAttachment* attachment_pt = NULL;
05955 LLInventoryItem* item = NULL;
05956
05957 if ( object )
05958 {
05959 S32 attachmentID = ATTACHMENT_ID_FROM_STATE(object->getState());
05960 attachment_pt = gAgent.getAvatarObject()->mAttachmentPoints.getIfThere(attachmentID);
05961
05962 if ( attachment_pt )
05963 {
05964
05965
05966 item = gInventory.getItem(attachment_pt->getItemID());
05967
05968 if ( !item )
05969 {
05970
05971
05972
05973
05974 LLWornItemFetchedObserver* wornItemFetched = new LLWornItemFetchedObserver();
05975 LLInventoryFetchObserver::item_ref_t items;
05976
05977 items.push_back(attachment_pt->getItemID());
05978
05979 wornItemFetched->fetchItems(items);
05980 gInventory.addObserver(wornItemFetched);
05981 }
05982 }
05983 }
05984
05985
05986 bool new_value = enable_detach(NULL) && can_build && item;
05987
05988 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
05989 return true;
05990 }
05991 };
05992
05993 BOOL enable_detach(void*)
05994 {
05995 LLViewerObject* object = gViewerWindow->lastObjectHit();
05996 if (!object) return FALSE;
05997 if (!object->isAttachment()) return FALSE;
05998
05999
06000 LLViewerObject* avatar = object;
06001 while (avatar)
06002 {
06003
06004 if (avatar->getID() == gAgent.getID())
06005 {
06006 return TRUE;
06007 }
06008
06009 avatar = (LLViewerObject*)avatar->getParent();
06010 }
06011
06012 return FALSE;
06013 }
06014
06015 class LLAttachmentEnableDetach : public view_listener_t
06016 {
06017 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
06018 {
06019 bool new_value = enable_detach(NULL);
06020 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
06021 return true;
06022 }
06023 };
06024
06025
06026 BOOL object_selected_and_point_valid(void *user_data)
06027 {
06028
06029 if (gSelectMgr == NULL)
06030 {
06031 return FALSE;
06032 }
06033 LLObjectSelectionHandle selection = gSelectMgr->getSelection();
06034 for (LLObjectSelection::root_iterator iter = selection->root_begin();
06035 iter != selection->root_end(); iter++)
06036 {
06037 LLSelectNode* node = *iter;
06038 LLViewerObject* object = node->getObject();
06039 for (U32 child_num = 0; child_num < object->mChildList.size(); child_num++ )
06040 {
06041 if (object->mChildList[child_num]->isAvatar())
06042 {
06043 return FALSE;
06044 }
06045 }
06046 }
06047
06048 return (selection->getRootObjectCount() == 1) &&
06049 (selection->getFirstRootObject()->getPCode() == LL_PCODE_VOLUME) &&
06050 selection->getFirstRootObject()->permYouOwner() &&
06051 !((LLViewerObject*)selection->getFirstRootObject()->getRoot())->isAvatar() &&
06052 (selection->getFirstRootObject()->getNVPair("AssetContainer") == NULL);
06053 }
06054
06055
06056 class LLObjectEnableWear : public view_listener_t
06057 {
06058 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
06059 {
06060 return object_selected_and_point_valid(NULL);
06061 }
06062 };
06063
06064
06065 BOOL object_attached(void *user_data)
06066 {
06067 LLViewerJointAttachment *attachment = (LLViewerJointAttachment *)user_data;
06068
06069 return attachment->getObject() != NULL;
06070 }
06071
06072 class LLAvatarSendIM : public view_listener_t
06073 {
06074 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
06075 {
06076 LLVOAvatar* avatar = find_avatar_from_object( gViewerWindow->lastObjectHit() );
06077 if(avatar)
06078 {
06079 LLString name("IM");
06080 LLNameValue *first = avatar->getNVPair("FirstName");
06081 LLNameValue *last = avatar->getNVPair("LastName");
06082 if (first && last)
06083 {
06084 name.assign( first->getString() );
06085 name.append(" ");
06086 name.append( last->getString() );
06087 }
06088
06089 gIMMgr->setFloaterOpen(TRUE);
06090
06091
06092 gIMMgr->addSession(name,
06093 IM_NOTHING_SPECIAL,
06094 avatar->getID());
06095 }
06096 return true;
06097 }
06098 };
06099
06100 class LLAvatarTrustNetRate : public view_listener_t
06101 {
06102 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
06103 {
06104 LLVOAvatar* avatar = find_avatar_from_object( gViewerWindow->lastObjectHit() );
06105 if(avatar)
06106 {
06107 LLFloaterTrustNetRate::show(avatar->getID());
06108 }
06109
06110 return true;
06111 }
06112 };
06113
06114 void handle_activate(void*)
06115 {
06116 }
06117
06118 BOOL enable_activate(void*)
06119 {
06120 return FALSE;
06121 }
06122
06123 namespace
06124 {
06125 struct QueueObjects : public LLSelectedObjectFunctor
06126 {
06127 BOOL scripted;
06128 BOOL modifiable;
06129 LLFloaterScriptQueue* mQueue;
06130 QueueObjects(LLFloaterScriptQueue* q) : mQueue(q), scripted(FALSE), modifiable(FALSE) {}
06131 virtual bool apply(LLViewerObject* obj)
06132 {
06133 scripted = obj->flagScripted();
06134 modifiable = obj->permModify();
06135
06136 if( scripted && modifiable )
06137 {
06138 mQueue->addObject(obj->getID());
06139 return false;
06140 }
06141 else
06142 {
06143 return true;
06144 }
06145 }
06146 };
06147 }
06148
06149 void queue_actions(LLFloaterScriptQueue* q, const std::string& noscriptmsg, const std::string& nomodmsg)
06150 {
06151
06152 QueueObjects func(q);
06153 const bool firstonly = true;
06154 bool fail = gSelectMgr->getSelection()->applyToObjects(&func, firstonly);
06155 if(fail)
06156 {
06157 if ( !func.scripted )
06158 {
06159 gViewerWindow->alertXml(noscriptmsg);
06160 }
06161 else if ( !func.modifiable )
06162 {
06163 gViewerWindow->alertXml(nomodmsg);
06164 }
06165 else
06166 {
06167 llerrs << "Bad logic." << llendl;
06168 }
06169 }
06170 else
06171 {
06172 if (!q->start())
06173 {
06174 llwarns << "Unexpected script compile failure." << llendl;
06175 }
06176 }
06177 }
06178
06179 class LLToolsSelectedScriptAction : public view_listener_t
06180 {
06181 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
06182 {
06183 LLString action = userdata.asString();
06184 LLFloaterScriptQueue* queue = NULL;
06185 if (action == "compile")
06186 {
06187 queue = LLFloaterCompileQueue::create();
06188 }
06189 else if (action == "reset")
06190 {
06191 queue = LLFloaterResetQueue::create();
06192 }
06193 else if (action == "start")
06194 {
06195 queue = LLFloaterRunQueue::create();
06196 }
06197 else if (action == "stop")
06198 {
06199 queue = LLFloaterNotRunQueue::create();
06200 }
06201 if (!queue)
06202 {
06203 return true;
06204 }
06205
06206 queue_actions(queue, "CannotRecompileSelectObjectsNoScripts", "CannotRecompileSelectObjectsNoPermission");
06207
06208 return true;
06209 }
06210 };
06211
06212 void handle_reset_selection(void*)
06213 {
06214 LLFloaterResetQueue* queue = LLFloaterResetQueue::create();
06215 queue_actions(queue, "CannotResetSelectObjectsNoScripts", "CannotResetSelectObjectsNoPermission");
06216 }
06217
06218 void handle_set_run_selection(void*)
06219 {
06220 LLFloaterRunQueue* queue = LLFloaterRunQueue::create();
06221 queue_actions(queue, "CannotSetRunningSelectObjectsNoScripts", "CannotSerRunningSelectObjectsNoPermission");
06222 }
06223
06224 void handle_set_not_run_selection(void*)
06225 {
06226 LLFloaterNotRunQueue* queue = LLFloaterNotRunQueue::create();
06227 queue_actions(queue, "CannotSetRunningNotSelectObjectsNoScripts", "CannotSerRunningNotSelectObjectsNoPermission");
06228 }
06229
06230 void handle_selected_texture_info(void*)
06231 {
06232 for (LLObjectSelection::valid_iterator iter = gSelectMgr->getSelection()->valid_begin();
06233 iter != gSelectMgr->getSelection()->valid_end(); iter++)
06234 {
06235 LLSelectNode* node = *iter;
06236
06237 std::string msg;
06238 msg.assign("Texture info for: ");
06239 msg.append(node->mName);
06240 LLChat chat(msg);
06241 LLFloaterChat::addChat(chat);
06242
06243 U8 te_count = node->getObject()->getNumTEs();
06244
06245 typedef std::map< LLUUID, std::vector<U8> > map_t;
06246 map_t faces_per_texture;
06247 for (U8 i = 0; i < te_count; i++)
06248 {
06249 if (!node->isTESelected(i)) continue;
06250
06251 LLViewerImage* img = node->getObject()->getTEImage(i);
06252 LLUUID image_id = img->getID();
06253 faces_per_texture[image_id].push_back(i);
06254 }
06255
06256 map_t::iterator it;
06257 for (it = faces_per_texture.begin(); it != faces_per_texture.end(); ++it)
06258 {
06259 LLUUID image_id = it->first;
06260 U8 te = it->second[0];
06261 LLViewerImage* img = node->getObject()->getTEImage(te);
06262 S32 height = img->getHeight();
06263 S32 width = img->getWidth();
06264 S32 components = img->getComponents();
06265 std::string image_id_string;
06266 if (gAgent.isGodlike())
06267 {
06268 image_id_string = image_id.asString() + " ";
06269 }
06270 msg = llformat("%s%dx%d %s on face ",
06271 image_id_string.c_str(),
06272 width,
06273 height,
06274 (components == 4 ? "alpha" : "opaque"));
06275 for (U8 i = 0; i < it->second.size(); ++i)
06276 {
06277 msg.append( llformat("%d ", (S32)(it->second[i])));
06278 }
06279 LLChat chat(msg);
06280 LLFloaterChat::addChat(chat);
06281 }
06282 }
06283 }
06284
06285 void handle_dump_image_list(void*)
06286 {
06287 gImageList.dump();
06288 }
06289
06290 void handle_test_male(void*)
06291 {
06292 wear_outfit_by_name("Male Shape & Outfit");
06293
06294 }
06295
06296 void handle_test_female(void*)
06297 {
06298 wear_outfit_by_name("Female Shape & Outfit");
06299
06300 }
06301
06302 void handle_toggle_pg(void*)
06303 {
06304 gAgent.setTeen( !gAgent.isTeen() );
06305
06306 LLFloaterWorldMap::reloadIcons(NULL);
06307
06308 llinfos << "PG status set to " << (S32)gAgent.isTeen() << llendl;
06309 }
06310
06311 void handle_dump_attachments(void*)
06312 {
06313 LLVOAvatar* avatar = gAgent.getAvatarObject();
06314 if( !avatar )
06315 {
06316 llinfos << "NO AVATAR" << llendl;
06317 return;
06318 }
06319
06320 for( LLViewerJointAttachment* attachment = avatar->mAttachmentPoints.getFirstData();
06321 attachment;
06322 attachment = avatar->mAttachmentPoints.getNextData() )
06323 {
06324 S32 key = avatar->mAttachmentPoints.getCurrentKeyWithoutIncrement();
06325 BOOL visible = (attachment->getObject() != NULL &&
06326 attachment->getObject()->mDrawable.notNull() &&
06327 !attachment->getObject()->mDrawable->isRenderType(0));
06328 LLVector3 pos;
06329 if (visible) pos = attachment->getObject()->mDrawable->getPosition();
06330 llinfos << "ATTACHMENT " << key << ": item_id=" << attachment->getItemID()
06331 << (attachment->getObject() ? " present " : " absent ")
06332 << (visible ? "visible " : "invisible ")
06333 << " at " << pos
06334 << " and " << (visible ? attachment->getObject()->getPosition() : LLVector3::zero)
06335 << llendl;
06336 }
06337 }
06338
06339
06340
06341
06342
06343 BOOL menu_ui_enabled(void *user_data)
06344 {
06345 BOOL high_res = gSavedSettings.getBOOL( "HighResSnapshot" );
06346 return !high_res;
06347 }
06348
06349
06350 void menu_toggle_control( void* user_data )
06351 {
06352 BOOL checked = gSavedSettings.getBOOL( static_cast<char*>(user_data) );
06353 if (LLString(static_cast<char*>(user_data)) == "HighResSnapshot" && !checked)
06354 {
06355
06356 gSavedSettings.setBOOL( "RenderUIInSnapshot", FALSE );
06357 }
06358 gSavedSettings.setBOOL( static_cast<char*>(user_data), !checked );
06359 }
06360
06361
06362
06363 class LLToggleControl : public view_listener_t
06364 {
06365 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
06366 {
06367 LLString control_name = userdata.asString();
06368 BOOL checked = gSavedSettings.getBOOL( control_name );
06369 if (control_name == "HighResSnapshot" && !checked)
06370 {
06371
06372 gSavedSettings.setBOOL( "RenderUIInSnapshot", FALSE );
06373 }
06374 gSavedSettings.setBOOL( control_name, !checked );
06375 return true;
06376 }
06377 };
06378
06379
06380 void check_toggle_control( LLUICtrl *, void* user_data )
06381 {
06382 BOOL checked = gSavedSettings.getBOOL( static_cast<char*>(user_data) );
06383 gSavedSettings.setBOOL( static_cast<char*>(user_data), !checked );
06384 }
06385
06386 BOOL menu_check_control( void* user_data)
06387 {
06388 return gSavedSettings.getBOOL((char*)user_data);
06389 }
06390
06391
06392 void menu_toggle_variable( void* user_data )
06393 {
06394 BOOL checked = *(BOOL*)user_data;
06395 *(BOOL*)user_data = !checked;
06396 }
06397
06398 BOOL menu_check_variable( void* user_data)
06399 {
06400 return *(BOOL*)user_data;
06401 }
06402
06403
06404 BOOL enable_land_selected( void* )
06405 {
06406 return gParcelMgr && !(gParcelMgr->selectionEmpty());
06407 }
06408
06409 class LLSomethingSelected : public view_listener_t
06410 {
06411 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
06412 {
06413 bool new_value = !(gSelectMgr->getSelection()->isEmpty());
06414 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
06415 return true;
06416 }
06417 };
06418
06419 class LLSomethingSelectedNoHUD : public view_listener_t
06420 {
06421 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
06422 {
06423 LLObjectSelectionHandle selection = gSelectMgr->getSelection();
06424 bool new_value = !(selection->isEmpty()) && !(selection->getSelectType() == SELECT_TYPE_HUD);
06425 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
06426 return true;
06427 }
06428 };
06429
06430 BOOL enable_more_than_one_selected(void* )
06431 {
06432 return (gSelectMgr->getSelection()->getObjectCount() > 1);
06433 }
06434
06435 class LLEditableSelected : public view_listener_t
06436 {
06437 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
06438 {
06439 bool new_value = (gSelectMgr->getSelection()->getFirstEditableObject() != NULL);
06440 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
06441 return true;
06442 }
06443 };
06444
06445 class LLToolsEnableTakeCopy : public view_listener_t
06446 {
06447 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
06448 {
06449 bool all_valid = false;
06450 if (gSelectMgr)
06451 {
06452 all_valid = true;
06453 #ifndef HACKED_GODLIKE_VIEWER
06454 # ifdef TOGGLE_HACKED_GODLIKE_VIEWER
06455 if (gInProductionGrid || !gAgent.isGodlike())
06456 # endif
06457 {
06458 struct f : public LLSelectedObjectFunctor
06459 {
06460 virtual bool apply(LLViewerObject* obj)
06461 {
06462 return (!obj->permCopy() || obj->isAttachment());
06463 }
06464 } func;
06465 const bool firstonly = true;
06466 bool any_invalid = gSelectMgr->getSelection()->applyToRootObjects(&func, firstonly);
06467 all_valid = !any_invalid;
06468 }
06469 #endif // HACKED_GODLIKE_VIEWER
06470 }
06471
06472 gMenuHolder->findControl(userdata["control"].asString())->setValue(all_valid);
06473 return true;
06474 }
06475 };
06476
06477 BOOL enable_selection_you_own_all(void*)
06478 {
06479 if (gSelectMgr)
06480 {
06481 struct f : public LLSelectedObjectFunctor
06482 {
06483 virtual bool apply(LLViewerObject* obj)
06484 {
06485 return (!obj->permYouOwner());
06486 }
06487 } func;
06488 const bool firstonly = true;
06489 bool no_perms = gSelectMgr->getSelection()->applyToRootObjects(&func, firstonly);
06490 if (no_perms)
06491 {
06492 return FALSE;
06493 }
06494 }
06495 return TRUE;
06496 }
06497
06498 BOOL enable_selection_you_own_one(void*)
06499 {
06500 if (gSelectMgr)
06501 {
06502 struct f : public LLSelectedObjectFunctor
06503 {
06504 virtual bool apply(LLViewerObject* obj)
06505 {
06506 return (obj->permYouOwner());
06507 }
06508 } func;
06509 const bool firstonly = true;
06510 bool any_perms = gSelectMgr->getSelection()->applyToRootObjects(&func, firstonly);
06511 if (!any_perms)
06512 {
06513 return FALSE;
06514 }
06515 }
06516 return TRUE;
06517 }
06518
06519 class LLHasAsset : public LLInventoryCollectFunctor
06520 {
06521 public:
06522 LLHasAsset(const LLUUID& id) : mAssetID(id), mHasAsset(FALSE) {}
06523 virtual ~LLHasAsset() {}
06524 virtual bool operator()(LLInventoryCategory* cat,
06525 LLInventoryItem* item);
06526 BOOL hasAsset() const { return mHasAsset; }
06527
06528 protected:
06529 LLUUID mAssetID;
06530 BOOL mHasAsset;
06531 };
06532
06533 bool LLHasAsset::operator()(LLInventoryCategory* cat,
06534 LLInventoryItem* item)
06535 {
06536 if(item && item->getAssetUUID() == mAssetID)
06537 {
06538 mHasAsset = TRUE;
06539 }
06540 return FALSE;
06541 }
06542
06543 BOOL enable_save_into_inventory(void*)
06544 {
06545 if(gSelectMgr)
06546 {
06547
06548
06549 LLSelectNode* last_node = NULL;
06550 for (LLObjectSelection::root_iterator iter = gSelectMgr->getSelection()->root_begin();
06551 iter != gSelectMgr->getSelection()->root_end(); iter++)
06552 {
06553 last_node = *iter;
06554 }
06555
06556 #ifdef HACKED_GODLIKE_VIEWER
06557 return TRUE;
06558 #else
06559 # ifdef TOGGLE_HACKED_GODLIKE_VIEWER
06560 if (!gInProductionGrid && gAgent.isGodlike())
06561 {
06562 return TRUE;
06563 }
06564 # endif
06565
06566 if(last_node && last_node->mValid && !last_node->mItemID.isNull()
06567 && (last_node->mPermissions->getOwner() == gAgent.getID())
06568 && (gInventory.getItem(last_node->mItemID) != NULL))
06569 {
06570 LLViewerObject* obj = last_node->getObject();
06571 if( obj && !obj->isAttachment() )
06572 {
06573 return TRUE;
06574 }
06575 }
06576 #endif
06577 }
06578 return FALSE;
06579 }
06580
06581 class LLToolsEnableSaveToInventory : public view_listener_t
06582 {
06583 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
06584 {
06585 bool new_value = enable_save_into_inventory(NULL);
06586 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
06587 return true;
06588 }
06589 };
06590
06591 BOOL enable_save_into_task_inventory(void*)
06592 {
06593 if(gSelectMgr)
06594 {
06595 LLSelectNode* node = gSelectMgr->getSelection()->getFirstRootNode();
06596 if(node && (node->mValid) && (!node->mFromTaskID.isNull()))
06597 {
06598
06599 LLViewerObject* obj = node->getObject();
06600 if( obj && !obj->isAttachment() )
06601 {
06602 return TRUE;
06603 }
06604 }
06605 }
06606 return FALSE;
06607 }
06608
06609 class LLToolsEnableSaveToObjectInventory : public view_listener_t
06610 {
06611 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
06612 {
06613 bool new_value = enable_save_into_task_inventory(NULL);
06614 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
06615 return true;
06616 }
06617 };
06618
06619 BOOL enable_not_thirdperson(void*)
06620 {
06621 return !gAgent.cameraThirdPerson();
06622 }
06623
06624
06625 BOOL enable_export_selected(void *)
06626 {
06627 if (gSelectMgr->getSelection()->isEmpty())
06628 {
06629 return FALSE;
06630 }
06631 if (!gExporterRequestID.isNull())
06632 {
06633 return FALSE;
06634 }
06635 if (!LLUploadDialog::modalUploadIsFinished())
06636 {
06637 return FALSE;
06638 }
06639 return TRUE;
06640 }
06641
06642 class LLViewEnableMouselook : public view_listener_t
06643 {
06644 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
06645 {
06646
06647
06648 bool new_value = (CAMERA_MODE_CUSTOMIZE_AVATAR != gAgent.getCameraMode() && !gSavedSettings.getBOOL("FreezeTime"));
06649 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
06650 return true;
06651 }
06652 };
06653
06654 class LLToolsEnableToolNotPie : public view_listener_t
06655 {
06656 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
06657 {
06658 bool new_value = ( gToolMgr->getBaseTool() != gToolPie );
06659 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
06660 return true;
06661 }
06662 };
06663
06664 class LLWorldEnableCreateLandmark : public view_listener_t
06665 {
06666 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
06667 {
06668 bool new_value = gAgent.isGodlike() ||
06669 (gAgent.getRegion() && gAgent.getRegion()->getAllowLandmark());
06670 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
06671 return true;
06672 }
06673 };
06674
06675 class LLWorldEnableSetHomeLocation : public view_listener_t
06676 {
06677 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
06678 {
06679 bool new_value = gAgent.isGodlike() ||
06680 (gAgent.getRegion() && gAgent.getRegion()->getAllowSetHome());
06681 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
06682 return true;
06683 }
06684 };
06685
06686 class LLWorldEnableTeleportHome : public view_listener_t
06687 {
06688 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
06689 {
06690 LLViewerRegion* regionp = gAgent.getRegion();
06691 bool agent_on_prelude = (regionp && regionp->isPrelude());
06692 bool enable_teleport_home = gAgent.isGodlike() || !agent_on_prelude;
06693 gMenuHolder->findControl(userdata["control"].asString())->setValue(enable_teleport_home);
06694 return true;
06695 }
06696 };
06697
06698 BOOL enable_region_owner(void*)
06699 {
06700 if(gAgent.getRegion() && gAgent.getRegion()->getOwner() == gAgent.getID())
06701 return TRUE;
06702 return enable_god_customer_service(NULL);
06703 }
06704
06705 BOOL enable_god_full(void*)
06706 {
06707 return gAgent.getGodLevel() >= GOD_FULL;
06708 }
06709
06710 BOOL enable_god_liaison(void*)
06711 {
06712 return gAgent.getGodLevel() >= GOD_LIAISON;
06713 }
06714
06715 BOOL enable_god_customer_service(void*)
06716 {
06717 return gAgent.getGodLevel() >= GOD_CUSTOMER_SERVICE;
06718 }
06719
06720 BOOL enable_god_basic(void*)
06721 {
06722 return gAgent.getGodLevel() > GOD_NOT;
06723 }
06724
06725 #if 0 // 1.9.2
06726 void toggle_vertex_shaders(void *)
06727 {
06728 BOOL use_shaders = gPipeline.getUseVertexShaders();
06729 gPipeline.setUseVertexShaders(use_shaders);
06730 }
06731
06732 BOOL check_vertex_shaders(void *)
06733 {
06734 return gPipeline.getUseVertexShaders();
06735 }
06736 #endif
06737
06738 void toggle_show_xui_names(void *)
06739 {
06740 BOOL showXUINames = gSavedSettings.getBOOL("ShowXUINames");
06741
06742 showXUINames = !showXUINames;
06743 gSavedSettings.setBOOL("ShowXUINames", showXUINames);
06744 }
06745
06746 BOOL check_show_xui_names(void *)
06747 {
06748 return gSavedSettings.getBOOL("ShowXUINames");
06749 }
06750
06751
06752
06753 void toggle_cull_small(void *)
06754 {
06755
06756
06757
06758 }
06759
06760 class LLToolsSelectOnlyMyObjects : public view_listener_t
06761 {
06762 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
06763 {
06764 BOOL cur_val = gSavedSettings.getBOOL("SelectOwnedOnly");
06765
06766 gSavedSettings.setBOOL("SelectOwnedOnly", ! cur_val );
06767
06768 return true;
06769 }
06770 };
06771
06772 class LLToolsSelectOnlyMovableObjects : public view_listener_t
06773 {
06774 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
06775 {
06776 BOOL cur_val = gSavedSettings.getBOOL("SelectMovableOnly");
06777
06778 gSavedSettings.setBOOL("SelectMovableOnly", ! cur_val );
06779
06780 return true;
06781 }
06782 };
06783
06784 class LLToolsSelectBySurrounding : public view_listener_t
06785 {
06786 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
06787 {
06788 LLSelectMgr::sRectSelectInclusive = !LLSelectMgr::sRectSelectInclusive;
06789
06790 gSavedSettings.setBOOL("RectangleSelectInclusive", LLSelectMgr::sRectSelectInclusive);
06791 return true;
06792 }
06793 };
06794
06795 class LLToolsShowHiddenSelection : public view_listener_t
06796 {
06797 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
06798 {
06799
06800 LLSelectMgr::sRenderHiddenSelections = !LLSelectMgr::sRenderHiddenSelections;
06801
06802 gSavedSettings.setBOOL("RenderHiddenSelections", LLSelectMgr::sRenderHiddenSelections);
06803 return true;
06804 }
06805 };
06806
06807 class LLToolsShowSelectionLightRadius : public view_listener_t
06808 {
06809 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
06810 {
06811
06812 LLSelectMgr::sRenderLightRadius = !LLSelectMgr::sRenderLightRadius;
06813
06814 gSavedSettings.setBOOL("RenderLightRadius", LLSelectMgr::sRenderLightRadius);
06815 return true;
06816 }
06817 };
06818
06819 class LLToolsEditLinkedParts : public view_listener_t
06820 {
06821 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
06822 {
06823 BOOL select_individuals = gSavedSettings.getBOOL("EditLinkedParts");
06824 if (select_individuals)
06825 {
06826 gSelectMgr->demoteSelectionToIndividuals();
06827 }
06828 else
06829 {
06830 gSelectMgr->promoteSelectionToRoot();
06831 }
06832 return true;
06833 }
06834 };
06835
06836 void reload_personal_settings_overrides(void *)
06837 {
06838 llinfos << "Loading overrides from " << gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT,"overrides.xml") << llendl;
06839
06840 gSavedSettings.loadFromFile(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT,"overrides.xml"));
06841 }
06842
06843 void force_breakpoint(void *)
06844 {
06845 #if LL_WINDOWS // Forcing a breakpoint
06846 DebugBreak();
06847 #endif
06848 }
06849
06850 void reload_vertex_shader(void *)
06851 {
06852
06853 }
06854
06855 void slow_mo_animations(void*)
06856 {
06857 static BOOL slow_mo = FALSE;
06858 if (slow_mo)
06859 {
06860 gAgent.getAvatarObject()->setAnimTimeFactor(1.f);
06861 slow_mo = FALSE;
06862 }
06863 else
06864 {
06865 gAgent.getAvatarObject()->setAnimTimeFactor(0.2f);
06866 slow_mo = TRUE;
06867 }
06868 }
06869
06870 void handle_dump_avatar_local_textures(void*)
06871 {
06872 LLVOAvatar* avatar = gAgent.getAvatarObject();
06873 if( avatar )
06874 {
06875 avatar->dumpLocalTextures();
06876 }
06877 }
06878
06879 void handle_debug_avatar_textures(void*)
06880 {
06881 LLFloaterAvatarTextures::show(gLastHitObjectID);
06882 }
06883
06884 void handle_grab_texture(void* data)
06885 {
06886 LLVOAvatar::ETextureIndex index = (LLVOAvatar::ETextureIndex)((intptr_t)data);
06887 LLVOAvatar* avatar = gAgent.getAvatarObject();
06888 if ( avatar )
06889 {
06890 const LLUUID& asset_id = avatar->grabLocalTexture(index);
06891 llinfos << "Adding baked texture " << asset_id << " to inventory." << llendl;
06892 LLAssetType::EType asset_type = LLAssetType::AT_TEXTURE;
06893 LLInventoryType::EType inv_type = LLInventoryType::IT_TEXTURE;
06894 LLUUID folder_id(gInventory.findCategoryUUIDForType(asset_type));
06895 if(folder_id.notNull())
06896 {
06897 LLString name = "Baked ";
06898 switch (index)
06899 {
06900 case LLVOAvatar::TEX_EYES_BAKED:
06901 name.append("Iris");
06902 break;
06903 case LLVOAvatar::TEX_HEAD_BAKED:
06904 name.append("Head");
06905 break;
06906 case LLVOAvatar::TEX_UPPER_BAKED:
06907 name.append("Upper Body");
06908 break;
06909 case LLVOAvatar::TEX_LOWER_BAKED:
06910 name.append("Lower Body");
06911 break;
06912 case LLVOAvatar::TEX_SKIRT_BAKED:
06913 name.append("Skirt");
06914 break;
06915 default:
06916 name.append("Unknown");
06917 break;
06918 }
06919 name.append(" Texture");
06920
06921 LLUUID item_id;
06922 item_id.generate();
06923 LLPermissions perm;
06924 perm.init(gAgentID,
06925 gAgentID,
06926 LLUUID::null,
06927 LLUUID::null);
06928 U32 next_owner_perm = PERM_MOVE | PERM_TRANSFER;
06929 perm.initMasks(PERM_ALL,
06930 PERM_ALL,
06931 PERM_NONE,
06932 PERM_NONE,
06933 next_owner_perm);
06934 S32 creation_date_now = time_corrected();
06935 LLPointer<LLViewerInventoryItem> item
06936 = new LLViewerInventoryItem(item_id,
06937 folder_id,
06938 perm,
06939 asset_id,
06940 asset_type,
06941 inv_type,
06942 name,
06943 "",
06944 LLSaleInfo::DEFAULT,
06945 LLInventoryItem::II_FLAGS_NONE,
06946 creation_date_now);
06947
06948 item->updateServer(TRUE);
06949 gInventory.updateItem(item);
06950 gInventory.notifyObservers();
06951
06952 LLInventoryView* view = LLInventoryView::getActiveInventory();
06953
06954
06955
06956 if(view)
06957 {
06958 LLUICtrl* focus_ctrl = gFocusMgr.getKeyboardFocus();
06959 LLFocusMgr::FocusLostCallback callback = gFocusMgr.getFocusCallback();
06960
06961 view->getPanel()->setSelection(item_id, TAKE_FOCUS_NO);
06962 view->getPanel()->openSelected();
06963
06964
06965 gFocusMgr.setKeyboardFocus(focus_ctrl, callback);
06966 }
06967 }
06968 else
06969 {
06970 llwarns << "Can't find a folder to put it in" << llendl;
06971 }
06972 }
06973 }
06974
06975 BOOL enable_grab_texture(void* data)
06976 {
06977 LLVOAvatar::ETextureIndex index = (LLVOAvatar::ETextureIndex)((intptr_t)data);
06978 LLVOAvatar* avatar = gAgent.getAvatarObject();
06979 if ( avatar )
06980 {
06981 return avatar->canGrabLocalTexture(index);
06982 }
06983 return FALSE;
06984 }
06985
06986
06987
06988 LLVOAvatar* find_avatar_from_object( LLViewerObject* object )
06989 {
06990 if (object)
06991 {
06992 if( object->isAttachment() )
06993 {
06994 do
06995 {
06996 object = (LLViewerObject*) object->getParent();
06997 }
06998 while( object && !object->isAvatar() );
06999 }
07000 else
07001 if( !object->isAvatar() )
07002 {
07003 object = NULL;
07004 }
07005 }
07006
07007 return (LLVOAvatar*) object;
07008 }
07009
07010
07011
07012
07013 LLVOAvatar* find_avatar_from_object( const LLUUID& object_id )
07014 {
07015 return find_avatar_from_object( gObjectList.findObject(object_id) );
07016 }
07017
07018
07019 void handle_disconnect_viewer(void *)
07020 {
07021 char message[2048];
07022 message[0] = '\0';
07023
07024 snprintf(message, sizeof(message), "Testing viewer disconnect");
07025
07026 do_disconnect(message);
07027 }
07028
07029
07030 class LLToolsUseSelectionForGrid : public view_listener_t
07031 {
07032 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
07033 {
07034 gSelectMgr->clearGridObjects();
07035 struct f : public LLSelectedObjectFunctor
07036 {
07037 virtual bool apply(LLViewerObject* objectp)
07038 {
07039 gSelectMgr->addGridObject(objectp);
07040 return true;
07041 }
07042 } func;
07043 gSelectMgr->getSelection()->applyToRootObjects(&func);
07044 gSelectMgr->setGridMode(GRID_MODE_REF_OBJECT);
07045 if (gFloaterTools)
07046 {
07047 gFloaterTools->mComboGridMode->setCurrentByIndex((S32)GRID_MODE_REF_OBJECT);
07048 }
07049 return true;
07050 }
07051 };
07052
07053 void handle_test_load_url(void*)
07054 {
07055 LLWeb::loadURL("");
07056 LLWeb::loadURL("hacker://www.google.com/");
07057 LLWeb::loadURL("http");
07058 LLWeb::loadURL("http://www.google.com/");
07059 }
07060
07061
07062
07063
07064
07065 LLViewerMenuHolderGL::LLViewerMenuHolderGL() : LLMenuHolderGL()
07066 {
07067 }
07068
07069 BOOL LLViewerMenuHolderGL::hideMenus()
07070 {
07071 BOOL handled = LLMenuHolderGL::hideMenus();
07072
07073
07074 mParcelSelection = NULL;
07075 mObjectSelection = NULL;
07076
07077 gMenuBarView->clearHoverItem();
07078 gMenuBarView->resetMenuTrigger();
07079
07080 return handled;
07081 }
07082
07083 void LLViewerMenuHolderGL::setParcelSelection(LLHandle<LLParcelSelection> selection)
07084 {
07085 mParcelSelection = selection;
07086 }
07087
07088 void LLViewerMenuHolderGL::setObjectSelection(LLHandle<LLObjectSelection> selection)
07089 {
07090 mObjectSelection = selection;
07091 }
07092
07093
07094 const LLRect LLViewerMenuHolderGL::getMenuRect() const
07095 {
07096 return LLRect(0, mRect.getHeight() - MENU_BAR_HEIGHT, mRect.getWidth(), STATUS_BAR_HEIGHT);
07097 }
07098
07099 void handle_save_to_xml(void*)
07100 {
07101 LLFloater* frontmost = gFloaterView->getFrontmost();
07102 if (!frontmost)
07103 {
07104 gViewerWindow->alertXml("NoFrontmostFloater");
07105 return;
07106 }
07107
07108 LLString default_name = "floater_";
07109 default_name += frontmost->getTitle();
07110 default_name += ".xml";
07111
07112 LLString::toLower(default_name);
07113 LLString::replaceChar(default_name, ' ', '_');
07114 LLString::replaceChar(default_name, '/', '_');
07115 LLString::replaceChar(default_name, ':', '_');
07116 LLString::replaceChar(default_name, '"', '_');
07117
07118 LLFilePicker& picker = LLFilePicker::instance();
07119 if (picker.getSaveFile(LLFilePicker::FFSAVE_XML, default_name.c_str()))
07120 {
07121 LLString filename = picker.getFirstFile();
07122 gUICtrlFactory->saveToXML(frontmost, filename);
07123 }
07124 }
07125
07126 void handle_load_from_xml(void*)
07127 {
07128 LLFilePicker& picker = LLFilePicker::instance();
07129 if (picker.getOpenFile(LLFilePicker::FFLOAD_XML))
07130 {
07131 LLString filename = picker.getFirstFile();
07132 LLFloater* floater = new LLFloater("sample_floater");
07133 gUICtrlFactory->buildFloater(floater, filename);
07134 }
07135 }
07136
07137 void handle_slurl_test(void*)
07138 {
07139 LLFloaterHtml::getInstance()->show("http://secondlife.com/app/search/slurls.html", "SLURL Test");
07140 }
07141
07142 void handle_rebake_textures(void*)
07143 {
07144 LLVOAvatar* avatar = gAgent.getAvatarObject();
07145 if (!avatar) return;
07146
07147
07148 bool slam_for_debug = true;
07149 avatar->forceBakeAllTextures(slam_for_debug);
07150 }
07151
07152 void toggle_visibility(void* user_data)
07153 {
07154 LLView* viewp = (LLView*)user_data;
07155 viewp->setVisible(!viewp->getVisible());
07156 }
07157
07158 BOOL get_visibility(void* user_data)
07159 {
07160 LLView* viewp = (LLView*)user_data;
07161 return viewp->getVisible();
07162 }
07163
07164
07165 class LLViewShowHoverTips : public view_listener_t
07166 {
07167 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
07168 {
07169 LLHoverView::sShowHoverTips = !LLHoverView::sShowHoverTips;
07170 return true;
07171 }
07172 };
07173
07174 class LLViewCheckShowHoverTips : public view_listener_t
07175 {
07176 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
07177 {
07178 bool new_value = LLHoverView::sShowHoverTips;
07179 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
07180 return true;
07181 }
07182 };
07183
07184
07185 class LLViewHighlightTransparent : public view_listener_t
07186 {
07187 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
07188 {
07189 LLDrawPoolAlpha::sShowDebugAlpha = !LLDrawPoolAlpha::sShowDebugAlpha;
07190 return true;
07191 }
07192 };
07193
07194 class LLViewCheckHighlightTransparent : public view_listener_t
07195 {
07196 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
07197 {
07198 bool new_value = LLDrawPoolAlpha::sShowDebugAlpha;
07199 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
07200 return true;
07201 }
07202 };
07203
07204 class LLViewToggleBeacon : public view_listener_t
07205 {
07206 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
07207 {
07208 LLString beacon = userdata.asString();
07209 if (beacon == "scriptsbeacon")
07210 {
07211 LLPipeline::toggleRenderScriptedBeacons(NULL);
07212 gSavedSettings.setBOOL( "scriptsbeacon", LLPipeline::getRenderScriptedBeacons(NULL) );
07213
07214 if (LLPipeline::getRenderScriptedBeacons(NULL) && LLPipeline::getRenderScriptedTouchBeacons(NULL))
07215 {
07216 LLPipeline::toggleRenderScriptedTouchBeacons(NULL);
07217 gSavedSettings.setBOOL( "scripttouchbeacon", LLPipeline::getRenderScriptedTouchBeacons(NULL) );
07218 }
07219 }
07220 else if (beacon == "physicalbeacon")
07221 {
07222 LLPipeline::toggleRenderPhysicalBeacons(NULL);
07223 gSavedSettings.setBOOL( "physicalbeacon", LLPipeline::getRenderPhysicalBeacons(NULL) );
07224 }
07225 else if (beacon == "soundsbeacon")
07226 {
07227 LLPipeline::toggleRenderSoundBeacons(NULL);
07228 gSavedSettings.setBOOL( "soundsbeacon", LLPipeline::getRenderSoundBeacons(NULL) );
07229 }
07230 else if (beacon == "particlesbeacon")
07231 {
07232 LLPipeline::toggleRenderParticleBeacons(NULL);
07233 gSavedSettings.setBOOL( "particlesbeacon", LLPipeline::getRenderParticleBeacons(NULL) );
07234 }
07235 else if (beacon == "scripttouchbeacon")
07236 {
07237 LLPipeline::toggleRenderScriptedTouchBeacons(NULL);
07238 gSavedSettings.setBOOL( "scripttouchbeacon", LLPipeline::getRenderScriptedTouchBeacons(NULL) );
07239
07240 if (LLPipeline::getRenderScriptedBeacons(NULL) && LLPipeline::getRenderScriptedTouchBeacons(NULL))
07241 {
07242 LLPipeline::toggleRenderScriptedBeacons(NULL);
07243 gSavedSettings.setBOOL( "scriptsbeacon", LLPipeline::getRenderScriptedBeacons(NULL) );
07244 }
07245 }
07246 else if (beacon == "renderbeacons")
07247 {
07248 LLPipeline::toggleRenderBeacons(NULL);
07249 gSavedSettings.setBOOL( "renderbeacons", LLPipeline::getRenderBeacons(NULL) );
07250
07251 if (!LLPipeline::getRenderBeacons(NULL) && !LLPipeline::getRenderHighlights(NULL))
07252 {
07253 LLPipeline::toggleRenderHighlights(NULL);
07254 gSavedSettings.setBOOL( "renderhighlights", LLPipeline::getRenderHighlights(NULL) );
07255 }
07256 }
07257 else if (beacon == "renderhighlights")
07258 {
07259 LLPipeline::toggleRenderHighlights(NULL);
07260 gSavedSettings.setBOOL( "renderhighlights", LLPipeline::getRenderHighlights(NULL) );
07261
07262 if (!LLPipeline::getRenderBeacons(NULL) && !LLPipeline::getRenderHighlights(NULL))
07263 {
07264 LLPipeline::toggleRenderBeacons(NULL);
07265 gSavedSettings.setBOOL( "renderbeacons", LLPipeline::getRenderBeacons(NULL) );
07266 }
07267 }
07268
07269 return true;
07270 }
07271 };
07272
07273 class LLViewCheckBeaconEnabled : public view_listener_t
07274 {
07275 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
07276 {
07277 LLString beacon = userdata["data"].asString();
07278 bool new_value = false;
07279 if (beacon == "scriptsbeacon")
07280 {
07281 new_value = gSavedSettings.getBOOL( "scriptsbeacon");
07282 LLPipeline::setRenderScriptedBeacons(new_value);
07283 }
07284 else if (beacon == "physicalbeacon")
07285 {
07286 new_value = gSavedSettings.getBOOL( "physicalbeacon");
07287 LLPipeline::setRenderPhysicalBeacons(new_value);
07288 }
07289 else if (beacon == "soundsbeacon")
07290 {
07291 new_value = gSavedSettings.getBOOL( "soundsbeacon");
07292 LLPipeline::setRenderSoundBeacons(new_value);
07293 }
07294 else if (beacon == "particlesbeacon")
07295 {
07296 new_value = gSavedSettings.getBOOL( "particlesbeacon");
07297 LLPipeline::setRenderParticleBeacons(new_value);
07298 }
07299 else if (beacon == "scripttouchbeacon")
07300 {
07301 new_value = gSavedSettings.getBOOL( "scripttouchbeacon");
07302 LLPipeline::setRenderScriptedTouchBeacons(new_value);
07303 }
07304 else if (beacon == "renderbeacons")
07305 {
07306 new_value = gSavedSettings.getBOOL( "renderbeacons");
07307 LLPipeline::setRenderBeacons(new_value);
07308 }
07309 else if (beacon == "renderhighlights")
07310 {
07311 new_value = gSavedSettings.getBOOL( "renderhighlights");
07312 LLPipeline::setRenderHighlights(new_value);
07313 }
07314 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
07315 return true;
07316 }
07317 };
07318
07319 class LLViewToggleRenderType : public view_listener_t
07320 {
07321 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
07322 {
07323 LLString type = userdata.asString();
07324 if (type == "hideparticles")
07325 {
07326 LLPipeline::toggleRenderType(LLPipeline::RENDER_TYPE_PARTICLES);
07327 }
07328 return true;
07329 }
07330 };
07331
07332 class LLViewCheckRenderType : public view_listener_t
07333 {
07334 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
07335 {
07336 LLString type = userdata["data"].asString();
07337 bool new_value = false;
07338 if (type == "hideparticles")
07339 {
07340 new_value = LLPipeline::toggleRenderTypeControlNegated((void *)LLPipeline::RENDER_TYPE_PARTICLES);
07341 }
07342 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
07343 return true;
07344 }
07345 };
07346
07347 class LLViewShowHUDAttachments : public view_listener_t
07348 {
07349 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
07350 {
07351 LLPipeline::sShowHUDAttachments = !LLPipeline::sShowHUDAttachments;
07352 return true;
07353 }
07354 };
07355
07356 class LLViewCheckHUDAttachments : public view_listener_t
07357 {
07358 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
07359 {
07360 bool new_value = LLPipeline::sShowHUDAttachments;
07361 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
07362 return true;
07363 }
07364 };
07365
07366 class LLEditEnableTakeOff : public view_listener_t
07367 {
07368 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
07369 {
07370 LLString control_name = userdata["control"].asString();
07371 LLString clothing = userdata["data"].asString();
07372 bool new_value = false;
07373 if (clothing == "shirt")
07374 {
07375 new_value = LLAgent::selfHasWearable((void *)WT_SHIRT);
07376 }
07377 if (clothing == "pants")
07378 {
07379 new_value = LLAgent::selfHasWearable((void *)WT_PANTS);
07380 }
07381 if (clothing == "shoes")
07382 {
07383 new_value = LLAgent::selfHasWearable((void *)WT_SHOES);
07384 }
07385 if (clothing == "socks")
07386 {
07387 new_value = LLAgent::selfHasWearable((void *)WT_SOCKS);
07388 }
07389 if (clothing == "jacket")
07390 {
07391 new_value = LLAgent::selfHasWearable((void *)WT_JACKET);
07392 }
07393 if (clothing == "gloves")
07394 {
07395 new_value = LLAgent::selfHasWearable((void *)WT_GLOVES);
07396 }
07397 if (clothing == "undershirt")
07398 {
07399 new_value = LLAgent::selfHasWearable((void *)WT_UNDERSHIRT);
07400 }
07401 if (clothing == "underpants")
07402 {
07403 new_value = LLAgent::selfHasWearable((void *)WT_UNDERPANTS);
07404 }
07405 if (clothing == "skirt")
07406 {
07407 new_value = LLAgent::selfHasWearable((void *)WT_SKIRT);
07408 }
07409 gMenuHolder->findControl(control_name)->setValue(new_value);
07410 return true;
07411 }
07412 };
07413
07414 class LLEditTakeOff : public view_listener_t
07415 {
07416 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
07417 {
07418 LLString clothing = userdata.asString();
07419 if (clothing == "shirt")
07420 {
07421 LLAgent::userRemoveWearable((void*)WT_SHIRT);
07422 }
07423 else if (clothing == "pants")
07424 {
07425 LLAgent::userRemoveWearable((void*)WT_PANTS);
07426 }
07427 else if (clothing == "shoes")
07428 {
07429 LLAgent::userRemoveWearable((void*)WT_SHOES);
07430 }
07431 else if (clothing == "socks")
07432 {
07433 LLAgent::userRemoveWearable((void*)WT_SOCKS);
07434 }
07435 else if (clothing == "jacket")
07436 {
07437 LLAgent::userRemoveWearable((void*)WT_JACKET);
07438 }
07439 else if (clothing == "gloves")
07440 {
07441 LLAgent::userRemoveWearable((void*)WT_GLOVES);
07442 }
07443 else if (clothing == "undershirt")
07444 {
07445 LLAgent::userRemoveWearable((void*)WT_UNDERSHIRT);
07446 }
07447 else if (clothing == "underpants")
07448 {
07449 LLAgent::userRemoveWearable((void*)WT_UNDERPANTS);
07450 }
07451 else if (clothing == "skirt")
07452 {
07453 LLAgent::userRemoveWearable((void*)WT_SKIRT);
07454 }
07455 else if (clothing == "all")
07456 {
07457 LLAgent::userRemoveAllClothes(NULL);
07458 }
07459 return true;
07460 }
07461 };
07462
07463 class LLWorldChat : public view_listener_t
07464 {
07465 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
07466 {
07467 handle_chat(NULL);
07468 return true;
07469 }
07470 };
07471
07472 class LLWorldStartGesture : public view_listener_t
07473 {
07474 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
07475 {
07476 handle_slash_key(NULL);
07477 return true;
07478 }
07479 };
07480
07481 class LLToolsSelectTool : public view_listener_t
07482 {
07483 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
07484 {
07485 LLString tool_name = userdata.asString();
07486 if (tool_name == "focus")
07487 {
07488 gToolMgr->getCurrentToolset()->selectToolByIndex(1);
07489 }
07490 else if (tool_name == "move")
07491 {
07492 gToolMgr->getCurrentToolset()->selectToolByIndex(2);
07493 }
07494 else if (tool_name == "edit")
07495 {
07496 gToolMgr->getCurrentToolset()->selectToolByIndex(3);
07497 }
07498 else if (tool_name == "create")
07499 {
07500 gToolMgr->getCurrentToolset()->selectToolByIndex(4);
07501 }
07502 else if (tool_name == "land")
07503 {
07504 gToolMgr->getCurrentToolset()->selectToolByIndex(5);
07505 }
07506 return true;
07507 }
07508 };
07509
07510 static void addMenu(view_listener_t *menu, const char *name)
07511 {
07512 sMenus.push_back(menu);
07513 menu->registerListener(gMenuHolder, name);
07514 }
07515
07516 class LLViewAvatarList : public view_listener_t
07517 {
07518 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
07519 {
07520 llinfos << "LLViewAvatarList::handleEvent()" << llendl;
07521 return true;
07522 }
07523 };
07524
07525 void initialize_menus()
07526 {
07527
07528 init_menu_file();
07529
07530
07531 addMenu(new LLEditUndo(), "Edit.Undo");
07532 addMenu(new LLEditRedo(), "Edit.Redo");
07533 addMenu(new LLEditCut(), "Edit.Cut");
07534 addMenu(new LLEditCopy(), "Edit.Copy");
07535 addMenu(new LLEditPaste(), "Edit.Paste");
07536 addMenu(new LLEditDelete(), "Edit.Delete");
07537 addMenu(new LLEditSearch(), "Edit.Search");
07538 addMenu(new LLEditSelectAll(), "Edit.SelectAll");
07539 addMenu(new LLEditDeselect(), "Edit.Deselect");
07540 addMenu(new LLEditDuplicate(), "Edit.Duplicate");
07541 addMenu(new LLEditTakeOff(), "Edit.TakeOff");
07542
07543 addMenu(new LLEditEnableUndo(), "Edit.EnableUndo");
07544 addMenu(new LLEditEnableRedo(), "Edit.EnableRedo");
07545 addMenu(new LLEditEnableCut(), "Edit.EnableCut");
07546 addMenu(new LLEditEnableCopy(), "Edit.EnableCopy");
07547 addMenu(new LLEditEnablePaste(), "Edit.EnablePaste");
07548 addMenu(new LLEditEnableDelete(), "Edit.EnableDelete");
07549 addMenu(new LLEditEnableSelectAll(), "Edit.EnableSelectAll");
07550 addMenu(new LLEditEnableDeselect(), "Edit.EnableDeselect");
07551 addMenu(new LLEditEnableDuplicate(), "Edit.EnableDuplicate");
07552 addMenu(new LLEditEnableTakeOff(), "Edit.EnableTakeOff");
07553 addMenu(new LLEditEnableCustomizeAvatar(), "Edit.EnableCustomizeAvatar");
07554
07555
07556 addMenu(new LLViewMouselook(), "View.Mouselook");
07557 addMenu(new LLViewBuildMode(), "View.BuildMode");
07558 addMenu(new LLViewResetView(), "View.ResetView");
07559 addMenu(new LLViewLookAtLastChatter(), "View.LookAtLastChatter");
07560 addMenu(new LLViewShowHoverTips(), "View.ShowHoverTips");
07561 addMenu(new LLViewHighlightTransparent(), "View.HighlightTransparent");
07562 addMenu(new LLViewToggleBeacon(), "View.ToggleBeacon");
07563 addMenu(new LLViewToggleRenderType(), "View.ToggleRenderType");
07564 addMenu(new LLViewShowHUDAttachments(), "View.ShowHUDAttachments");
07565 addMenu(new LLViewZoomOut(), "View.ZoomOut");
07566 addMenu(new LLViewZoomIn(), "View.ZoomIn");
07567 addMenu(new LLViewZoomDefault(), "View.ZoomDefault");
07568 addMenu(new LLViewFullscreen(), "View.Fullscreen");
07569 addMenu(new LLViewDefaultUISize(), "View.DefaultUISize");
07570
07571 addMenu(new LLViewEnableMouselook(), "View.EnableMouselook");
07572 addMenu(new LLViewEnableLastChatter(), "View.EnableLastChatter");
07573
07574 addMenu(new LLViewCheckBuildMode(), "View.CheckBuildMode");
07575 addMenu(new LLViewCheckShowHoverTips(), "View.CheckShowHoverTips");
07576 addMenu(new LLViewCheckHighlightTransparent(), "View.CheckHighlightTransparent");
07577 addMenu(new LLViewCheckBeaconEnabled(), "View.CheckBeaconEnabled");
07578 addMenu(new LLViewCheckRenderType(), "View.CheckRenderType");
07579 addMenu(new LLViewCheckHUDAttachments(), "View.CheckHUDAttachments");
07580
07581
07582 addMenu(new LLWorldChat(), "World.Chat");
07583 addMenu(new LLWorldStartGesture(), "World.StartGesture");
07584 addMenu(new LLWorldAlwaysRun(), "World.AlwaysRun");
07585 addMenu(new LLWorldFly(), "World.Fly");
07586 addMenu(new LLWorldCreateLandmark(), "World.CreateLandmark");
07587 addMenu(new LLWorldSetHomeLocation(), "World.SetHomeLocation");
07588 addMenu(new LLWorldTeleportHome(), "World.TeleportHome");
07589 addMenu(new LLWorldSetAway(), "World.SetAway");
07590 addMenu(new LLWorldSetBusy(), "World.SetBusy");
07591
07592 addMenu(new LLWorldEnableCreateLandmark(), "World.EnableCreateLandmark");
07593 addMenu(new LLWorldEnableSetHomeLocation(), "World.EnableSetHomeLocation");
07594 addMenu(new LLWorldEnableTeleportHome(), "World.EnableTeleportHome");
07595 addMenu(new LLWorldEnableBuyLand(), "World.EnableBuyLand");
07596
07597 addMenu(new LLWorldCheckAlwaysRun(), "World.CheckAlwaysRun");
07598
07599 addMenu(new LLWorldForceSun(), "World.ForceSun");
07600
07601
07602 addMenu(new LLToolsSelectTool(), "Tools.SelectTool");
07603 addMenu(new LLToolsSelectOnlyMyObjects(), "Tools.SelectOnlyMyObjects");
07604 addMenu(new LLToolsSelectOnlyMovableObjects(), "Tools.SelectOnlyMovableObjects");
07605 addMenu(new LLToolsSelectBySurrounding(), "Tools.SelectBySurrounding");
07606 addMenu(new LLToolsShowHiddenSelection(), "Tools.ShowHiddenSelection");
07607 addMenu(new LLToolsShowSelectionLightRadius(), "Tools.ShowSelectionLightRadius");
07608 addMenu(new LLToolsEditLinkedParts(), "Tools.EditLinkedParts");
07609 addMenu(new LLToolsSnapObjectXY(), "Tools.SnapObjectXY");
07610 addMenu(new LLToolsUseSelectionForGrid(), "Tools.UseSelectionForGrid");
07611 addMenu(new LLToolsLink(), "Tools.Link");
07612 addMenu(new LLToolsUnlink(), "Tools.Unlink");
07613 addMenu(new LLToolsStopAllAnimations(), "Tools.StopAllAnimations");
07614 addMenu(new LLToolsLookAtSelection(), "Tools.LookAtSelection");
07615 addMenu(new LLToolsBuyOrTake(), "Tools.BuyOrTake");
07616 addMenu(new LLToolsTakeCopy(), "Tools.TakeCopy");
07617 addMenu(new LLToolsSaveToInventory(), "Tools.SaveToInventory");
07618 addMenu(new LLToolsSaveToObjectInventory(), "Tools.SaveToObjectInventory");
07619 addMenu(new LLToolsSelectedScriptAction(), "Tools.SelectedScriptAction");
07620
07621 addMenu(new LLToolsEnableToolNotPie(), "Tools.EnableToolNotPie");
07622 addMenu(new LLToolsEnableLink(), "Tools.EnableLink");
07623 addMenu(new LLToolsEnableUnlink(), "Tools.EnableUnlink");
07624 addMenu(new LLToolsEnableBuyOrTake(), "Tools.EnableBuyOrTake");
07625 addMenu(new LLToolsEnableTakeCopy(), "Tools.EnableTakeCopy");
07626 addMenu(new LLToolsEnableSaveToInventory(), "Tools.SaveToInventory");
07627 addMenu(new LLToolsEnableSaveToObjectInventory(), "Tools.SaveToObjectInventory");
07628
07629
07630
07631
07632
07633 addMenu(new LLHelpMOTD(), "Help.MOTD");
07634
07635
07636
07637 addMenu(new LLSelfStandUp(), "Self.StandUp");
07638 addMenu(new LLSelfRemoveAllAttachments(), "Self.RemoveAllAttachments");
07639
07640 addMenu(new LLSelfEnableStandUp(), "Self.EnableStandUp");
07641 addMenu(new LLSelfEnableRemoveAllAttachments(), "Self.EnableRemoveAllAttachments");
07642
07643
07644 addMenu(new LLObjectMute(), "Avatar.Mute");
07645 addMenu(new LLAvatarAddFriend(), "Avatar.AddFriend");
07646 addMenu(new LLAvatarFreeze(), "Avatar.Freeze");
07647 addMenu(new LLAvatarDebug(), "Avatar.Debug");
07648 addMenu(new LLAvatarVisibleDebug(), "Avatar.VisibleDebug");
07649 addMenu(new LLAvatarEnableDebug(), "Avatar.EnableDebug");
07650 addMenu(new LLAvatarInviteToGroup(), "Avatar.InviteToGroup");
07651 addMenu(new LLAvatarGiveCard(), "Avatar.GiveCard");
07652 addMenu(new LLAvatarEject(), "Avatar.Eject");
07653 addMenu(new LLAvatarSendIM(), "Avatar.SendIM");
07654 addMenu(new LLAvatarTrustNetRate(), "Avatar.Rate");
07655 addMenu(new LLObjectEnableMute(), "Avatar.EnableMute");
07656 addMenu(new LLAvatarEnableAddFriend(), "Avatar.EnableAddFriend");
07657 addMenu(new LLAvatarEnableFreezeEject(), "Avatar.EnableFreezeEject");
07658
07659
07660 addMenu(new LLObjectOpen(), "Object.Open");
07661 addMenu(new LLObjectBuild(), "Object.Build");
07662 addMenu(new LLObjectTouch(), "Object.Touch");
07663 addMenu(new LLObjectSitOrStand(), "Object.SitOrStand");
07664 addMenu(new LLObjectDelete(), "Object.Delete");
07665 addMenu(new LLObjectAttachToAvatar(), "Object.AttachToAvatar");
07666 addMenu(new LLObjectReturn(), "Object.Return");
07667 addMenu(new LLObjectReportAbuse(), "Object.ReportAbuse");
07668 addMenu(new LLObjectMute(), "Object.Mute");
07669 addMenu(new LLObjectBuy(), "Object.Buy");
07670 addMenu(new LLObjectEdit(), "Object.Edit");
07671 addMenu(new LLObjectInspect(), "Object.Inspect");
07672
07673 addMenu(new LLObjectEnableOpen(), "Object.EnableOpen");
07674 addMenu(new LLObjectEnableTouch(), "Object.EnableTouch");
07675 addMenu(new LLObjectEnableSitOrStand(), "Object.EnableSitOrStand");
07676 addMenu(new LLObjectEnableDelete(), "Object.EnableDelete");
07677 addMenu(new LLObjectEnableWear(), "Object.EnableWear");
07678 addMenu(new LLObjectEnableReturn(), "Object.EnableReturn");
07679 addMenu(new LLObjectEnableReportAbuse(), "Object.EnableReportAbuse");
07680 addMenu(new LLObjectEnableMute(), "Object.EnableMute");
07681 addMenu(new LLObjectEnableBuy(), "Object.EnableBuy");
07682
07683
07684
07685
07686
07687
07688
07689
07690 addMenu(new LLAttachmentDrop(), "Attachment.Drop");
07691 addMenu(new LLAttachmentDetach(), "Attachment.Detach");
07692
07693 addMenu(new LLAttachmentEnableDrop(), "Attachment.EnableDrop");
07694 addMenu(new LLAttachmentEnableDetach(), "Attachment.EnableDetach");
07695
07696
07697 addMenu(new LLLandBuild(), "Land.Build");
07698 addMenu(new LLLandSit(), "Land.Sit");
07699 addMenu(new LLLandBuyPass(), "Land.BuyPass");
07700 addMenu(new LLLandEdit(), "Land.Edit");
07701
07702 addMenu(new LLLandEnableBuyPass(), "Land.EnableBuyPass");
07703
07704
07705 addMenu(new LLShowFloater(), "ShowFloater");
07706 addMenu(new LLPromptShowURL(), "PromptShowURL");
07707 addMenu(new LLPromptShowFile(), "PromptShowFile");
07708 addMenu(new LLShowAgentProfile(), "ShowAgentProfile");
07709 addMenu(new LLShowAgentGroups(), "ShowAgentGroups");
07710 addMenu(new LLToggleControl(), "ToggleControl");
07711
07712 addMenu(new LLGoToObject(), "GoToObject");
07713 addMenu(new LLPayObject(), "PayObject");
07714
07715 addMenu(new LLEnablePayObject(), "EnablePayObject");
07716 addMenu(new LLEnableEdit(), "EnableEdit");
07717
07718 addMenu(new LLFloaterVisible(), "FloaterVisible");
07719 addMenu(new LLSomethingSelected(), "SomethingSelected");
07720 addMenu(new LLSomethingSelectedNoHUD(), "SomethingSelectedNoHUD");
07721 addMenu(new LLEditableSelected(), "EditableSelected");
07722 }