00001
00032 #include "llviewerprecompiledheaders.h"
00033
00034 #include "llpanelavatar.h"
00035
00036 #include "llclassifiedflags.h"
00037 #include "llfontgl.h"
00038 #include "llcachename.h"
00039
00040 #include "llavatarconstants.h"
00041 #include "lluiconstants.h"
00042 #include "lltextbox.h"
00043 #include "llviewertexteditor.h"
00044 #include "lltexturectrl.h"
00045 #include "llagent.h"
00046 #include "llviewerwindow.h"
00047 #include "llbutton.h"
00048 #include "llcallingcard.h"
00049 #include "llcheckboxctrl.h"
00050 #include "llfloater.h"
00051
00052 #include "llfloaterfriends.h"
00053 #include "llfloatergroupinfo.h"
00054 #include "llfloaterworldmap.h"
00055 #include "llfloatermute.h"
00056 #include "llfloateravatarinfo.h"
00057 #include "lliconctrl.h"
00058 #include "llinventoryview.h"
00059 #include "lllineeditor.h"
00060 #include "llnameeditor.h"
00061 #include "llmutelist.h"
00062 #include "llpanelclassified.h"
00063 #include "llpanelpick.h"
00064 #include "llscrolllistctrl.h"
00065 #include "llstatusbar.h"
00066 #include "lltabcontainer.h"
00067 #include "lltabcontainervertical.h"
00068 #include "llimview.h"
00069 #include "lltooldraganddrop.h"
00070 #include "lluiconstants.h"
00071 #include "llvoavatar.h"
00072 #include "llviewercontrol.h"
00073 #include "llviewermenu.h"
00074 #include "llviewergenericmessage.h"
00075 #include "llviewerobjectlist.h"
00076 #include "llviewerregion.h"
00077 #include "llweb.h"
00078 #include "llinventorymodel.h"
00079 #include "roles_constants.h"
00080
00081 #define kArraySize( _kArray ) ( sizeof( (_kArray) ) / sizeof( _kArray[0] ) )
00082
00083 #include "lluictrlfactory.h"
00084
00085
00086 std::list<LLPanelAvatar*> LLPanelAvatar::sAllPanels;
00087 BOOL LLPanelAvatar::sAllowFirstLife = FALSE;
00088
00089 extern void handle_lure(const LLUUID& invitee);
00090 extern void handle_pay_by_id(const LLUUID& payee);
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100 class LLDropTarget : public LLView
00101 {
00102 public:
00103 LLDropTarget(const std::string& name, const LLRect& rect, const LLUUID& agent_id);
00104 ~LLDropTarget();
00105
00106 void doDrop(EDragAndDropType cargo_type, void* cargo_data);
00107
00108
00109
00110 virtual BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
00111 EDragAndDropType cargo_type,
00112 void* cargo_data,
00113 EAcceptance* accept,
00114 LLString& tooltip_msg);
00115 void setAgentID(const LLUUID &agent_id) { mAgentID = agent_id; }
00116 protected:
00117 LLUUID mAgentID;
00118 };
00119
00120
00121 LLDropTarget::LLDropTarget(const std::string& name, const LLRect& rect,
00122 const LLUUID& agent_id) :
00123 LLView(name, rect, NOT_MOUSE_OPAQUE, FOLLOWS_ALL),
00124 mAgentID(agent_id)
00125 {
00126 }
00127
00128 LLDropTarget::~LLDropTarget()
00129 {
00130 }
00131
00132 void LLDropTarget::doDrop(EDragAndDropType cargo_type, void* cargo_data)
00133 {
00134 llinfos << "LLDropTarget::doDrop()" << llendl;
00135 }
00136
00137 BOOL LLDropTarget::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
00138 EDragAndDropType cargo_type,
00139 void* cargo_data,
00140 EAcceptance* accept,
00141 LLString& tooltip_msg)
00142 {
00143 BOOL handled = FALSE;
00144 if(getParent())
00145 {
00146
00147
00148
00149 handled = TRUE;
00150
00151
00152 switch(cargo_type)
00153 {
00154 case DAD_TEXTURE:
00155 case DAD_SOUND:
00156 case DAD_LANDMARK:
00157 case DAD_SCRIPT:
00158 case DAD_OBJECT:
00159 case DAD_NOTECARD:
00160 case DAD_CLOTHING:
00161 case DAD_BODYPART:
00162 case DAD_ANIMATION:
00163 case DAD_GESTURE:
00164 {
00165 LLViewerInventoryItem* inv_item = (LLViewerInventoryItem*)cargo_data;
00166 if(gInventory.getItem(inv_item->getUUID())
00167 && LLToolDragAndDrop::isInventoryGiveAcceptable(inv_item))
00168 {
00169
00170 *accept = ACCEPT_YES_COPY_SINGLE;
00171 if(drop)
00172 {
00173 LLToolDragAndDrop::giveInventory(mAgentID, inv_item);
00174 }
00175 }
00176 else
00177 {
00178
00179
00180
00181
00182 *accept = ACCEPT_NO;
00183 }
00184 break;
00185 }
00186 case DAD_CATEGORY:
00187 {
00188 LLViewerInventoryCategory* inv_cat = (LLViewerInventoryCategory*)cargo_data;
00189 if( gInventory.getCategory( inv_cat->getUUID() ) )
00190 {
00191
00192 *accept = ACCEPT_YES_COPY_SINGLE;
00193 if(drop)
00194 {
00195 LLToolDragAndDrop::giveInventoryCategory(mAgentID,
00196 inv_cat);
00197 }
00198 }
00199 else
00200 {
00201
00202
00203
00204
00205 *accept = ACCEPT_NO;
00206 }
00207 break;
00208 }
00209 case DAD_CALLINGCARD:
00210 default:
00211 *accept = ACCEPT_NO;
00212 break;
00213 }
00214 }
00215 return handled;
00216 }
00217
00218
00219
00220
00221
00222 LLPanelAvatarTab::LLPanelAvatarTab(const std::string& name, const LLRect &rect,
00223 LLPanelAvatar* panel_avatar)
00224 : LLPanel(name, rect),
00225 mPanelAvatar(panel_avatar),
00226 mDataRequested(false)
00227 { }
00228
00229
00230 void LLPanelAvatarTab::draw()
00231 {
00232 refresh();
00233
00234 LLPanel::draw();
00235 }
00236
00237 void LLPanelAvatarTab::sendAvatarProfileRequestIfNeeded(const char* method)
00238 {
00239 if (!mDataRequested)
00240 {
00241 std::vector<std::string> strings;
00242 strings.push_back( mPanelAvatar->getAvatarID().asString() );
00243 send_generic_message(method, strings);
00244 mDataRequested = true;
00245 }
00246 }
00247
00248
00249
00250
00251 LLPanelAvatarSecondLife::LLPanelAvatarSecondLife(const std::string& name,
00252 const LLRect &rect,
00253 LLPanelAvatar* panel_avatar )
00254 : LLPanelAvatarTab(name, rect, panel_avatar),
00255 mPartnerID()
00256 {
00257 }
00258
00259 void LLPanelAvatarSecondLife::refresh()
00260 {
00261 updatePartnerName();
00262 }
00263
00264 void LLPanelAvatarSecondLife::updatePartnerName()
00265 {
00266 if (mPartnerID.notNull())
00267 {
00268 std::string first, last;
00269 BOOL found = gCacheName->getName(mPartnerID, first, last);
00270 if (found)
00271 {
00272 childSetTextArg("partner_edit", "[FIRST]", first);
00273 childSetTextArg("partner_edit", "[LAST]", last);
00274 }
00275 childSetEnabled("partner_info", TRUE);
00276 }
00277 }
00278
00279
00280
00281
00282
00283
00284 void LLPanelAvatarSecondLife::clearControls()
00285 {
00286 LLTextureCtrl* image_ctrl = getChild<LLTextureCtrl>("img");
00287 if(image_ctrl)
00288 {
00289 image_ctrl->setImageAssetID(LLUUID::null);
00290 }
00291 childSetValue("about", "");
00292 childSetValue("born", "");
00293 childSetValue("acct", "");
00294
00295 childSetTextArg("partner_edit", "[FIRST]", LLString::null);
00296 childSetTextArg("partner_edit", "[LAST]", LLString::null);
00297
00298 mPartnerID = LLUUID::null;
00299
00300 LLScrollListCtrl* group_list = getChild<LLScrollListCtrl>("groups");
00301 if(group_list)
00302 {
00303 group_list->deleteAllItems();
00304 }
00305 LLScrollListCtrl* ratings_list = getChild<LLScrollListCtrl>("ratings");
00306 if(ratings_list)
00307 {
00308 ratings_list->deleteAllItems();
00309 }
00310
00311 }
00312
00313
00314
00315
00316
00317 void LLPanelAvatarSecondLife::enableControls(BOOL self)
00318 {
00319 childSetEnabled("img", self);
00320 childSetEnabled("about", self);
00321 childSetVisible("allow_publish", self);
00322 childSetEnabled("allow_publish", self);
00323 childSetVisible("?", self);
00324 childSetEnabled("?", self);
00325 }
00326
00327
00328
00329 void LLPanelAvatarSecondLife::onClickImage(void *)
00330 { }
00331
00332
00333 void LLPanelAvatarSecondLife::onDoubleClickGroup(void* data)
00334 {
00335 LLPanelAvatarSecondLife* self = (LLPanelAvatarSecondLife*)data;
00336
00337
00338 LLScrollListCtrl* group_list = self->getChild<LLScrollListCtrl>("groups");
00339 if(group_list)
00340 {
00341 LLScrollListItem* item = group_list->getFirstSelected();
00342
00343 if(item && item->getUUID().notNull())
00344 {
00345 llinfos << "Show group info " << item->getUUID() << llendl;
00346
00347 LLFloaterGroupInfo::showFromUUID(item->getUUID());
00348 }
00349 }
00350 }
00351
00352
00353 void LLPanelAvatarSecondLife::onClickPublishHelp(void *)
00354 {
00355 gViewerWindow->alertXml("ClickPublishHelpAvatar");
00356 }
00357
00358
00359 void LLPanelAvatarSecondLife::onClickPartnerHelp(void *)
00360 {
00361 gViewerWindow->alertXml("ClickPartnerHelpAvatar", onClickPartnerHelpLoadURL, (void*) NULL);
00362 }
00363
00364
00365 void LLPanelAvatarSecondLife::onClickPartnerHelpLoadURL(S32 option, void* userdata)
00366 {
00367 if (option == 0)
00368 LLWeb::loadURL("http://secondlife.com/partner");
00369 }
00370
00371
00372 void LLPanelAvatarSecondLife::onClickPartnerInfo(void *data)
00373 {
00374 LLPanelAvatarSecondLife* self = (LLPanelAvatarSecondLife*) data;
00375 if (self->mPartnerID.notNull())
00376 {
00377 LLFloaterAvatarInfo::showFromProfile(self->mPartnerID,
00378 self->getScreenRect());
00379 }
00380 }
00381
00382
00383
00384
00385 LLPanelAvatarFirstLife::LLPanelAvatarFirstLife(const std::string& name,
00386 const LLRect &rect,
00387 LLPanelAvatar* panel_avatar )
00388 : LLPanelAvatarTab(name, rect, panel_avatar)
00389 {
00390 }
00391
00392
00393 void LLPanelAvatarFirstLife::enableControls(BOOL self)
00394 {
00395 childSetEnabled("img", self);
00396 childSetEnabled("about", self);
00397 }
00398
00399
00400
00401
00402
00403 BOOL LLPanelAvatarSecondLife::postBuild(void)
00404 {
00405 childSetEnabled("born", FALSE);
00406 childSetEnabled("partner_edit", FALSE);
00407 childSetAction("partner_help",onClickPartnerHelp,this);
00408 childSetAction("partner_info", onClickPartnerInfo, this);
00409 childSetEnabled("partner_info", mPartnerID.notNull());
00410
00411 childSetAction("?",onClickPublishHelp,this);
00412 BOOL own_avatar = (getPanelAvatar()->getAvatarID() == gAgent.getID() );
00413 enableControls(own_avatar);
00414
00415 childSetVisible("About:",LLPanelAvatar::sAllowFirstLife);
00416 childSetVisible("(500 chars)",LLPanelAvatar::sAllowFirstLife);
00417 childSetVisible("about",LLPanelAvatar::sAllowFirstLife);
00418
00419 childSetVisible("allow_publish",LLPanelAvatar::sAllowFirstLife);
00420 childSetVisible("?",LLPanelAvatar::sAllowFirstLife);
00421
00422 childSetVisible("online_yes",FALSE);
00423
00424
00425
00426 childSetVisible("online_unknown",FALSE);
00427 childSetVisible("online_no",FALSE);
00428
00429 childSetAction("Find on Map", LLPanelAvatar::onClickTrack, getPanelAvatar());
00430 childSetAction("Instant Message...", LLPanelAvatar::onClickIM, getPanelAvatar());
00431
00432 childSetAction("Add Friend...", LLPanelAvatar::onClickAddFriend, getPanelAvatar());
00433 childSetAction("Pay...", LLPanelAvatar::onClickPay, getPanelAvatar());
00434 childSetAction("Mute", LLPanelAvatar::onClickMute, getPanelAvatar() );
00435
00436 childSetAction("Offer Teleport...", LLPanelAvatar::onClickOfferTeleport,
00437 getPanelAvatar() );
00438
00439 childSetDoubleClickCallback("groups", onDoubleClickGroup, this );
00440
00441 return TRUE;
00442 }
00443
00444 BOOL LLPanelAvatarFirstLife::postBuild(void)
00445 {
00446 BOOL own_avatar = (getPanelAvatar()->getAvatarID() == gAgent.getID() );
00447 enableControls(own_avatar);
00448 return TRUE;
00449 }
00450
00451 BOOL LLPanelAvatarNotes::postBuild(void)
00452 {
00453 childSetCommitCallback("notes edit",onCommitNotes,this);
00454
00455 LLTextEditor* te = getChild<LLTextEditor>("notes edit");
00456 if(te) te->setCommitOnFocusLost(TRUE);
00457 return TRUE;
00458 }
00459
00460 BOOL LLPanelAvatarWeb::postBuild(void)
00461 {
00462 childSetAction("load",onClickLoad,this);
00463 childSetAction("open",onClickOpen,this);
00464 childSetAction("home",onClickLoad,this);
00465 childSetAction("web_profile_help",onClickWebProfileHelp,this);
00466
00467 childSetCommitCallback("url_edit",onCommitURL,this);
00468
00469 childSetControlName("auto_load","AutoLoadWebProfiles");
00470
00471 mWebBrowser = getChild<LLWebBrowserCtrl>("profile_html");
00472
00473
00474 mWebBrowser->setOpenInExternalBrowser( false );
00475
00476
00477 mWebBrowser->addObserver( this );
00478
00479 return TRUE;
00480 }
00481
00482 BOOL LLPanelAvatarClassified::postBuild(void)
00483 {
00484 childSetAction("New...",onClickNew,NULL);
00485 childSetAction("Delete...",onClickDelete,NULL);
00486 return TRUE;
00487 }
00488
00489 BOOL LLPanelAvatarPicks::postBuild(void)
00490 {
00491 childSetAction("New...",onClickNew,NULL);
00492 childSetAction("Delete...",onClickDelete,NULL);
00493 return TRUE;
00494 }
00495
00496 BOOL LLPanelAvatarAdvanced::postBuild()
00497 {
00498 for(size_t ii = 0; ii < kArraySize(mWantToCheck); ++ii)
00499 mWantToCheck[ii] = NULL;
00500 for(size_t ii = 0; ii < kArraySize(mSkillsCheck); ++ii)
00501 mSkillsCheck[ii] = NULL;
00502 mWantToCount = (8>kArraySize(mWantToCheck))?kArraySize(mWantToCheck):8;
00503 for(S32 tt=0; tt < mWantToCount; ++tt)
00504 {
00505 LLString ctlname = llformat("chk%d", tt);
00506 mWantToCheck[tt] = getChild<LLCheckBoxCtrl>(ctlname);
00507 }
00508 mSkillsCount = (6>kArraySize(mSkillsCheck))?kArraySize(mSkillsCheck):6;
00509
00510 for(S32 tt=0; tt < mSkillsCount; ++tt)
00511 {
00512
00513 LLString ctlname = llformat("schk%d",tt);
00514 mSkillsCheck[tt] = getChild<LLCheckBoxCtrl>(ctlname);
00515 }
00516
00517 mWantToEdit = getChild<LLLineEditor>("want_to_edit");
00518 mSkillsEdit = getChild<LLLineEditor>("skills_edit");
00519 childSetVisible("skills_edit",LLPanelAvatar::sAllowFirstLife);
00520 childSetVisible("want_to_edit",LLPanelAvatar::sAllowFirstLife);
00521
00522 return TRUE;
00523 }
00524
00525
00526
00527
00528 LLPanelAvatarWeb::LLPanelAvatarWeb(const std::string& name, const LLRect& rect,
00529 LLPanelAvatar* panel_avatar)
00530 : LLPanelAvatarTab(name, rect, panel_avatar),
00531 mWebBrowser(NULL)
00532 {
00533 }
00534
00535 LLPanelAvatarWeb::~LLPanelAvatarWeb()
00536 {
00537
00538 if ( mWebBrowser )
00539 {
00540 mWebBrowser->remObserver( this );
00541 };
00542 }
00543
00544 void LLPanelAvatarWeb::enableControls(BOOL self)
00545 {
00546 childSetEnabled("url_edit",self);
00547 childSetVisible("status_text",!self && !mURL.empty());
00548 childSetText("status_text", LLString::null);
00549 }
00550
00551 void LLPanelAvatarWeb::setWebURL(std::string url)
00552 {
00553 bool changed_url = (mURL != url);
00554
00555 mURL = url;
00556 bool have_url = !mURL.empty();
00557
00558 childSetText("url_edit",mURL);
00559
00560 childSetEnabled("load",have_url);
00561 childSetEnabled("open",have_url);
00562
00563 childSetVisible("home",false);
00564 childSetVisible("load",true);
00565
00566 if (have_url
00567 && gSavedSettings.getBOOL("AutoLoadWebProfiles"))
00568 {
00569 if (changed_url)
00570 {
00571 load();
00572 }
00573 }
00574 else
00575 {
00576 childSetVisible("profile_html",false);
00577 }
00578
00579 BOOL own_avatar = (getPanelAvatar()->getAvatarID() == gAgent.getID() );
00580 childSetVisible("status_text",!own_avatar && !mURL.empty());
00581
00582 }
00583
00584
00585 void LLPanelAvatarWeb::onCommitURL(LLUICtrl* ctrl, void* data)
00586 {
00587 LLPanelAvatarWeb* self = (LLPanelAvatarWeb*)data;
00588
00589 if (!self) return;
00590
00591 self->load( self->childGetText("url_edit") );
00592 }
00593
00594
00595 void LLPanelAvatarWeb::onClickWebProfileHelp(void *)
00596 {
00597 gViewerWindow->alertXml("ClickWebProfileHelpAvatar");
00598 }
00599
00600 void LLPanelAvatarWeb::load(std::string url)
00601 {
00602 bool have_url = (!url.empty());
00603
00604 if (have_url)
00605 {
00606 llinfos << "Loading " << url << llendl;
00607 mWebBrowser->navigateTo( url );
00608 }
00609
00610
00611
00612 bool use_home = (have_url
00613 || url != mURL);
00614
00615 childSetVisible("profile_html",have_url);
00616 childSetVisible("load",!use_home);
00617 childSetVisible("home",use_home);
00618
00619 childSetEnabled("load",!use_home);
00620 childSetEnabled("home",use_home);
00621 childSetEnabled("open",have_url);
00622
00623 }
00624
00625 void LLPanelAvatarWeb::load()
00626 {
00627 load(mURL);
00628 }
00629
00630
00631 void LLPanelAvatarWeb::onClickLoad(void* data)
00632 {
00633 LLPanelAvatarWeb* self = (LLPanelAvatarWeb*)data;
00634
00635 if (!self) return;
00636
00637 self->load();
00638 }
00639
00640
00641 void LLPanelAvatarWeb::onClickOpen(void* data)
00642 {
00643 LLPanelAvatarWeb* self = (LLPanelAvatarWeb*)data;
00644
00645 if (!self) return;
00646
00647 std::string url = self->childGetText("url_edit");
00648 if (!url.empty())
00649 {
00650 LLWeb::loadURLExternal(url);
00651 }
00652 }
00653
00654 void LLPanelAvatarWeb::onStatusTextChange( const EventType& eventIn )
00655 {
00656 childSetText("status_text", eventIn.getStringValue() );
00657 }
00658
00659 void LLPanelAvatarWeb::onLocationChange( const EventType& eventIn )
00660 {
00661 childSetText("url_edit", eventIn.getStringValue() );
00662 }
00663
00664
00665
00666
00667
00668 LLPanelAvatarAdvanced::LLPanelAvatarAdvanced(const std::string& name,
00669 const LLRect& rect,
00670 LLPanelAvatar* panel_avatar)
00671 : LLPanelAvatarTab(name, rect, panel_avatar),
00672 mWantToCount(0),
00673 mSkillsCount(0),
00674 mWantToEdit( NULL ),
00675 mSkillsEdit( NULL )
00676 {
00677 }
00678
00679 void LLPanelAvatarAdvanced::enableControls(BOOL self)
00680 {
00681 S32 t;
00682 for(t=0;t<mWantToCount;t++)
00683 {
00684 if(mWantToCheck[t])mWantToCheck[t]->setEnabled(self);
00685 }
00686 for(t=0;t<mSkillsCount;t++)
00687 {
00688 if(mSkillsCheck[t])mSkillsCheck[t]->setEnabled(self);
00689 }
00690
00691 if (mWantToEdit) mWantToEdit->setEnabled(self);
00692 if (mSkillsEdit) mSkillsEdit->setEnabled(self);
00693 childSetEnabled("languages_edit",self);
00694 }
00695
00696 void LLPanelAvatarAdvanced::setWantSkills(U32 want_to_mask, const std::string& want_to_text,
00697 U32 skills_mask, const std::string& skills_text,
00698 const std::string& languages_text)
00699 {
00700 for(int id =0;id<mWantToCount;id++)
00701 {
00702 mWantToCheck[id]->set( want_to_mask & 1<<id );
00703 }
00704 for(int id =0;id<mSkillsCount;id++)
00705 {
00706 mSkillsCheck[id]->set( skills_mask & 1<<id );
00707 }
00708 if (mWantToEdit && mSkillsEdit)
00709 {
00710 mWantToEdit->setText( want_to_text );
00711 mSkillsEdit->setText( skills_text );
00712 }
00713
00714 childSetText("languages_edit",languages_text);
00715 }
00716
00717 void LLPanelAvatarAdvanced::getWantSkills(U32* want_to_mask, std::string& want_to_text,
00718 U32* skills_mask, std::string& skills_text,
00719 std::string& languages_text)
00720 {
00721 if (want_to_mask)
00722 {
00723 *want_to_mask = 0;
00724 for(int t=0;t<mWantToCount;t++)
00725 {
00726 if(mWantToCheck[t]->get())
00727 *want_to_mask |= 1<<t;
00728 }
00729 }
00730 if (skills_mask)
00731 {
00732 *skills_mask = 0;
00733 for(int t=0;t<mSkillsCount;t++)
00734 {
00735 if(mSkillsCheck[t]->get())
00736 *skills_mask |= 1<<t;
00737 }
00738 }
00739 if (mWantToEdit)
00740 {
00741 want_to_text = mWantToEdit->getText();
00742 }
00743
00744 if (mSkillsEdit)
00745 {
00746 skills_text = mSkillsEdit->getText();
00747 }
00748
00749 languages_text = childGetText("languages_edit");
00750 }
00751
00752
00753
00754
00755 LLPanelAvatarNotes::LLPanelAvatarNotes(const std::string& name, const LLRect& rect, LLPanelAvatar* panel_avatar)
00756 : LLPanelAvatarTab(name, rect, panel_avatar)
00757 {
00758 }
00759
00760 void LLPanelAvatarNotes::refresh()
00761 {
00762 sendAvatarProfileRequestIfNeeded("avatarnotesrequest");
00763 }
00764
00765 void LLPanelAvatarNotes::clearControls()
00766 {
00767 childSetText("notes edit", getString("Loading"));
00768 childSetEnabled("notes edit", false);
00769 }
00770
00771
00772 void LLPanelAvatarNotes::onCommitNotes(LLUICtrl*, void* userdata)
00773 {
00774 LLPanelAvatarNotes* self = (LLPanelAvatarNotes*)userdata;
00775
00776 self->getPanelAvatar()->sendAvatarNotesUpdate();
00777 }
00778
00779
00780
00781
00782
00783 LLPanelAvatarClassified::LLPanelAvatarClassified(const LLString& name, const LLRect& rect,
00784 LLPanelAvatar* panel_avatar)
00785 : LLPanelAvatarTab(name, rect, panel_avatar)
00786 {
00787 }
00788
00789
00790 void LLPanelAvatarClassified::refresh()
00791 {
00792 BOOL self = (gAgent.getID() == getPanelAvatar()->getAvatarID());
00793
00794 LLTabContainer* tabs = getChild<LLTabContainer>("classified tab");
00795
00796 S32 tab_count = tabs ? tabs->getTabCount() : 0;
00797
00798 bool allow_new = tab_count < MAX_CLASSIFIEDS;
00799 bool allow_delete = (tab_count > 0);
00800 bool show_help = (tab_count == 0);
00801
00802
00803
00804
00805 bool in_directory = false;
00806 LLView* view = this;
00807 while (view)
00808 {
00809 if (view->getName() == "directory")
00810 {
00811 in_directory = true;
00812 break;
00813 }
00814 view = view->getParent();
00815 }
00816 childSetEnabled("New...", self && !in_directory && allow_new);
00817 childSetVisible("New...", !in_directory);
00818 childSetEnabled("Delete...", self && !in_directory && allow_delete);
00819 childSetVisible("Delete...", !in_directory);
00820 childSetVisible("classified tab",!show_help);
00821
00822 sendAvatarProfileRequestIfNeeded("avatarclassifiedsrequest");
00823 }
00824
00825
00826 BOOL LLPanelAvatarClassified::canClose()
00827 {
00828 LLTabContainer* tabs = getChild<LLTabContainer>("classified tab");
00829 for (S32 i = 0; i < tabs->getTabCount(); i++)
00830 {
00831 LLPanelClassified* panel = (LLPanelClassified*)tabs->getPanelByIndex(i);
00832 if (!panel->canClose())
00833 {
00834 return FALSE;
00835 }
00836 }
00837 return TRUE;
00838 }
00839
00840 BOOL LLPanelAvatarClassified::titleIsValid()
00841 {
00842 LLTabContainer* tabs = getChild<LLTabContainer>("classified tab");
00843 if ( tabs )
00844 {
00845 LLPanelClassified* panel = (LLPanelClassified*)tabs->getCurrentPanel();
00846 if ( panel )
00847 {
00848 if ( ! panel->titleIsValid() )
00849 {
00850 return FALSE;
00851 };
00852 };
00853 };
00854
00855 return TRUE;
00856 }
00857
00858 void LLPanelAvatarClassified::apply()
00859 {
00860 LLTabContainer* tabs = getChild<LLTabContainer>("classified tab");
00861 for (S32 i = 0; i < tabs->getTabCount(); i++)
00862 {
00863 LLPanelClassified* panel = (LLPanelClassified*)tabs->getPanelByIndex(i);
00864 panel->apply();
00865 }
00866 }
00867
00868
00869 void LLPanelAvatarClassified::deleteClassifiedPanels()
00870 {
00871 LLTabContainer* tabs = getChild<LLTabContainer>("classified tab");
00872 if (tabs)
00873 {
00874 tabs->deleteAllTabs();
00875 }
00876
00877 childSetVisible("New...", false);
00878 childSetVisible("Delete...", false);
00879 childSetVisible("loading_text", true);
00880 }
00881
00882
00883 void LLPanelAvatarClassified::processAvatarClassifiedReply(LLMessageSystem* msg, void**)
00884 {
00885 S32 block = 0;
00886 S32 block_count = 0;
00887 LLUUID classified_id;
00888 char classified_name[DB_PICK_NAME_SIZE];
00889 LLPanelClassified* panel_classified = NULL;
00890
00891 LLTabContainer* tabs = getChild<LLTabContainer>("classified tab");
00892
00893
00894
00895
00896 block_count = msg->getNumberOfBlocksFast(_PREHASH_Data);
00897 for (block = 0; block < block_count; block++)
00898 {
00899 msg->getUUIDFast(_PREHASH_Data, _PREHASH_ClassifiedID, classified_id, block);
00900 msg->getStringFast(_PREHASH_Data, _PREHASH_Name, DB_PICK_NAME_SIZE, classified_name, block);
00901
00902 panel_classified = new LLPanelClassified(false, false);
00903
00904 panel_classified->setClassifiedID(classified_id);
00905
00906
00907 panel_classified->markForServerRequest();
00908
00909
00910 if(tabs)
00911 {
00912 tabs->addTabPanel(panel_classified, classified_name);
00913 }
00914 }
00915
00916
00917
00918 if(tabs)
00919 {
00920 tabs->selectFirstTab();
00921 }
00922
00923 childSetVisible("New...", true);
00924 childSetVisible("Delete...", true);
00925 childSetVisible("loading_text", false);
00926 }
00927
00928
00929
00930
00931
00932 void LLPanelAvatarClassified::onClickNew(void* data)
00933 {
00934 LLPanelAvatarClassified* self = (LLPanelAvatarClassified*)data;
00935
00936 gViewerWindow->alertXml("AddClassified",callbackNew,self);
00937
00938 }
00939
00940
00941 void LLPanelAvatarClassified::callbackNew(S32 option, void* data)
00942 {
00943 LLPanelAvatarClassified* self = (LLPanelAvatarClassified*)data;
00944
00945 if (0 == option)
00946 {
00947 LLPanelClassified* panel_classified = new LLPanelClassified(false, false);
00948 panel_classified->initNewClassified();
00949 LLTabContainer* tabs = self->getChild<LLTabContainer>("classified tab");
00950 if(tabs)
00951 {
00952 tabs->addTabPanel(panel_classified, panel_classified->getClassifiedName());
00953 tabs->selectLastTab();
00954 }
00955 }
00956 }
00957
00958
00959
00960 void LLPanelAvatarClassified::onClickDelete(void* data)
00961 {
00962 LLPanelAvatarClassified* self = (LLPanelAvatarClassified*)data;
00963
00964 LLTabContainer* tabs = self->getChild<LLTabContainer>("classified tab");
00965 LLPanelClassified* panel_classified = NULL;
00966 if(tabs)
00967 {
00968 panel_classified = (LLPanelClassified*)tabs->getCurrentPanel();
00969 }
00970 if (!panel_classified) return;
00971
00972 LLStringBase<char>::format_map_t args;
00973 args["[NAME]"] = panel_classified->getClassifiedName();
00974 gViewerWindow->alertXml("DeleteClassified", args, callbackDelete, self);
00975
00976 }
00977
00978
00979
00980 void LLPanelAvatarClassified::callbackDelete(S32 option, void* data)
00981 {
00982 LLPanelAvatarClassified* self = (LLPanelAvatarClassified*)data;
00983 LLTabContainer* tabs = self->getChild<LLTabContainer>("classified tab");
00984 LLPanelClassified* panel_classified=NULL;
00985 if(tabs)
00986 {
00987 panel_classified = (LLPanelClassified*)tabs->getCurrentPanel();
00988 }
00989
00990 LLMessageSystem* msg = gMessageSystem;
00991
00992 if (!panel_classified) return;
00993
00994 if (0 == option)
00995 {
00996 msg->newMessageFast(_PREHASH_ClassifiedDelete);
00997 msg->nextBlockFast(_PREHASH_AgentData);
00998 msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
00999 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
01000 msg->nextBlockFast(_PREHASH_Data);
01001 msg->addUUIDFast(_PREHASH_ClassifiedID, panel_classified->getClassifiedID());
01002 gAgent.sendReliableMessage();
01003
01004 if(tabs)
01005 {
01006 tabs->removeTabPanel(panel_classified);
01007 }
01008 delete panel_classified;
01009 panel_classified = NULL;
01010 }
01011 }
01012
01013
01014
01015
01016
01017 LLPanelAvatarPicks::LLPanelAvatarPicks(const std::string& name,
01018 const LLRect& rect,
01019 LLPanelAvatar* panel_avatar)
01020 : LLPanelAvatarTab(name, rect, panel_avatar)
01021 {
01022 }
01023
01024
01025 void LLPanelAvatarPicks::refresh()
01026 {
01027 BOOL self = (gAgent.getID() == getPanelAvatar()->getAvatarID());
01028 LLTabContainer* tabs = getChild<LLTabContainer>("picks tab");
01029 S32 tab_count = tabs ? tabs->getTabCount() : 0;
01030 childSetEnabled("New...", self && tab_count < MAX_AVATAR_PICKS);
01031 childSetEnabled("Delete...", self && tab_count > 0);
01032 childSetVisible("New...", self && getPanelAvatar()->isEditable());
01033 childSetVisible("Delete...", self && getPanelAvatar()->isEditable());
01034
01035 sendAvatarProfileRequestIfNeeded("avatarpicksrequest");
01036 }
01037
01038
01039 void LLPanelAvatarPicks::deletePickPanels()
01040 {
01041 LLTabContainer* tabs = getChild<LLTabContainer>("picks tab");
01042 if(tabs)
01043 {
01044 tabs->deleteAllTabs();
01045 }
01046
01047 childSetVisible("New...", false);
01048 childSetVisible("Delete...", false);
01049 childSetVisible("loading_text", true);
01050 }
01051
01052 void LLPanelAvatarPicks::processAvatarPicksReply(LLMessageSystem* msg, void**)
01053 {
01054 S32 block = 0;
01055 S32 block_count = 0;
01056 LLUUID pick_id;
01057 char pick_name[DB_PICK_NAME_SIZE];
01058 LLPanelPick* panel_pick = NULL;
01059
01060 LLTabContainer* tabs = getChild<LLTabContainer>("picks tab");
01061
01062
01063
01064 deletePickPanels();
01065
01066
01067 LLUUID avatar_id = getPanelAvatar()->getAvatarID();
01068
01069 block_count = msg->getNumberOfBlocks("Data");
01070 for (block = 0; block < block_count; block++)
01071 {
01072 msg->getUUID("Data", "PickID", pick_id, block);
01073 msg->getString("Data", "PickName", DB_PICK_NAME_SIZE, pick_name, block);
01074
01075 panel_pick = new LLPanelPick(FALSE);
01076
01077 panel_pick->setPickID(pick_id, avatar_id);
01078
01079
01080
01081 panel_pick->markForServerRequest();
01082
01083
01084 if(tabs)
01085 {
01086 tabs->addTabPanel(panel_pick, pick_name);
01087 }
01088 }
01089
01090
01091
01092 if(tabs)
01093 {
01094 tabs->selectFirstTab();
01095 }
01096
01097 childSetVisible("New...", true);
01098 childSetVisible("Delete...", true);
01099 childSetVisible("loading_text", false);
01100 }
01101
01102
01103
01104
01105
01106 void LLPanelAvatarPicks::onClickNew(void* data)
01107 {
01108 LLPanelAvatarPicks* self = (LLPanelAvatarPicks*)data;
01109 LLPanelPick* panel_pick = new LLPanelPick(FALSE);
01110 LLTabContainer* tabs = self->getChild<LLTabContainer>("picks tab");
01111
01112 panel_pick->initNewPick();
01113 if(tabs)
01114 {
01115 tabs->addTabPanel(panel_pick, panel_pick->getPickName());
01116 tabs->selectLastTab();
01117 }
01118 }
01119
01120
01121
01122 void LLPanelAvatarPicks::onClickDelete(void* data)
01123 {
01124 LLPanelAvatarPicks* self = (LLPanelAvatarPicks*)data;
01125 LLTabContainer* tabs = self->getChild<LLTabContainer>("picks tab");
01126 LLPanelPick* panel_pick = tabs?(LLPanelPick*)tabs->getCurrentPanel():NULL;
01127
01128 if (!panel_pick) return;
01129
01130 LLString::format_map_t args;
01131 args["[PICK]"] = panel_pick->getPickName();
01132
01133 gViewerWindow->alertXml("DeleteAvatarPick", args,
01134 callbackDelete,
01135 self);
01136 }
01137
01138
01139
01140 void LLPanelAvatarPicks::callbackDelete(S32 option, void* data)
01141 {
01142 LLPanelAvatarPicks* self = (LLPanelAvatarPicks*)data;
01143 LLTabContainer* tabs = self->getChild<LLTabContainer>("picks tab");
01144 LLPanelPick* panel_pick = tabs?(LLPanelPick*)tabs->getCurrentPanel():NULL;
01145 LLMessageSystem* msg = gMessageSystem;
01146
01147 if (!panel_pick) return;
01148
01149 if (0 == option)
01150 {
01151
01152
01153 if(gAgent.isGodlike())
01154 {
01155 msg->newMessage("PickGodDelete");
01156 msg->nextBlock("AgentData");
01157 msg->addUUID("AgentID", gAgent.getID());
01158 msg->addUUID("SessionID", gAgent.getSessionID());
01159 msg->nextBlock("Data");
01160 msg->addUUID("PickID", panel_pick->getPickID());
01161
01162
01163 msg->addUUID( "QueryID", panel_pick->getPickCreatorID() );
01164 }
01165 else
01166 {
01167 msg->newMessage("PickDelete");
01168 msg->nextBlock("AgentData");
01169 msg->addUUID("AgentID", gAgent.getID());
01170 msg->addUUID("SessionID", gAgent.getSessionID());
01171 msg->nextBlock("Data");
01172 msg->addUUID("PickID", panel_pick->getPickID());
01173 }
01174 gAgent.sendReliableMessage();
01175
01176 if(tabs)
01177 {
01178 tabs->removeTabPanel(panel_pick);
01179 }
01180 delete panel_pick;
01181 panel_pick = NULL;
01182 }
01183 }
01184
01185
01186
01187
01188
01189 LLPanelAvatar::LLPanelAvatar(
01190 const std::string& name,
01191 const LLRect &rect,
01192 BOOL allow_edit)
01193 :
01194 LLPanel(name, rect, FALSE),
01195 mPanelSecondLife(NULL),
01196 mPanelAdvanced(NULL),
01197 mPanelClassified(NULL),
01198 mPanelPicks(NULL),
01199 mPanelNotes(NULL),
01200 mPanelFirstLife(NULL),
01201 mPanelWeb(NULL),
01202 mDropTarget(NULL),
01203 mAvatarID( LLUUID::null ),
01204 mHaveProperties(FALSE),
01205 mHaveStatistics(FALSE),
01206 mHaveNotes(false),
01207 mLastNotes(),
01208 mAllowEdit(allow_edit)
01209 {
01210
01211 sAllPanels.push_back(this);
01212
01213 LLCallbackMap::map_t factory_map;
01214
01215 factory_map["2nd Life"] = LLCallbackMap(createPanelAvatarSecondLife, this);
01216 factory_map["WebProfile"] = LLCallbackMap(createPanelAvatarWeb, this);
01217 factory_map["Interests"] = LLCallbackMap(createPanelAvatarInterests, this);
01218 factory_map["Picks"] = LLCallbackMap(createPanelAvatarPicks, this);
01219 factory_map["Classified"] = LLCallbackMap(createPanelAvatarClassified, this);
01220 factory_map["1st Life"] = LLCallbackMap(createPanelAvatarFirstLife, this);
01221 factory_map["My Notes"] = LLCallbackMap(createPanelAvatarNotes, this);
01222
01223 LLUICtrlFactory::getInstance()->buildPanel(this, "panel_avatar.xml", &factory_map);
01224
01225 selectTab(0);
01226
01227
01228 }
01229
01230 BOOL LLPanelAvatar::postBuild(void)
01231 {
01232 mTab = getChild<LLTabContainer>("tab");
01233 childSetAction("Kick",onClickKick,this);
01234 childSetAction("Freeze",onClickFreeze, this);
01235 childSetAction("Unfreeze", onClickUnfreeze, this);
01236 childSetAction("csr_btn", onClickCSR, this);
01237 childSetAction("OK", onClickOK, this);
01238 childSetAction("Cancel", onClickCancel, this);
01239
01240 if(mTab && !sAllowFirstLife)
01241 {
01242 LLPanel* panel = mTab->getPanelByName("1st Life");
01243 if (panel) mTab->removeTabPanel(panel);
01244
01245 panel = mTab->getPanelByName("WebProfile");
01246 if (panel) mTab->removeTabPanel(panel);
01247 }
01248 childSetVisible("Kick",FALSE);
01249 childSetEnabled("Kick",FALSE);
01250 childSetVisible("Freeze",FALSE);
01251 childSetEnabled("Freeze",FALSE);
01252 childSetVisible("Unfreeze",FALSE);
01253 childSetEnabled("Unfreeze",FALSE);
01254 childSetVisible("csr_btn", FALSE);
01255 childSetEnabled("csr_btn", FALSE);
01256
01257 return TRUE;
01258 }
01259
01260
01261 LLPanelAvatar::~LLPanelAvatar()
01262 {
01263 sAllPanels.remove(this);
01264 }
01265
01266
01267 BOOL LLPanelAvatar::canClose()
01268 {
01269 return mPanelClassified && mPanelClassified->canClose();
01270 }
01271
01272 void LLPanelAvatar::setAvatar(LLViewerObject *avatarp)
01273 {
01274
01275 LLNameValue *firstname = avatarp->getNVPair("FirstName");
01276 LLNameValue *lastname = avatarp->getNVPair("LastName");
01277
01278 LLString name;
01279 if (firstname && lastname)
01280 {
01281 name.assign( firstname->getString() );
01282 name.append(" ");
01283 name.append( lastname->getString() );
01284 }
01285 else
01286 {
01287 name.assign("");
01288 }
01289
01290
01291 setAvatarID(avatarp->getID(), name, ONLINE_STATUS_YES);
01292 }
01293
01294 void LLPanelAvatar::setOnlineStatus(EOnlineStatus online_status)
01295 {
01296
01297
01298 if ((ONLINE_STATUS_YES != online_status)
01299 && mIsFriend
01300 && (LLAvatarTracker::instance().isBuddyOnline( mAvatarID )))
01301 {
01302 online_status = ONLINE_STATUS_YES;
01303 }
01304
01305 mPanelSecondLife->childSetVisible("online_yes", (online_status == ONLINE_STATUS_YES));
01306
01307
01308
01309
01310 if (mAvatarID != gAgent.getID())
01311 {
01312 childSetVisible("Offer Teleport...",TRUE);
01313 }
01314
01315 BOOL in_prelude = gAgent.inPrelude();
01316 if(gAgent.isGodlike())
01317 {
01318 childSetEnabled("Offer Teleport...", TRUE);
01319 childSetToolTip("Offer Teleport...", childGetValue("TeleportGod").asString());
01320 }
01321 else if (in_prelude)
01322 {
01323 childSetEnabled("Offer Teleport...",FALSE);
01324 childSetToolTip("Offer Teleport...",childGetValue("TeleportPrelude").asString());
01325 }
01326 else
01327 {
01328 childSetEnabled("Offer Teleport...", (online_status == ONLINE_STATUS_YES));
01329 childSetToolTip("Offer Teleport...", childGetValue("TeleportNormal").asString());
01330 }
01331 }
01332
01333 void LLPanelAvatar::setAvatarID(const LLUUID &avatar_id, const LLString &name,
01334 EOnlineStatus online_status)
01335 {
01336 if (avatar_id.isNull()) return;
01337
01338 BOOL avatar_changed = FALSE;
01339 if (avatar_id != mAvatarID)
01340 {
01341 avatar_changed = TRUE;
01342 }
01343 mAvatarID = avatar_id;
01344
01345
01346 mIsFriend = is_agent_friend(mAvatarID);
01347
01348
01349 setOnlineStatus(online_status);
01350
01351 BOOL own_avatar = (mAvatarID == gAgent.getID() );
01352 BOOL avatar_is_friend = LLAvatarTracker::instance().getBuddyInfo(mAvatarID) != NULL;
01353
01354 mPanelSecondLife->enableControls(own_avatar && mAllowEdit);
01355 mPanelWeb->enableControls(own_avatar && mAllowEdit);
01356 mPanelAdvanced->enableControls(own_avatar && mAllowEdit);
01357
01358 if (mPanelFirstLife) mPanelFirstLife->enableControls(own_avatar && mAllowEdit);
01359
01360 LLView *target_view = getChild<LLView>("drop_target_rect");
01361 if(target_view)
01362 {
01363 if (mDropTarget)
01364 {
01365 delete mDropTarget;
01366 }
01367 mDropTarget = new LLDropTarget("drop target", target_view->getRect(), mAvatarID);
01368 addChild(mDropTarget);
01369 mDropTarget->setAgentID(mAvatarID);
01370 }
01371
01372 LLNameEditor* name_edit = getChild<LLNameEditor>("name");
01373 if(name_edit)
01374 {
01375 if (name.empty())
01376 {
01377 name_edit->setNameID(avatar_id, FALSE);
01378 }
01379 else
01380 {
01381 name_edit->setText(name);
01382 }
01383 }
01384
01385 {
01386
01387
01388 mPanelSecondLife->clearControls();
01389
01390 mPanelPicks->deletePickPanels();
01391 mPanelPicks->setDataRequested(false);
01392
01393 mPanelClassified->deleteClassifiedPanels();
01394 mPanelClassified->setDataRequested(false);
01395
01396 mPanelNotes->clearControls();
01397 mPanelNotes->setDataRequested(false);
01398 mHaveNotes = false;
01399 mLastNotes.clear();
01400
01401
01402
01403
01404 sendAvatarPropertiesRequest();
01405
01406 if (own_avatar)
01407 {
01408 if (mAllowEdit)
01409 {
01410
01411 childSetVisible("OK", true);
01412 childSetEnabled("OK", false);
01413 childSetVisible("Cancel",TRUE);
01414 childSetEnabled("Cancel",TRUE);
01415 }
01416 else
01417 {
01418 childSetVisible("OK",FALSE);
01419 childSetEnabled("OK",FALSE);
01420 childSetVisible("Cancel",FALSE);
01421 childSetEnabled("Cancel",FALSE);
01422 }
01423 childSetVisible("Instant Message...",FALSE);
01424 childSetEnabled("Instant Message...",FALSE);
01425 childSetVisible("Mute",FALSE);
01426 childSetEnabled("Mute",FALSE);
01427 childSetVisible("Offer Teleport...",FALSE);
01428 childSetEnabled("Offer Teleport...",FALSE);
01429 childSetVisible("drop target",FALSE);
01430 childSetEnabled("drop target",FALSE);
01431 childSetVisible("Find on Map",FALSE);
01432 childSetEnabled("Find on Map",FALSE);
01433 childSetVisible("Add Friend...",FALSE);
01434 childSetEnabled("Add Friend...",FALSE);
01435 childSetVisible("Pay...",FALSE);
01436 childSetEnabled("Pay...",FALSE);
01437 }
01438 else
01439 {
01440 childSetVisible("OK",FALSE);
01441 childSetEnabled("OK",FALSE);
01442
01443 childSetVisible("Cancel",FALSE);
01444 childSetEnabled("Cancel",FALSE);
01445
01446 childSetVisible("Instant Message...",TRUE);
01447 childSetEnabled("Instant Message...",FALSE);
01448 childSetVisible("Mute",TRUE);
01449 childSetEnabled("Mute",FALSE);
01450
01451 childSetVisible("drop target",TRUE);
01452 childSetEnabled("drop target",FALSE);
01453
01454 childSetVisible("Find on Map",TRUE);
01455
01456 BOOL enable_track = gAgent.isGodlike() || is_agent_mappable(mAvatarID);
01457 childSetEnabled("Find on Map",enable_track);
01458 if (!mIsFriend)
01459 {
01460 childSetToolTip("Find on Map",childGetValue("ShowOnMapNonFriend").asString());
01461 }
01462 else if (ONLINE_STATUS_YES != online_status)
01463 {
01464 childSetToolTip("Find on Map",childGetValue("ShowOnMapFriendOffline").asString());
01465 }
01466 else
01467 {
01468 childSetToolTip("Find on Map",childGetValue("ShowOnMapFriendOnline").asString());
01469 }
01470 childSetVisible("Add Friend...", true);
01471 childSetEnabled("Add Friend...", !avatar_is_friend);
01472 childSetVisible("Pay...",TRUE);
01473 childSetEnabled("Pay...",FALSE);
01474 }
01475 }
01476
01477 BOOL is_god = FALSE;
01478 if (gAgent.isGodlike()) is_god = TRUE;
01479
01480 childSetVisible("Kick", is_god);
01481 childSetEnabled("Kick", is_god);
01482 childSetVisible("Freeze", is_god);
01483 childSetEnabled("Freeze", is_god);
01484 childSetVisible("Unfreeze", is_god);
01485 childSetEnabled("Unfreeze", is_god);
01486 childSetVisible("csr_btn", is_god);
01487 childSetEnabled("csr_btn", is_god);
01488 }
01489
01490
01491 void LLPanelAvatar::resetGroupList()
01492 {
01493
01494 if (mAvatarID != gAgent.getID())
01495 {
01496 return;
01497 }
01498
01499 if (mPanelSecondLife)
01500 {
01501 LLScrollListCtrl* group_list = mPanelSecondLife->getChild<LLScrollListCtrl>("groups");
01502 if (group_list)
01503 {
01504 group_list->deleteAllItems();
01505
01506 S32 count = gAgent.mGroups.count();
01507 LLUUID id;
01508
01509 for(S32 i = 0; i < count; ++i)
01510 {
01511 LLGroupData group_data = gAgent.mGroups.get(i);
01512 id = group_data.mID;
01513 std::string group_string;
01514
01515
01516
01517
01518
01519
01520
01521
01522
01523
01524
01525 group_string += group_data.mName;
01526
01527 LLSD row;
01528
01529 row["id"] = id ;
01530 row["columns"][0]["value"] = group_string;
01531 row["columns"][0]["font"] = "SANSSERIF_SMALL";
01532 row["columns"][0]["width"] = 0;
01533 group_list->addElement(row);
01534 }
01535 group_list->sortByColumn(0, TRUE);
01536 }
01537 }
01538 }
01539
01540
01541
01542
01543
01544 void LLPanelAvatar::onClickIM(void* userdata)
01545 {
01546 LLPanelAvatar* self = (LLPanelAvatar*) userdata;
01547 gIMMgr->setFloaterOpen(TRUE);
01548
01549 std::string name;
01550 LLNameEditor* nameedit = self->mPanelSecondLife->getChild<LLNameEditor>("name");
01551 if (nameedit) name = nameedit->getText();
01552 gIMMgr->addSession(name, IM_NOTHING_SPECIAL, self->mAvatarID);
01553 }
01554
01555
01556
01557
01558
01559
01560 void LLPanelAvatar::onClickTrack(void* userdata)
01561 {
01562 LLPanelAvatar* self = (LLPanelAvatar*) userdata;
01563
01564 if( gFloaterWorldMap )
01565 {
01566 std::string name;
01567 LLNameEditor* nameedit = self->mPanelSecondLife->getChild<LLNameEditor>("name");
01568 if (nameedit) name = nameedit->getText();
01569 gFloaterWorldMap->trackAvatar(self->mAvatarID, name);
01570 LLFloaterWorldMap::show(NULL, TRUE);
01571 }
01572 }
01573
01574
01575
01576 void LLPanelAvatar::onClickAddFriend(void* userdata)
01577 {
01578 LLPanelAvatar* self = (LLPanelAvatar*) userdata;
01579 LLNameEditor* name_edit = self->mPanelSecondLife->getChild<LLNameEditor>("name");
01580 if (name_edit)
01581 {
01582 LLPanelFriends::requestFriendshipDialog(self->getAvatarID(),
01583 name_edit->getText());
01584 }
01585 }
01586
01587
01588
01589
01590 void LLPanelAvatar::onClickMute(void *userdata)
01591 {
01592 LLPanelAvatar* self = (LLPanelAvatar*) userdata;
01593
01594 LLUUID agent_id = self->getAvatarID();
01595 LLNameEditor* name_edit = self->mPanelSecondLife->getChild<LLNameEditor>("name");
01596
01597 if (name_edit)
01598 {
01599 std::string agent_name = name_edit->getText();
01600 LLFloaterMute::showInstance();
01601
01602 if (LLMuteList::getInstance()->isMuted(agent_id))
01603 {
01604 LLFloaterMute::getInstance()->selectMute(agent_id);
01605 }
01606 else
01607 {
01608 LLMute mute(agent_id, agent_name, LLMute::AGENT);
01609 LLMuteList::getInstance()->add(mute);
01610 }
01611 }
01612 }
01613
01614
01615
01616 void LLPanelAvatar::onClickOfferTeleport(void *userdata)
01617 {
01618 LLPanelAvatar* self = (LLPanelAvatar*) userdata;
01619
01620 handle_lure(self->mAvatarID);
01621 }
01622
01623
01624
01625 void LLPanelAvatar::onClickPay(void *userdata)
01626 {
01627 LLPanelAvatar* self = (LLPanelAvatar*) userdata;
01628 handle_pay_by_id(self->mAvatarID);
01629 }
01630
01631
01632
01633 void LLPanelAvatar::onClickOK(void *userdata)
01634 {
01635 LLPanelAvatar *self = (LLPanelAvatar *)userdata;
01636
01637
01638
01639
01640 if (self
01641 && self->mHaveProperties)
01642 {
01643 self->sendAvatarPropertiesUpdate();
01644
01645 LLTabContainer* tabs = self->getChild<LLTabContainer>("tab");
01646 if ( tabs->getCurrentPanel() != self->mPanelClassified )
01647 {
01648 self->mPanelClassified->apply();
01649
01650 LLFloaterAvatarInfo *infop = LLFloaterAvatarInfo::getInstance(self->mAvatarID);
01651 if (infop)
01652 {
01653 infop->close();
01654 }
01655 }
01656 else
01657 {
01658 if ( self->mPanelClassified->titleIsValid() )
01659 {
01660 self->mPanelClassified->apply();
01661
01662 LLFloaterAvatarInfo *infop = LLFloaterAvatarInfo::getInstance(self->mAvatarID);
01663 if (infop)
01664 {
01665 infop->close();
01666 }
01667 }
01668 }
01669 }
01670 }
01671
01672
01673 void LLPanelAvatar::onClickCancel(void *userdata)
01674 {
01675 LLPanelAvatar *self = (LLPanelAvatar *)userdata;
01676
01677 if (self)
01678 {
01679 LLFloaterAvatarInfo *infop;
01680 if ((infop = LLFloaterAvatarInfo::getInstance(self->mAvatarID)))
01681 {
01682 infop->close();
01683 }
01684 else
01685 {
01686
01687
01688 self->sendAvatarPropertiesRequest();
01689 }
01690 }
01691 }
01692
01693
01694 void LLPanelAvatar::sendAvatarPropertiesRequest()
01695 {
01696 lldebugs << "LLPanelAvatar::sendAvatarPropertiesRequest()" << llendl;
01697 LLMessageSystem *msg = gMessageSystem;
01698
01699 msg->newMessageFast(_PREHASH_AvatarPropertiesRequest);
01700 msg->nextBlockFast( _PREHASH_AgentData);
01701 msg->addUUIDFast( _PREHASH_AgentID, gAgent.getID() );
01702 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
01703 msg->addUUIDFast( _PREHASH_AvatarID, mAvatarID);
01704 gAgent.sendReliableMessage();
01705 }
01706
01707 void LLPanelAvatar::sendAvatarNotesUpdate()
01708 {
01709 std::string notes = mPanelNotes->childGetValue("notes edit").asString();
01710
01711 if (!mHaveNotes
01712 && (notes.empty() || notes == getString("Loading")))
01713 {
01714
01715 return;
01716 }
01717 if (notes == mLastNotes)
01718 {
01719
01720 return;
01721 }
01722
01723 LLMessageSystem *msg = gMessageSystem;
01724
01725 msg->newMessage("AvatarNotesUpdate");
01726 msg->nextBlock("AgentData");
01727 msg->addUUID("AgentID", gAgent.getID());
01728 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
01729 msg->nextBlock("Data");
01730 msg->addUUID("TargetID", mAvatarID);
01731 msg->addString("Notes", notes);
01732
01733 gAgent.sendReliableMessage();
01734 }
01735
01736
01737
01738 void LLPanelAvatar::processAvatarPropertiesReply(LLMessageSystem *msg, void**)
01739 {
01740 LLUUID agent_id;
01741 LLUUID avatar_id;
01742 LLUUID image_id;
01743 LLUUID fl_image_id;
01744 LLUUID partner_id;
01745 char about_text[DB_USER_ABOUT_BUF_SIZE];
01746 char fl_about_text[DB_USER_FL_ABOUT_BUF_SIZE];
01747 char born_on[DB_BORN_BUF_SIZE];
01748 S32 charter_member_size = 0;
01749 BOOL allow_publish = FALSE;
01750
01751 BOOL identified = FALSE;
01752 BOOL transacted = FALSE;
01753 BOOL age_verified = FALSE;
01754 BOOL online = FALSE;
01755 char profile_url[DB_USER_PROFILE_URL_BUF_SIZE];
01756
01757 U32 flags = 0x0;
01758
01759
01760
01761 msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id);
01762 msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AvatarID, avatar_id );
01763
01764 for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter)
01765 {
01766 LLPanelAvatar* self = *iter;
01767 if (self->mAvatarID != avatar_id)
01768 {
01769 continue;
01770 }
01771 self->childSetEnabled("Instant Message...",TRUE);
01772 self->childSetEnabled("Pay...",TRUE);
01773 self->childSetEnabled("Mute",TRUE);
01774
01775 self->childSetEnabled("drop target",TRUE);
01776
01777 self->mHaveProperties = TRUE;
01778 self->enableOKIfReady();
01779
01780 msg->getUUIDFast( _PREHASH_PropertiesData, _PREHASH_ImageID, image_id );
01781 msg->getUUIDFast( _PREHASH_PropertiesData, _PREHASH_FLImageID, fl_image_id );
01782 msg->getUUIDFast(_PREHASH_PropertiesData, _PREHASH_PartnerID, partner_id);
01783 msg->getStringFast(_PREHASH_PropertiesData, _PREHASH_AboutText, DB_USER_ABOUT_BUF_SIZE, about_text );
01784 msg->getStringFast(_PREHASH_PropertiesData, _PREHASH_FLAboutText, DB_USER_FL_ABOUT_BUF_SIZE, fl_about_text );
01785 msg->getStringFast(_PREHASH_PropertiesData, _PREHASH_BornOn, DB_BORN_BUF_SIZE, born_on);
01786 msg->getString("PropertiesData","ProfileURL", DB_USER_PROFILE_URL_BUF_SIZE, profile_url);
01787 msg->getU32Fast(_PREHASH_PropertiesData, _PREHASH_Flags, flags);
01788
01789 identified = (flags & AVATAR_IDENTIFIED);
01790 transacted = (flags & AVATAR_TRANSACTED);
01791 age_verified = (flags & AVATAR_AGEVERIFIED);
01792 allow_publish = (flags & AVATAR_ALLOW_PUBLISH);
01793 online = (flags & AVATAR_ONLINE);
01794
01795 U8 caption_index = 0;
01796 LLString caption_text;
01797 charter_member_size = msg->getSize("PropertiesData", "CharterMember");
01798 if(1 == charter_member_size)
01799 {
01800 msg->getBinaryData("PropertiesData", "CharterMember", &caption_index, 1);
01801 }
01802 else if(1 < charter_member_size)
01803 {
01804 char caption[MAX_STRING];
01805 msg->getString("PropertiesData", "CharterMember", MAX_STRING, caption);
01806 caption_text = caption;
01807 }
01808
01809
01810 if(caption_text.empty())
01811 {
01812 LLString::format_map_t args;
01813 caption_text = self->mPanelSecondLife->getString("CaptionTextAcctInfo");
01814
01815 const char* ACCT_TYPE[] = {
01816 "AcctTypeResident",
01817 "AcctTypeTrial",
01818 "AcctTypeCharterMember",
01819 "AcctTypeEmployee"
01820 };
01821 caption_index = llclamp(caption_index, (U8)0, (U8)(sizeof(ACCT_TYPE)/sizeof(ACCT_TYPE[0])-1));
01822 args["[ACCTTYPE]"] = self->mPanelSecondLife->getString(ACCT_TYPE[caption_index]);
01823
01824 LLString payment_text = " ";
01825 const S32 DEFAULT_CAPTION_LINDEN_INDEX = 3;
01826 if(caption_index != DEFAULT_CAPTION_LINDEN_INDEX)
01827 {
01828 if(transacted)
01829 {
01830 payment_text = "PaymentInfoUsed";
01831 }
01832 else if (identified)
01833 {
01834 payment_text = "PaymentInfoOnFile";
01835 }
01836 else
01837 {
01838 payment_text = "NoPaymentInfoOnFile";
01839 }
01840 args["[PAYMENTINFO]"] = self->mPanelSecondLife->getString(payment_text);
01841 LLString age_text = age_verified ? "AgeVerified" : "NotAgeVerified";
01842
01843
01844 args["[AGEVERIFICATION]"] = " ";
01845 }
01846 else
01847 {
01848 args["[PAYMENTINFO]"] = " ";
01849 args["[AGEVERIFICATION]"] = " ";
01850 }
01851 LLString::format(caption_text, args);
01852 }
01853
01854 self->mPanelSecondLife->childSetValue("acct", caption_text);
01855 self->mPanelSecondLife->childSetValue("born", born_on);
01856
01857 EOnlineStatus online_status = (online) ? ONLINE_STATUS_YES : ONLINE_STATUS_NO;
01858
01859 self->setOnlineStatus(online_status);
01860
01861 self->mPanelWeb->setWebURL(std::string(profile_url));
01862
01863 LLTextureCtrl* image_ctrl = self->mPanelSecondLife->getChild<LLTextureCtrl>("img");
01864 if(image_ctrl)
01865 {
01866 image_ctrl->setImageAssetID(image_id);
01867 }
01868 self->childSetValue("about", about_text);
01869
01870 self->mPanelSecondLife->setPartnerID(partner_id);
01871 self->mPanelSecondLife->updatePartnerName();
01872
01873 if (self->mPanelFirstLife)
01874 {
01875
01876 self->mPanelFirstLife->childSetValue("about", fl_about_text);
01877 LLTextureCtrl* image_ctrl = self->mPanelFirstLife->getChild<LLTextureCtrl>("img");
01878 if(image_ctrl)
01879 {
01880 image_ctrl->setImageAssetID(fl_image_id);
01881 }
01882
01883 self->mPanelSecondLife->childSetValue("allow_publish", allow_publish);
01884
01885 }
01886 }
01887 }
01888
01889
01890 void LLPanelAvatar::processAvatarInterestsReply(LLMessageSystem *msg, void**)
01891 {
01892 LLUUID agent_id;
01893 LLUUID avatar_id;
01894
01895 U32 want_to_mask;
01896 char want_to_text[DB_USER_WANT_TO_BUF_SIZE];
01897 U32 skills_mask;
01898 char skills_text[DB_USER_SKILLS_BUF_SIZE];
01899 char languages_text[DB_USER_SKILLS_BUF_SIZE];
01900
01901
01902
01903 msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id);
01904 msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AvatarID, avatar_id );
01905
01906 for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter)
01907 {
01908 LLPanelAvatar* self = *iter;
01909 if (self->mAvatarID != avatar_id)
01910 {
01911 continue;
01912 }
01913
01914 msg->getU32Fast( _PREHASH_PropertiesData, _PREHASH_WantToMask, want_to_mask );
01915 msg->getStringFast(_PREHASH_PropertiesData, _PREHASH_WantToText, DB_USER_WANT_TO_BUF_SIZE, want_to_text );
01916 msg->getU32Fast( _PREHASH_PropertiesData, _PREHASH_SkillsMask, skills_mask );
01917 msg->getStringFast(_PREHASH_PropertiesData, _PREHASH_SkillsText, DB_USER_SKILLS_BUF_SIZE, skills_text );
01918 msg->getString(_PREHASH_PropertiesData, "LanguagesText", DB_USER_SKILLS_BUF_SIZE, languages_text );
01919
01920 self->mPanelAdvanced->setWantSkills(want_to_mask, want_to_text, skills_mask, skills_text, languages_text);
01921 }
01922 }
01923
01924
01925
01926
01927 void LLPanelAvatar::processAvatarGroupsReply(LLMessageSystem *msg, void**)
01928 {
01929 LLUUID agent_id;
01930 LLUUID avatar_id;
01931 U64 group_powers;
01932 char group_title[DB_GROUP_TITLE_BUF_SIZE];
01933 LLUUID group_id;
01934 char group_name[DB_GROUP_NAME_BUF_SIZE];
01935 LLUUID group_insignia_id;
01936
01937 llinfos << "groups packet size " << msg->getReceiveSize() << llendl;
01938
01939 msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id);
01940 msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AvatarID, avatar_id );
01941
01942 for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter)
01943 {
01944 LLPanelAvatar* self = *iter;
01945 if (self->mAvatarID != avatar_id)
01946 {
01947 continue;
01948 }
01949
01950 LLScrollListCtrl* group_list = self->mPanelSecondLife->getChild<LLScrollListCtrl>("groups");
01951
01952
01953
01954
01955
01956 S32 group_count = msg->getNumberOfBlocksFast(_PREHASH_GroupData);
01957 if (0 == group_count)
01958 {
01959 if(group_list) group_list->addCommentText("None");
01960 }
01961 else
01962 {
01963 for(S32 i = 0; i < group_count; ++i)
01964 {
01965 msg->getU64( _PREHASH_GroupData, "GroupPowers", group_powers, i );
01966 msg->getStringFast(_PREHASH_GroupData, _PREHASH_GroupTitle, DB_GROUP_TITLE_BUF_SIZE, group_title, i );
01967 msg->getUUIDFast( _PREHASH_GroupData, _PREHASH_GroupID, group_id, i);
01968 msg->getStringFast(_PREHASH_GroupData, _PREHASH_GroupName, DB_GROUP_NAME_BUF_SIZE, group_name, i );
01969 msg->getUUIDFast( _PREHASH_GroupData, _PREHASH_GroupInsigniaID, group_insignia_id, i );
01970
01971 LLString group_string;
01972 if (group_id.notNull())
01973 {
01974 group_string.assign(group_name);
01975 }
01976 else
01977 {
01978 group_string.assign("");
01979 }
01980
01981
01982
01983 if (group_list)
01984 {
01985 S32 index = group_list->getItemIndex(group_id);
01986 if ( index >= 0 )
01987 {
01988 group_list->deleteSingleItem(index);
01989 }
01990 }
01991
01992 LLSD row;
01993 row["id"] = group_id;
01994 row["columns"][0]["value"] = group_string;
01995 row["columns"][0]["font"] = "SANSSERIF_SMALL";
01996 if (group_list)
01997 {
01998 group_list->addElement(row);
01999 }
02000 }
02001 }
02002 if(group_list) group_list->sortByColumn(0, TRUE);
02003 }
02004 }
02005
02006
02007
02008 void LLPanelAvatar::enableOKIfReady()
02009 {
02010 if(mHaveProperties && childIsVisible("OK"))
02011 {
02012 childSetEnabled("OK", TRUE);
02013 }
02014 else
02015 {
02016 childSetEnabled("OK", FALSE);
02017 }
02018 }
02019
02020 void LLPanelAvatar::sendAvatarPropertiesUpdate()
02021 {
02022 llinfos << "Sending avatarinfo update" << llendl;
02023 BOOL allow_publish = FALSE;
02024 BOOL mature = FALSE;
02025 if (LLPanelAvatar::sAllowFirstLife)
02026 {
02027 allow_publish = childGetValue("allow_publish");
02028
02029 mature = FALSE;
02030 }
02031 U32 want_to_mask = 0x0;
02032 U32 skills_mask = 0x0;
02033 std::string want_to_text;
02034 std::string skills_text;
02035 std::string languages_text;
02036 mPanelAdvanced->getWantSkills(&want_to_mask, want_to_text, &skills_mask, skills_text, languages_text);
02037
02038 LLUUID first_life_image_id;
02039 LLString first_life_about_text;
02040 if (mPanelFirstLife)
02041 {
02042 first_life_about_text = mPanelFirstLife->childGetValue("about").asString();
02043 LLTextureCtrl* image_ctrl = mPanelFirstLife->getChild<LLTextureCtrl>("img");
02044 if(image_ctrl)
02045 {
02046 first_life_image_id = image_ctrl->getImageAssetID();
02047 }
02048 }
02049
02050 LLString about_text = mPanelSecondLife->childGetValue("about").asString();
02051
02052 LLMessageSystem *msg = gMessageSystem;
02053
02054 msg->newMessageFast(_PREHASH_AvatarPropertiesUpdate);
02055 msg->nextBlockFast(_PREHASH_AgentData);
02056 msg->addUUIDFast( _PREHASH_AgentID, gAgent.getID() );
02057 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() );
02058 msg->nextBlockFast(_PREHASH_PropertiesData);
02059
02060 LLTextureCtrl* image_ctrl = mPanelSecondLife->getChild<LLTextureCtrl>("img");
02061 if(image_ctrl)
02062 {
02063 msg->addUUIDFast( _PREHASH_ImageID, image_ctrl->getImageAssetID());
02064 }
02065 else
02066 {
02067 msg->addUUIDFast( _PREHASH_ImageID, LLUUID::null);
02068 }
02069
02070 msg->addUUIDFast( _PREHASH_FLImageID, first_life_image_id);
02071 msg->addStringFast( _PREHASH_AboutText, about_text);
02072 msg->addStringFast( _PREHASH_FLAboutText, first_life_about_text);
02073
02074 msg->addBOOL("AllowPublish", allow_publish);
02075 msg->addBOOL("MaturePublish", mature);
02076 msg->addString("ProfileURL", mPanelWeb->childGetText("url_edit"));
02077 gAgent.sendReliableMessage();
02078
02079 msg->newMessage("AvatarInterestsUpdate");
02080 msg->nextBlockFast(_PREHASH_AgentData);
02081 msg->addUUIDFast( _PREHASH_AgentID, gAgent.getID() );
02082 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() );
02083 msg->nextBlockFast(_PREHASH_PropertiesData);
02084 msg->addU32Fast( _PREHASH_WantToMask, want_to_mask);
02085 msg->addStringFast( _PREHASH_WantToText, want_to_text);
02086 msg->addU32Fast( _PREHASH_SkillsMask, skills_mask);
02087 msg->addStringFast( _PREHASH_SkillsText, skills_text);
02088 msg->addString( "LanguagesText", languages_text);
02089 gAgent.sendReliableMessage();
02090 }
02091
02092 void LLPanelAvatar::selectTab(S32 tabnum)
02093 {
02094 if(mTab)
02095 {
02096 mTab->selectTab(tabnum);
02097 }
02098 }
02099
02100 void LLPanelAvatar::selectTabByName(std::string tab_name)
02101 {
02102 if (mTab)
02103 {
02104 if (tab_name.empty())
02105 {
02106 mTab->selectFirstTab();
02107 }
02108 else
02109 {
02110 mTab->selectTabByName(tab_name);
02111 }
02112 }
02113 }
02114
02115
02116 void LLPanelAvatar::processAvatarNotesReply(LLMessageSystem *msg, void**)
02117 {
02118
02119 LLUUID agent_id;
02120 msg->getUUID("AgentData", "AgentID", agent_id);
02121
02122 LLUUID target_id;
02123 msg->getUUID("Data", "TargetID", target_id);
02124
02125
02126 for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter)
02127 {
02128 LLPanelAvatar* self = *iter;
02129 if (self->mAvatarID != target_id)
02130 {
02131 continue;
02132 }
02133
02134 char text[DB_USER_NOTE_SIZE];
02135 msg->getString("Data", "Notes", DB_USER_NOTE_SIZE, text);
02136 self->childSetValue("notes edit", text);
02137 self->childSetEnabled("notes edit", true);
02138 self->mHaveNotes = true;
02139 self->mLastNotes = text;
02140 }
02141 }
02142
02143
02144 void LLPanelAvatar::processAvatarClassifiedReply(LLMessageSystem *msg, void** userdata)
02145 {
02146 LLUUID agent_id;
02147 LLUUID target_id;
02148
02149 msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id);
02150 msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_TargetID, target_id);
02151
02152
02153 for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter)
02154 {
02155 LLPanelAvatar* self = *iter;
02156 if (self->mAvatarID != target_id)
02157 {
02158 continue;
02159 }
02160
02161 self->mPanelClassified->processAvatarClassifiedReply(msg, userdata);
02162 }
02163 }
02164
02165 void LLPanelAvatar::processAvatarPicksReply(LLMessageSystem *msg, void** userdata)
02166 {
02167 LLUUID agent_id;
02168 LLUUID target_id;
02169
02170 msg->getUUID("AgentData", "AgentID", agent_id);
02171 msg->getUUID("AgentData", "TargetID", target_id);
02172
02173
02174 for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter)
02175 {
02176 LLPanelAvatar* self = *iter;
02177 if (self->mAvatarID != target_id)
02178 {
02179 continue;
02180 }
02181
02182 self->mPanelPicks->processAvatarPicksReply(msg, userdata);
02183 }
02184 }
02185
02186
02187 void LLPanelAvatar::onClickKick(void* userdata)
02188 {
02189 LLPanelAvatar* self = (LLPanelAvatar*) userdata;
02190
02191 S32 left, top;
02192 gFloaterView->getNewFloaterPosition(&left, &top);
02193 LLRect rect(left, top, left+400, top-300);
02194
02195 gViewerWindow->alertXmlEditText("KickUser", LLString::format_map_t(),
02196 NULL, NULL,
02197 LLPanelAvatar::finishKick, self);
02198 }
02199
02200
02201 void LLPanelAvatar::finishKick(S32 option, const LLString& text, void* userdata)
02202 {
02203 LLPanelAvatar* self = (LLPanelAvatar*) userdata;
02204
02205 if (option == 0)
02206 {
02207 LLMessageSystem* msg = gMessageSystem;
02208
02209 msg->newMessageFast(_PREHASH_GodKickUser);
02210 msg->nextBlockFast(_PREHASH_UserInfo);
02211 msg->addUUIDFast(_PREHASH_GodID, gAgent.getID() );
02212 msg->addUUIDFast(_PREHASH_GodSessionID, gAgent.getSessionID());
02213 msg->addUUIDFast(_PREHASH_AgentID, self->mAvatarID );
02214 msg->addU32("KickFlags", KICK_FLAGS_DEFAULT );
02215 msg->addStringFast(_PREHASH_Reason, text );
02216 gAgent.sendReliableMessage();
02217 }
02218 }
02219
02220
02221 void LLPanelAvatar::onClickFreeze(void* userdata)
02222 {
02223 gViewerWindow->alertXmlEditText("FreezeUser", LLString::format_map_t(),
02224 NULL, NULL,
02225 LLPanelAvatar::finishFreeze, userdata);
02226 }
02227
02228
02229 void LLPanelAvatar::finishFreeze(S32 option, const LLString& text, void* userdata)
02230 {
02231 LLPanelAvatar* self = (LLPanelAvatar*) userdata;
02232
02233 if (option == 0)
02234 {
02235 LLMessageSystem* msg = gMessageSystem;
02236
02237 msg->newMessageFast(_PREHASH_GodKickUser);
02238 msg->nextBlockFast(_PREHASH_UserInfo);
02239 msg->addUUIDFast(_PREHASH_GodID, gAgent.getID() );
02240 msg->addUUIDFast(_PREHASH_GodSessionID, gAgent.getSessionID());
02241 msg->addUUIDFast(_PREHASH_AgentID, self->mAvatarID );
02242 msg->addU32("KickFlags", KICK_FLAGS_FREEZE );
02243 msg->addStringFast(_PREHASH_Reason, text );
02244 gAgent.sendReliableMessage();
02245 }
02246 }
02247
02248
02249 void LLPanelAvatar::onClickUnfreeze(void* userdata)
02250 {
02251 gViewerWindow->alertXmlEditText("UnFreezeUser", LLString::format_map_t(),
02252 NULL, NULL,
02253 LLPanelAvatar::finishUnfreeze, userdata);
02254 }
02255
02256
02257 void LLPanelAvatar::finishUnfreeze(S32 option, const LLString& text, void* userdata)
02258 {
02259 LLPanelAvatar* self = (LLPanelAvatar*) userdata;
02260
02261 if (option == 0)
02262 {
02263 LLMessageSystem* msg = gMessageSystem;
02264
02265 msg->newMessageFast(_PREHASH_GodKickUser);
02266 msg->nextBlockFast(_PREHASH_UserInfo);
02267 msg->addUUIDFast(_PREHASH_GodID, gAgent.getID() );
02268 msg->addUUIDFast(_PREHASH_GodSessionID, gAgent.getSessionID());
02269 msg->addUUIDFast(_PREHASH_AgentID, self->mAvatarID );
02270 msg->addU32("KickFlags", KICK_FLAGS_UNFREEZE );
02271 msg->addStringFast(_PREHASH_Reason, text );
02272 gAgent.sendReliableMessage();
02273 }
02274 }
02275
02276
02277 void LLPanelAvatar::onClickCSR(void* userdata)
02278 {
02279 LLPanelAvatar* self = (LLPanelAvatar*)userdata;
02280 if (!self) return;
02281
02282 LLNameEditor* name_edit = self->getChild<LLNameEditor>("name");
02283 if (!name_edit) return;
02284
02285 LLString name = name_edit->getText();
02286 if (name.empty()) return;
02287
02288 LLString url = "http://csr.lindenlab.com/agent/";
02289
02290
02291 S32 len = name.length();
02292 for (S32 i = 0; i < len; i++)
02293 {
02294 if (name[i] == ' ')
02295 {
02296 url += "%20";
02297 }
02298 else
02299 {
02300 url += name[i];
02301 }
02302 }
02303
02304 LLWeb::loadURL(url);
02305 }
02306
02307
02308 void* LLPanelAvatar::createPanelAvatarSecondLife(void* data)
02309 {
02310 LLPanelAvatar* self = (LLPanelAvatar*)data;
02311 self->mPanelSecondLife = new LLPanelAvatarSecondLife("2nd Life",LLRect(),self);
02312 return self->mPanelSecondLife;
02313 }
02314
02315 void* LLPanelAvatar::createPanelAvatarWeb(void* data)
02316 {
02317 LLPanelAvatar* self = (LLPanelAvatar*)data;
02318 self->mPanelWeb = new LLPanelAvatarWeb("Web",LLRect(),self);
02319 return self->mPanelWeb;
02320 }
02321
02322 void* LLPanelAvatar::createPanelAvatarInterests(void* data)
02323 {
02324 LLPanelAvatar* self = (LLPanelAvatar*)data;
02325 self->mPanelAdvanced = new LLPanelAvatarAdvanced("Interests",LLRect(),self);
02326 return self->mPanelAdvanced;
02327 }
02328
02329
02330 void* LLPanelAvatar::createPanelAvatarPicks(void* data)
02331 {
02332 LLPanelAvatar* self = (LLPanelAvatar*)data;
02333 self->mPanelPicks = new LLPanelAvatarPicks("Picks",LLRect(),self);
02334 return self->mPanelPicks;
02335 }
02336
02337 void* LLPanelAvatar::createPanelAvatarClassified(void* data)
02338 {
02339 LLPanelAvatar* self = (LLPanelAvatar*)data;
02340 self->mPanelClassified = new LLPanelAvatarClassified("Classified",LLRect(),self);
02341 return self->mPanelClassified;
02342 }
02343
02344 void* LLPanelAvatar::createPanelAvatarFirstLife(void* data)
02345 {
02346 LLPanelAvatar* self = (LLPanelAvatar*)data;
02347 self->mPanelFirstLife = new LLPanelAvatarFirstLife("1st Life", LLRect(), self);
02348 return self->mPanelFirstLife;
02349 }
02350
02351 void* LLPanelAvatar::createPanelAvatarNotes(void* data)
02352 {
02353 LLPanelAvatar* self = (LLPanelAvatar*)data;
02354 self->mPanelNotes = new LLPanelAvatarNotes("My Notes",LLRect(),self);
02355 return self->mPanelNotes;
02356 }