diff options
author | Steven Bennetts <steve@lindenlab.com> | 2009-06-21 08:04:56 +0000 |
---|---|---|
committer | Steven Bennetts <steve@lindenlab.com> | 2009-06-21 08:04:56 +0000 |
commit | 9ec432034dc3c45d7ce763eb02dae4cc7f6b8da8 (patch) | |
tree | 4a505c1e0919af52800b3ffb3eaf135e7d6f9ce6 /indra/newview/llpanelavatar.cpp | |
parent | 351ebe9fcb76f3b99c2957004bb8493a904869ee (diff) |
merge -r 122421-124917 viewer-2.0.0-2 -> viewer-2.0.0-3
ignore-dead-branch
Diffstat (limited to 'indra/newview/llpanelavatar.cpp')
-rw-r--r-- | indra/newview/llpanelavatar.cpp | 2346 |
1 files changed, 354 insertions, 1992 deletions
diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp index 9d5a4ad01c..d7929cc5c2 100644 --- a/indra/newview/llpanelavatar.cpp +++ b/indra/newview/llpanelavatar.cpp @@ -34,58 +34,17 @@ #include "llpanelavatar.h" -#include "llclassifiedflags.h" -#include "llfontgl.h" -#include "llcachename.h" - -#include "llavatarconstants.h" -#include "lluiconstants.h" -#include "lltextbox.h" -#include "llviewertexteditor.h" -#include "lltexturectrl.h" #include "llagent.h" -#include "llviewerwindow.h" -#include "llbutton.h" +#include "llavatarconstants.h" #include "llcallingcard.h" -#include "llcheckboxctrl.h" -#include "llfloater.h" - -#include "llfloaterfriends.h" -#include "llfloatergroupinfo.h" -#include "llfloaterworldmap.h" -#include "llfloatermute.h" -#include "llfloateravatarinfo.h" -#include "lliconctrl.h" -#include "llinventoryview.h" -#include "lllineeditor.h" -#include "llnameeditor.h" -#include "llmutelist.h" -#include "llpanelclassified.h" -#include "llpanelpick.h" -#include "llscrolllistctrl.h" -#include "llstatusbar.h" -#include "lltabcontainer.h" -#include "lltabcontainervertical.h" +#include "llcombobox.h" +#include "llfriendactions.h" #include "llimview.h" +#include "lltexteditor.h" +#include "lltexturectrl.h" #include "lltooldraganddrop.h" -#include "lluiconstants.h" -#include "llvoavatar.h" -#include "llviewercontrol.h" #include "llviewermenu.h" // *FIX: for is_agent_friend() -#include "llviewergenericmessage.h" // send_generic_message -#include "llviewerobjectlist.h" -#include "llviewerregion.h" -#include "llweb.h" -#include "llinventorymodel.h" -#include "roles_constants.h" -#include "lluictrlfactory.h" - -// Statics -std::list<LLPanelAvatar*> LLPanelAvatar::sAllPanels; -BOOL LLPanelAvatar::sAllowFirstLife = FALSE; - -extern void handle_lure(const LLUUID& invitee); -extern void handle_pay_by_id(const LLUUID& payee); +#include "llscrollcontainer.h" //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Class LLDropTarget @@ -98,7 +57,17 @@ extern void handle_pay_by_id(const LLUUID& payee); class LLDropTarget : public LLView { public: - LLDropTarget(const std::string& name, const LLRect& rect, const LLUUID& agent_id); + struct Params : public LLInitParam::Block<Params, LLView::Params> + { + Optional<LLUUID> agent_id; + Params() + { + mouse_opaque(false); + follows.flags(FOLLOWS_ALL); + } + }; + + LLDropTarget(const Params&); ~LLDropTarget(); void doDrop(EDragAndDropType cargo_type, void* cargo_data); @@ -115,17 +84,13 @@ protected: LLUUID mAgentID; }; - -LLDropTarget::LLDropTarget(const std::string& name, const LLRect& rect, - const LLUUID& agent_id) : - LLView(name, rect, NOT_MOUSE_OPAQUE, FOLLOWS_ALL), - mAgentID(agent_id) -{ -} +LLDropTarget::LLDropTarget(const LLDropTarget::Params& p) +: LLView(p), + mAgentID(p.agent_id) +{} LLDropTarget::~LLDropTarget() -{ -} +{} void LLDropTarget::doDrop(EDragAndDropType cargo_type, void* cargo_data) { @@ -149,2156 +114,553 @@ BOOL LLDropTarget::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, return FALSE; } +static LLDefaultWidgetRegistry::Register<LLDropTarget> r("drop_target"); +////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- -// LLPanelAvatarTab() -//----------------------------------------------------------------------------- -LLPanelAvatarTab::LLPanelAvatarTab(const std::string& name, const LLRect &rect, - LLPanelAvatar* panel_avatar) -: LLPanel(name, rect), - mPanelAvatar(panel_avatar), - mDataRequested(false) -{ } - -// virtual -void LLPanelAvatarTab::draw() -{ - refresh(); - - LLPanel::draw(); -} - -void LLPanelAvatarTab::sendAvatarProfileRequestIfNeeded(const std::string& method) -{ - if (!mDataRequested) - { - std::vector<std::string> strings; - strings.push_back( mPanelAvatar->getAvatarID().asString() ); - send_generic_message(method, strings); - mDataRequested = true; - } -} - -//----------------------------------------------------------------------------- -// LLPanelAvatarSecondLife() +// LLPanelProfileTab() //----------------------------------------------------------------------------- -LLPanelAvatarSecondLife::LLPanelAvatarSecondLife(const std::string& name, - const LLRect &rect, - LLPanelAvatar* panel_avatar ) -: LLPanelAvatarTab(name, rect, panel_avatar), - mPartnerID() +////////////////////////////////////////////////////////////////////////// +LLPanelProfileTab::LLPanelProfileTab(const LLUUID& avatar_id) + : LLPanel() + , mAvatarId(LLUUID::null) + , mProfileType(PT_UNKNOWN) { + setAvatarId(avatar_id); } -void LLPanelAvatarSecondLife::refresh() +LLPanelProfileTab::LLPanelProfileTab(const Params& params ) + : LLPanel() + , mAvatarId(LLUUID::null) + , mProfileType(PT_UNKNOWN) { - updatePartnerName(); -} -void LLPanelAvatarSecondLife::updatePartnerName() -{ - if (mPartnerID.notNull()) - { - std::string first, last; - BOOL found = gCacheName->getName(mPartnerID, first, last); - if (found) - { - childSetTextArg("partner_edit", "[FIRST]", first); - childSetTextArg("partner_edit", "[LAST]", last); - } - childSetEnabled("partner_info", TRUE); - } } -//----------------------------------------------------------------------------- -// clearControls() -// Empty the data out of the controls, since we have to wait for new -// data off the network. -//----------------------------------------------------------------------------- -void LLPanelAvatarSecondLife::clearControls() +LLPanelProfileTab::~LLPanelProfileTab() { - LLTextureCtrl* image_ctrl = getChild<LLTextureCtrl>("img"); - if(image_ctrl) + // *TODO Vadim: use notNull() instead. (there are several similar cases below) + if(mAvatarId.notNull()) { - image_ctrl->setImageAssetID(LLUUID::null); + LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(),this); } - childSetValue("about", ""); - childSetValue("born", ""); - childSetValue("acct", ""); - - childSetTextArg("partner_edit", "[FIRST]", LLStringUtil::null); - childSetTextArg("partner_edit", "[LAST]", LLStringUtil::null); - - mPartnerID = LLUUID::null; - - LLScrollListCtrl* group_list = getChild<LLScrollListCtrl>("groups"); - if(group_list) - { - group_list->deleteAllItems(); - } - LLScrollListCtrl* ratings_list = getChild<LLScrollListCtrl>("ratings"); - if(ratings_list) - { - ratings_list->deleteAllItems(); - } - } - -//----------------------------------------------------------------------------- -// enableControls() -//----------------------------------------------------------------------------- -void LLPanelAvatarSecondLife::enableControls(BOOL self) +void LLPanelProfileTab::setAvatarId(const LLUUID& avatar_id) { - childSetEnabled("img", self); - childSetEnabled("about", self); - childSetVisible("allow_publish", self); - childSetEnabled("allow_publish", self); - childSetVisible("?", self); - childSetEnabled("?", self); -} - - -// static -void LLPanelAvatarSecondLife::onClickImage(void *) -{ } - -// static -void LLPanelAvatarSecondLife::onDoubleClickGroup(void* data) -{ - LLPanelAvatarSecondLife* self = (LLPanelAvatarSecondLife*)data; - - - LLScrollListCtrl* group_list = self->getChild<LLScrollListCtrl>("groups"); - if(group_list) + if(avatar_id.notNull()) { - LLScrollListItem* item = group_list->getFirstSelected(); - - if(item && item->getUUID().notNull()) + if(mAvatarId.notNull()) { - llinfos << "Show group info " << item->getUUID() << llendl; - - LLFloaterGroupInfo::showFromUUID(item->getUUID()); + LLAvatarPropertiesProcessor::getInstance()->removeObserver(mAvatarId,this); } + mAvatarId = avatar_id; + LLAvatarPropertiesProcessor::getInstance()->addObserver(getAvatarId(),this); + setProfileType(); } } -// static -void LLPanelAvatarSecondLife::onClickPublishHelp(void *) +void LLPanelProfileTab::setProfileType() { - LLNotifications::instance().add("ClickPublishHelpAvatar"); + mProfileType = (gAgentID == mAvatarId) ? PT_OWN : PT_OTHER; } -// static -void LLPanelAvatarSecondLife::onClickPartnerHelp(void *) +void LLPanelProfileTab::onActivate(const LLUUID& id) { - LLNotifications::instance().add("ClickPartnerHelpAvatar", LLSD(), LLSD(), onClickPartnerHelpLoadURL); + setAvatarId(id); + updateData(); } -// static -bool LLPanelAvatarSecondLife::onClickPartnerHelpLoadURL(const LLSD& notification, const LLSD& response) +void LLPanelProfileTab::onAddFriend() { - S32 option = LLNotification::getSelectedOption(notification, response); - if (option == 0) + if (getAvatarId().notNull()) { - LLWeb::loadURL("http://secondlife.com/partner"); + std::string name; + gCacheName->getFullName(getAvatarId(),name); + LLFriendActions::requestFriendshipDialog(getAvatarId(), name); } - return false; } -// static -void LLPanelAvatarSecondLife::onClickPartnerInfo(void *data) +void LLPanelProfileTab::onIM() { - LLPanelAvatarSecondLife* self = (LLPanelAvatarSecondLife*) data; - if (self->mPartnerID.notNull()) + if (getAvatarId().notNull()) { - LLFloaterAvatarInfo::showFromProfile(self->mPartnerID, - self->getScreenRect()); + std::string name; + gCacheName->getFullName(getAvatarId(), name); + gIMMgr->addSession(name, IM_NOTHING_SPECIAL, getAvatarId()); } } -//----------------------------------------------------------------------------- -// LLPanelAvatarFirstLife() -//----------------------------------------------------------------------------- -LLPanelAvatarFirstLife::LLPanelAvatarFirstLife(const std::string& name, - const LLRect &rect, - LLPanelAvatar* panel_avatar ) -: LLPanelAvatarTab(name, rect, panel_avatar) -{ -} - -void LLPanelAvatarFirstLife::enableControls(BOOL self) -{ - childSetEnabled("img", self); - childSetEnabled("about", self); -} - -//----------------------------------------------------------------------------- -// postBuild -//----------------------------------------------------------------------------- - -BOOL LLPanelAvatarSecondLife::postBuild(void) -{ - childSetEnabled("born", FALSE); - childSetEnabled("partner_edit", FALSE); - childSetAction("partner_help",onClickPartnerHelp,this); - childSetAction("partner_info", onClickPartnerInfo, this); - childSetEnabled("partner_info", mPartnerID.notNull()); - - childSetAction("?",onClickPublishHelp,this); - BOOL own_avatar = (getPanelAvatar()->getAvatarID() == gAgent.getID() ); - enableControls(own_avatar); - - childSetVisible("About:",LLPanelAvatar::sAllowFirstLife); - childSetVisible("(500 chars)",LLPanelAvatar::sAllowFirstLife); - childSetVisible("about",LLPanelAvatar::sAllowFirstLife); - - childSetVisible("allow_publish",LLPanelAvatar::sAllowFirstLife); - childSetVisible("?",LLPanelAvatar::sAllowFirstLife); - - childSetVisible("online_yes",FALSE); - - // These are cruft but may still exist in some xml files - // TODO: remove the following 2 lines once translators grab these changes - childSetVisible("online_unknown",FALSE); - childSetVisible("online_no",FALSE); - - childSetAction("Find on Map", LLPanelAvatar::onClickTrack, getPanelAvatar()); - childSetAction("Instant Message...", LLPanelAvatar::onClickIM, getPanelAvatar()); - - childSetAction("Add Friend...", LLPanelAvatar::onClickAddFriend, getPanelAvatar()); - childSetAction("Pay...", LLPanelAvatar::onClickPay, getPanelAvatar()); - childSetAction("Mute", LLPanelAvatar::onClickMute, getPanelAvatar() ); - - childSetAction("Offer Teleport...", LLPanelAvatar::onClickOfferTeleport, - getPanelAvatar() ); - - childSetDoubleClickCallback("groups", onDoubleClickGroup, this ); - - getChild<LLTextureCtrl>("img")->setFallbackImageName("default_profile_picture.j2c"); - - return TRUE; -} - -BOOL LLPanelAvatarFirstLife::postBuild(void) +void LLPanelProfileTab::onTeleport() { - BOOL own_avatar = (getPanelAvatar()->getAvatarID() == gAgent.getID() ); - enableControls(own_avatar); - - getChild<LLTextureCtrl>("img")->setFallbackImageName("default_profile_picture.j2c"); - - return TRUE; -} - -BOOL LLPanelAvatarNotes::postBuild(void) -{ - childSetCommitCallback("notes edit",onCommitNotes,this); - - LLTextEditor* te = getChild<LLTextEditor>("notes edit"); - if(te) te->setCommitOnFocusLost(TRUE); - return TRUE; -} - -BOOL LLPanelAvatarWeb::postBuild(void) -{ - childSetKeystrokeCallback("url_edit", onURLKeystroke, this); - childSetCommitCallback("load", onCommitLoad, this); - - childSetAction("web_profile_help",onClickWebProfileHelp,this); - - childSetCommitCallback("url_edit",onCommitURL,this); - - childSetControlName("auto_load","AutoLoadWebProfiles"); - - mWebBrowser = getChild<LLWebBrowserCtrl>("profile_html"); - - // links open in internally - mWebBrowser->setOpenInExternalBrowser( false ); - - // observe browser events - mWebBrowser->addObserver( this ); - - return TRUE; -} - -BOOL LLPanelAvatarClassified::postBuild(void) -{ - childSetAction("New...",onClickNew,NULL); - childSetAction("Delete...",onClickDelete,NULL); - return TRUE; -} - -BOOL LLPanelAvatarPicks::postBuild(void) -{ - childSetAction("New...",onClickNew,NULL); - childSetAction("Delete...",onClickDelete,NULL); - return TRUE; -} - -BOOL LLPanelAvatarAdvanced::postBuild() -{ - for(size_t ii = 0; ii < LL_ARRAY_SIZE(mWantToCheck); ++ii) - mWantToCheck[ii] = NULL; - for(size_t ii = 0; ii < LL_ARRAY_SIZE(mSkillsCheck); ++ii) - mSkillsCheck[ii] = NULL; - mWantToCount = (8>LL_ARRAY_SIZE(mWantToCheck))?LL_ARRAY_SIZE(mWantToCheck):8; - for(S32 tt=0; tt < mWantToCount; ++tt) - { - std::string ctlname = llformat("chk%d", tt); - mWantToCheck[tt] = getChild<LLCheckBoxCtrl>(ctlname); - } - mSkillsCount = (6>LL_ARRAY_SIZE(mSkillsCheck))?LL_ARRAY_SIZE(mSkillsCheck):6; - - for(S32 tt=0; tt < mSkillsCount; ++tt) + if(getAvatarId().notNull()) { - //Find the Skills checkboxes and save off thier controls - std::string ctlname = llformat("schk%d",tt); - mSkillsCheck[tt] = getChild<LLCheckBoxCtrl>(ctlname); + LLFriendActions::offerTeleport(getAvatarId()); } - - mWantToEdit = getChild<LLLineEditor>("want_to_edit"); - mSkillsEdit = getChild<LLLineEditor>("skills_edit"); - childSetVisible("skills_edit",LLPanelAvatar::sAllowFirstLife); - childSetVisible("want_to_edit",LLPanelAvatar::sAllowFirstLife); - - return TRUE; } +////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- -// LLPanelAvatarWeb +// LLPanelAvatarProfile() //----------------------------------------------------------------------------- -LLPanelAvatarWeb::LLPanelAvatarWeb(const std::string& name, const LLRect& rect, - LLPanelAvatar* panel_avatar) -: LLPanelAvatarTab(name, rect, panel_avatar), - mWebBrowser(NULL) +////////////////////////////////////////////////////////////////////////// +LLPanelAvatarProfile::LLPanelAvatarProfile(const LLUUID& avatar_id /* = LLUUID::null */) + : LLPanelProfileTab(avatar_id), mUpdated(false), mEditMode(false), mStatusCombobox(NULL), mStatusMessage(NULL) { + updateData(); } -LLPanelAvatarWeb::~LLPanelAvatarWeb() +LLPanelAvatarProfile::LLPanelAvatarProfile(const Params& params ) + : LLPanelProfileTab(params), mUpdated(false), mEditMode(false), mStatusCombobox(NULL), mStatusMessage(NULL) { - // stop observing browser events - if ( mWebBrowser ) - { - mWebBrowser->remObserver( this ); - }; } -void LLPanelAvatarWeb::refresh() +LLPanelAvatarProfile::~LLPanelAvatarProfile() { - if (mNavigateTo != "") + if(getAvatarId().notNull()) { - llinfos << "Loading " << mNavigateTo << llendl; - mWebBrowser->navigateTo( mNavigateTo ); - mNavigateTo = ""; + LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(),this); } } - -void LLPanelAvatarWeb::enableControls(BOOL self) -{ - childSetEnabled("url_edit",self); -} - -void LLPanelAvatarWeb::setWebURL(std::string url) +void* LLPanelAvatarProfile::create(void* data /* = NULL */) { - bool changed_url = (mHome != url); - - mHome = url; - bool have_url = !mHome.empty(); - - childSetText("url_edit", mHome); - childSetEnabled("load", mHome.length() > 0); - - if (have_url - && gSavedSettings.getBOOL("AutoLoadWebProfiles")) + LLSD* id = NULL; + if(data) { - if (changed_url) - { - load(mHome); - } - } - else - { - childSetVisible("profile_html",false); - childSetVisible("status_text", false); + id = static_cast<LLSD*>(data); + return new LLPanelAvatarProfile(LLUUID(id->asUUID())); } + return new LLPanelAvatarProfile(); } -// static -void LLPanelAvatarWeb::onCommitURL(LLUICtrl* ctrl, void* data) +void LLPanelAvatarProfile::updateData() { - LLPanelAvatarWeb* self = (LLPanelAvatarWeb*)data; - - if (!self) return; - - self->load( self->childGetText("url_edit") ); -} - -// static -void LLPanelAvatarWeb::onClickWebProfileHelp(void *) -{ - LLNotifications::instance().add("ClickWebProfileHelpAvatar"); -} - -void LLPanelAvatarWeb::load(std::string url) -{ - bool have_url = (!url.empty()); - - - childSetVisible("profile_html", have_url); - childSetVisible("status_text", have_url); - childSetText("status_text", LLStringUtil::null); - - if (have_url) + if (getAvatarId().notNull()) { - mNavigateTo = url; + LLAvatarPropertiesProcessor::getInstance()->sendDataRequest(getAvatarId(),APT_PROPERTIES); + LLAvatarPropertiesProcessor::getInstance()->sendDataRequest(getAvatarId(),APT_GROUPS); } } -//static -void LLPanelAvatarWeb::onURLKeystroke(LLLineEditor* editor, void* data) -{ - LLPanelAvatarWeb* self = (LLPanelAvatarWeb*)data; - if (!self) return; - LLSD::String url = editor->getText(); - self->childSetEnabled("load", url.length() > 0); - return; -} - -// static -void LLPanelAvatarWeb::onCommitLoad(LLUICtrl* ctrl, void* data) +void LLPanelAvatarProfile::processProperties(void* data, EAvatarProcessorType type) { - LLPanelAvatarWeb* self = (LLPanelAvatarWeb*)data; - - if (!self) return; - - LLSD::String valstr = ctrl->getValue().asString(); - LLSD::String urlstr = self->childGetText("url_edit"); - if (valstr == "") // load url string into browser panel - { - self->load(urlstr); - } - else if (valstr == "open") // open in user's external browser + if(APT_PROPERTIES == type) { - if (!urlstr.empty()) + const LLAvatarData* avatar_data = static_cast<const LLAvatarData*>(data); + if(avatar_data && getAvatarId() == avatar_data->avatar_id) { - LLWeb::loadURLExternal(urlstr); - } - } - else if (valstr == "home") // reload profile owner's home page - { - if (!self->mHome.empty()) - { - self->load(self->mHome); - } - } -} + childSetValue("register_date", avatar_data->born_on); + childSetValue("sl_description_edit", avatar_data->about_text); + childSetValue("fl_description_edit",avatar_data->fl_about_text); + childSetValue("2nd_life_pic", avatar_data->image_id); + childSetValue("1st_life_pic", avatar_data->fl_image_id); + childSetValue("homepage_edit", avatar_data->profile_url); -void LLPanelAvatarWeb::onStatusTextChange( const EventType& eventIn ) -{ - childSetText("status_text", eventIn.getStringValue() ); -} - -void LLPanelAvatarWeb::onLocationChange( const EventType& eventIn ) -{ - childSetText("url_edit", eventIn.getStringValue() ); -} - - -//----------------------------------------------------------------------------- -// LLPanelAvatarAdvanced -//----------------------------------------------------------------------------- -LLPanelAvatarAdvanced::LLPanelAvatarAdvanced(const std::string& name, - const LLRect& rect, - LLPanelAvatar* panel_avatar) -: LLPanelAvatarTab(name, rect, panel_avatar), - mWantToCount(0), - mSkillsCount(0), - mWantToEdit( NULL ), - mSkillsEdit( NULL ) -{ -} - -void LLPanelAvatarAdvanced::enableControls(BOOL self) -{ - S32 t; - for(t=0;t<mWantToCount;t++) - { - if(mWantToCheck[t])mWantToCheck[t]->setEnabled(self); - } - for(t=0;t<mSkillsCount;t++) - { - if(mSkillsCheck[t])mSkillsCheck[t]->setEnabled(self); - } - - if (mWantToEdit) mWantToEdit->setEnabled(self); - if (mSkillsEdit) mSkillsEdit->setEnabled(self); - childSetEnabled("languages_edit",self); -} + if (!isEditMode()) + { + setCaptionText(avatar_data); + } + childSetValue("show_in_search_checkbox", (BOOL)(avatar_data->flags & AVATAR_ALLOW_PUBLISH)); -void LLPanelAvatarAdvanced::setWantSkills(U32 want_to_mask, const std::string& want_to_text, - U32 skills_mask, const std::string& skills_text, - const std::string& languages_text) -{ - for(int id =0;id<mWantToCount;id++) - { - mWantToCheck[id]->set( want_to_mask & 1<<id ); - } - for(int id =0;id<mSkillsCount;id++) - { - mSkillsCheck[id]->set( skills_mask & 1<<id ); - } - if (mWantToEdit && mSkillsEdit) - { - mWantToEdit->setText( want_to_text ); - mSkillsEdit->setText( skills_text ); - } + if (avatar_data->partner_id.notNull()) + { + std::string first, last; + BOOL found = gCacheName->getName(avatar_data->partner_id, first, last); + if (found) + { + childSetTextArg("partner_text", "[FIRST]", first); + childSetTextArg("partner_text", "[LAST]", last); + } + } + //http://secondlife.com/partner - childSetText("languages_edit",languages_text); -} + bool online = avatar_data->flags & AVATAR_ONLINE; + if(is_agent_friend(avatar_data->avatar_id)) + { + // Online status NO could be because they are hidden + // If they are a friend, we may know the truth! + online = LLAvatarTracker::instance().isBuddyOnline(avatar_data->avatar_id); + } + childSetValue("online_status", online ? + "Online" : "Offline"); + childSetColor("online_status", online ? + LLColor4::green : LLColor4::red); -void LLPanelAvatarAdvanced::getWantSkills(U32* want_to_mask, std::string& want_to_text, - U32* skills_mask, std::string& skills_text, - std::string& languages_text) -{ - if (want_to_mask) - { - *want_to_mask = 0; - for(int t=0;t<mWantToCount;t++) - { - if(mWantToCheck[t]->get()) - *want_to_mask |= 1<<t; + LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(),this); } - } - if (skills_mask) - { - *skills_mask = 0; - for(int t=0;t<mSkillsCount;t++) - { - if(mSkillsCheck[t]->get()) - *skills_mask |= 1<<t; - } - } - if (mWantToEdit) - { - want_to_text = mWantToEdit->getText(); - } - - if (mSkillsEdit) - { - skills_text = mSkillsEdit->getText(); - } - - languages_text = childGetText("languages_edit"); -} - -//----------------------------------------------------------------------------- -// LLPanelAvatarNotes() -//----------------------------------------------------------------------------- -LLPanelAvatarNotes::LLPanelAvatarNotes(const std::string& name, const LLRect& rect, LLPanelAvatar* panel_avatar) -: LLPanelAvatarTab(name, rect, panel_avatar) -{ -} - -void LLPanelAvatarNotes::refresh() -{ - sendAvatarProfileRequestIfNeeded("avatarnotesrequest"); -} - -void LLPanelAvatarNotes::clearControls() -{ - childSetText("notes edit", getString("Loading")); - childSetEnabled("notes edit", false); -} - -// static -void LLPanelAvatarNotes::onCommitNotes(LLUICtrl*, void* userdata) -{ - LLPanelAvatarNotes* self = (LLPanelAvatarNotes*)userdata; - - self->getPanelAvatar()->sendAvatarNotesUpdate(); -} - - -//----------------------------------------------------------------------------- -// LLPanelAvatarClassified() -//----------------------------------------------------------------------------- -LLPanelAvatarClassified::LLPanelAvatarClassified(const std::string& name, const LLRect& rect, - LLPanelAvatar* panel_avatar) -: LLPanelAvatarTab(name, rect, panel_avatar) -{ -} - - -void LLPanelAvatarClassified::refresh() -{ - BOOL self = (gAgent.getID() == getPanelAvatar()->getAvatarID()); - - LLTabContainer* tabs = getChild<LLTabContainer>("classified tab"); - - S32 tab_count = tabs ? tabs->getTabCount() : 0; - - bool allow_new = tab_count < MAX_CLASSIFIEDS; - bool allow_delete = (tab_count > 0); - bool show_help = (tab_count == 0); - - // *HACK: Don't allow making new classifieds from inside the directory. - // The logic for save/don't save when closing is too hairy, and the - // directory is conceptually read-only. JC - bool in_directory = false; - LLView* view = this; - while (view) - { - if (view->getName() == "directory") + if (isOwnProfile() && NULL != mStatusCombobox) { - in_directory = true; - break; + std::string status; + if (gAgent.getAFK()) + { + status = "away"; + } + else if (gAgent.getBusy()) + { + status = "busy"; + } + else + { + status = "online"; + } + mStatusCombobox->setValue(status); } - view = view->getParent(); } - childSetEnabled("New...", self && !in_directory && allow_new); - childSetVisible("New...", !in_directory); - childSetEnabled("Delete...", self && !in_directory && allow_delete); - childSetVisible("Delete...", !in_directory); - childSetVisible("classified tab",!show_help); - - sendAvatarProfileRequestIfNeeded("avatarclassifiedsrequest"); -} - - -BOOL LLPanelAvatarClassified::canClose() -{ - LLTabContainer* tabs = getChild<LLTabContainer>("classified tab"); - for (S32 i = 0; i < tabs->getTabCount(); i++) + else if(APT_GROUPS == type) { - LLPanelClassified* panel = (LLPanelClassified*)tabs->getPanelByIndex(i); - if (!panel->canClose()) + LLAvatarGroups* avatar_groups = static_cast<LLAvatarGroups*>(data); + if(avatar_groups) { - return FALSE; + std::string groups; + LLAvatarGroups::group_list_t::const_iterator it = avatar_groups->group_list.begin(); + for(; avatar_groups->group_list.end() != it; ++it) + { + LLAvatarGroups::LLGroupData group_data = *it; + groups += group_data.group_name; + groups += ", "; + } + childSetValue("sl_groups",groups); } } - return TRUE; } -BOOL LLPanelAvatarClassified::titleIsValid() +void LLPanelAvatarProfile::clear() { - LLTabContainer* tabs = getChild<LLTabContainer>("classified tab"); - if ( tabs ) - { - LLPanelClassified* panel = (LLPanelClassified*)tabs->getCurrentPanel(); - if ( panel ) - { - if ( ! panel->titleIsValid() ) - { - return FALSE; - }; - }; - }; - - return TRUE; + clearControls(); } -void LLPanelAvatarClassified::apply() +void LLPanelAvatarProfile::clearControls() { - LLTabContainer* tabs = getChild<LLTabContainer>("classified tab"); - for (S32 i = 0; i < tabs->getTabCount(); i++) - { - LLPanelClassified* panel = (LLPanelClassified*)tabs->getPanelByIndex(i); - panel->apply(); - } + childSetValue("2nd_life_pic",LLUUID::null); + childSetValue("1st_life_pic",LLUUID::null); + childSetValue("online_status",LLStringUtil::null); + childSetValue("status_message",LLStringUtil::null); + childSetValue("sl_description_edit",LLStringUtil::null); + childSetValue("fl_description_edit",LLStringUtil::null); + childSetValue("sl_groups",LLStringUtil::null); + childSetValue("homepage_edit",LLStringUtil::null); + childSetValue("register_date",LLStringUtil::null); + childSetValue("acc_status_text",LLStringUtil::null); + childSetTextArg("partner_text", "[FIRST]", LLStringUtil::null); + childSetTextArg("partner_text", "[LAST]", LLStringUtil::null); } - -void LLPanelAvatarClassified::deleteClassifiedPanels() +void LLPanelAvatarProfile::setCaptionText(const LLAvatarData* avatar_data) { - LLTabContainer* tabs = getChild<LLTabContainer>("classified tab"); - if (tabs) + std::string caption_text = avatar_data->caption_text; + if(caption_text.empty()) { - tabs->deleteAllTabs(); - } - - childSetVisible("New...", false); - childSetVisible("Delete...", false); - childSetVisible("loading_text", true); -} - - -void LLPanelAvatarClassified::processAvatarClassifiedReply(LLMessageSystem* msg, void**) -{ - S32 block = 0; - S32 block_count = 0; - LLUUID classified_id; - std::string classified_name; - LLPanelClassified* panel_classified = NULL; - - LLTabContainer* tabs = getChild<LLTabContainer>("classified tab"); + LLStringUtil::format_map_t args; + caption_text = getString("CaptionTextAcctInfo"); + BOOL transacted = (avatar_data->flags & AVATAR_TRANSACTED); + BOOL identified = (avatar_data->flags & AVATAR_IDENTIFIED); + BOOL age_verified = (avatar_data->flags & AVATAR_AGEVERIFIED); // Not currently getting set in dataserver/lldataavatar.cpp for privacy considerations - // Don't remove old panels. We need to be able to process multiple - // packets for people who have lots of classifieds. JC - - block_count = msg->getNumberOfBlocksFast(_PREHASH_Data); - for (block = 0; block < block_count; block++) - { - msg->getUUIDFast(_PREHASH_Data, _PREHASH_ClassifiedID, classified_id, block); - msg->getStringFast(_PREHASH_Data, _PREHASH_Name, classified_name, block); - - panel_classified = new LLPanelClassified(false, false); - - panel_classified->setClassifiedID(classified_id); - - // This will request data from the server when the pick is first drawn. - panel_classified->markForServerRequest(); + const char* ACCT_TYPE[] = { + "AcctTypeResident", + "AcctTypeTrial", + "AcctTypeCharterMember", + "AcctTypeEmployee" + }; + U8 caption_index = llclamp(avatar_data->caption_index, (U8)0, (U8)(LL_ARRAY_SIZE(ACCT_TYPE)-1)); + args["[ACCTTYPE]"] = getString(ACCT_TYPE[caption_index]); + + std::string payment_text = " "; + const S32 DEFAULT_CAPTION_LINDEN_INDEX = 3; + if(caption_index != DEFAULT_CAPTION_LINDEN_INDEX) + { + if(transacted) + { + payment_text = "PaymentInfoUsed"; + } + else if (identified) + { + payment_text = "PaymentInfoOnFile"; + } + else + { + payment_text = "NoPaymentInfoOnFile"; + } + args["[PAYMENTINFO]"] = getString(payment_text); - // The button should automatically truncate long names for us - if(tabs) + std::string age_text = age_verified ? "AgeVerified" : "NotAgeVerified"; + // Do not display age verification status at this time + //args["[[AGEVERIFICATION]]"] = mPanelSecondLife->getString(age_text); + args["[AGEVERIFICATION]"] = " "; + } + else { - tabs->addTabPanel(panel_classified, classified_name); + args["[PAYMENTINFO]"] = " "; + args["[AGEVERIFICATION]"] = " "; } + LLStringUtil::format(caption_text, args); } - // Make sure somebody is highlighted. This works even if there - // are no tabs in the container. - if(tabs) - { - tabs->selectFirstTab(); - } - - childSetVisible("New...", true); - childSetVisible("Delete...", true); - childSetVisible("loading_text", false); + childSetValue("acc_status_text", caption_text); } - -// Create a new classified panel. It will automatically handle generating -// its own id when it's time to save. -// static -void LLPanelAvatarClassified::onClickNew(void* data) +void LLPanelAvatarProfile::onAddFriendButtonClick() { - LLPanelAvatarClassified* self = (LLPanelAvatarClassified*)data; - - LLNotifications::instance().add("AddClassified", LLSD(), LLSD(), boost::bind(&LLPanelAvatarClassified::callbackNew, self, _1, _2)); - + onAddFriend(); } -bool LLPanelAvatarClassified::callbackNew(const LLSD& notification, const LLSD& response) +void LLPanelAvatarProfile::onIMButtonClick() { - S32 option = LLNotification::getSelectedOption(notification, response); - if (0 == option) - { - LLPanelClassified* panel_classified = new LLPanelClassified(false, false); - panel_classified->initNewClassified(); - LLTabContainer* tabs = getChild<LLTabContainer>("classified tab"); - if(tabs) - { - tabs->addTabPanel(panel_classified, panel_classified->getClassifiedName()); - tabs->selectLastTab(); - } - } - return false; + onIM(); } - -// static -void LLPanelAvatarClassified::onClickDelete(void* data) +void LLPanelAvatarProfile::onTeleportButtonClick() { - LLPanelAvatarClassified* self = (LLPanelAvatarClassified*)data; - - LLTabContainer* tabs = self->getChild<LLTabContainer>("classified tab"); - LLPanelClassified* panel_classified = NULL; - if(tabs) - { - panel_classified = (LLPanelClassified*)tabs->getCurrentPanel(); - } - if (!panel_classified) return; - - LLSD args; - args["NAME"] = panel_classified->getClassifiedName(); - LLNotifications::instance().add("DeleteClassified", args, LLSD(), boost::bind(&LLPanelAvatarClassified::callbackDelete, self, _1, _2)); - + onTeleport(); } - -bool LLPanelAvatarClassified::callbackDelete(const LLSD& notification, const LLSD& response) +void LLPanelAvatarProfile::onCallButtonClick() { - S32 option = LLNotification::getSelectedOption(notification, response); - LLTabContainer* tabs = getChild<LLTabContainer>("classified tab"); - LLPanelClassified* panel_classified=NULL; - if(tabs) - { - panel_classified = (LLPanelClassified*)tabs->getCurrentPanel(); - } - - LLMessageSystem* msg = gMessageSystem; - if (!panel_classified) return false; - - if (0 == option) - { - msg->newMessageFast(_PREHASH_ClassifiedDelete); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->nextBlockFast(_PREHASH_Data); - msg->addUUIDFast(_PREHASH_ClassifiedID, panel_classified->getClassifiedID()); - gAgent.sendReliableMessage(); - - if(tabs) - { - tabs->removeTabPanel(panel_classified); - } - delete panel_classified; - panel_classified = NULL; - } - return false; } - -//----------------------------------------------------------------------------- -// LLPanelAvatarPicks() -//----------------------------------------------------------------------------- -LLPanelAvatarPicks::LLPanelAvatarPicks(const std::string& name, - const LLRect& rect, - LLPanelAvatar* panel_avatar) -: LLPanelAvatarTab(name, rect, panel_avatar) +void LLPanelAvatarProfile::onShareButtonClick() { -} - -void LLPanelAvatarPicks::refresh() -{ - BOOL self = (gAgent.getID() == getPanelAvatar()->getAvatarID()); - LLTabContainer* tabs = getChild<LLTabContainer>("picks tab"); - S32 tab_count = tabs ? tabs->getTabCount() : 0; - childSetEnabled("New...", self && tab_count < MAX_AVATAR_PICKS); - childSetEnabled("Delete...", self && tab_count > 0); - childSetVisible("New...", self && getPanelAvatar()->isEditable()); - childSetVisible("Delete...", self && getPanelAvatar()->isEditable()); - - sendAvatarProfileRequestIfNeeded("avatarpicksrequest"); } - -void LLPanelAvatarPicks::deletePickPanels() +/*virtual*/ BOOL LLPanelAvatarProfile::postBuild(void) { - LLTabContainer* tabs = getChild<LLTabContainer>("picks tab"); - if(tabs) - { - tabs->deleteAllTabs(); - } - - childSetVisible("New...", false); - childSetVisible("Delete...", false); - childSetVisible("loading_text", true); -} - -void LLPanelAvatarPicks::processAvatarPicksReply(LLMessageSystem* msg, void**) -{ - S32 block = 0; - S32 block_count = 0; - LLUUID pick_id; - std::string pick_name; - LLPanelPick* panel_pick = NULL; - - LLTabContainer* tabs = getChild<LLTabContainer>("picks tab"); - - // Clear out all the old panels. We'll replace them with the correct - // number of new panels. - deletePickPanels(); - - // The database needs to know for which user to look up picks. - LLUUID avatar_id = getPanelAvatar()->getAvatarID(); - - block_count = msg->getNumberOfBlocks("Data"); - for (block = 0; block < block_count; block++) + mStatusCombobox = getChild<LLComboBox>("status_combo", TRUE, FALSE); + if (NULL != mStatusCombobox) { - msg->getUUID("Data", "PickID", pick_id, block); - msg->getString("Data", "PickName", pick_name, block); - - panel_pick = new LLPanelPick(FALSE); - - panel_pick->setPickID(pick_id, avatar_id); - - // This will request data from the server when the pick is first - // drawn. - panel_pick->markForServerRequest(); - - // The button should automatically truncate long names for us - if(tabs) - { - tabs->addTabPanel(panel_pick, pick_name); - } + mStatusCombobox->setCommitCallback(boost::bind(&LLPanelAvatarProfile::onStatusChanged, this)); } - - // Make sure somebody is highlighted. This works even if there - // are no tabs in the container. - if(tabs) + mStatusMessage = getChild<LLLineEditor>("status_me_message_edit", TRUE, FALSE); + if (NULL != mStatusMessage) { - tabs->selectFirstTab(); + mStatusMessage->setCommitCallback(boost::bind(&LLPanelAvatarProfile::onStatusMessageChanged, this)); } - childSetVisible("New...", true); - childSetVisible("Delete...", true); - childSetVisible("loading_text", false); -} - - -// Create a new pick panel. It will automatically handle generating -// its own id when it's time to save. -// static -void LLPanelAvatarPicks::onClickNew(void* data) -{ - LLPanelAvatarPicks* self = (LLPanelAvatarPicks*)data; - LLPanelPick* panel_pick = new LLPanelPick(FALSE); - LLTabContainer* tabs = self->getChild<LLTabContainer>("picks tab"); + childSetCommitCallback("add_friend",(boost::bind(&LLPanelAvatarProfile::onAddFriendButtonClick,this)),NULL); + childSetCommitCallback("im",(boost::bind(&LLPanelAvatarProfile::onIMButtonClick,this)),NULL); + childSetCommitCallback("call",(boost::bind(&LLPanelAvatarProfile::onCallButtonClick,this)),NULL); + childSetCommitCallback("teleport",(boost::bind(&LLPanelAvatarProfile::onTeleportButtonClick,this)),NULL); + childSetCommitCallback("share",(boost::bind(&LLPanelAvatarProfile::onShareButtonClick,this)),NULL); - panel_pick->initNewPick(); - if(tabs) + LLTextureCtrl* pic = getChild<LLTextureCtrl>("2nd_life_pic",TRUE,FALSE); + if(pic) { - tabs->addTabPanel(panel_pick, panel_pick->getPickName()); - tabs->selectLastTab(); + pic->setFallbackImageName("default_land_picture.j2c"); } -} - - -// static -void LLPanelAvatarPicks::onClickDelete(void* data) -{ - LLPanelAvatarPicks* self = (LLPanelAvatarPicks*)data; - LLTabContainer* tabs = self->getChild<LLTabContainer>("picks tab"); - LLPanelPick* panel_pick = tabs?(LLPanelPick*)tabs->getCurrentPanel():NULL; - - if (!panel_pick) return; - - LLSD args; - args["PICK"] = panel_pick->getPickName(); - - LLNotifications::instance().add("DeleteAvatarPick", args, LLSD(), - boost::bind(&LLPanelAvatarPicks::callbackDelete, self, _1, _2)); -} - - -// static -bool LLPanelAvatarPicks::callbackDelete(const LLSD& notification, const LLSD& response) -{ - S32 option = LLNotification::getSelectedOption(notification, response); - LLTabContainer* tabs = getChild<LLTabContainer>("picks tab"); - LLPanelPick* panel_pick = tabs ? (LLPanelPick*)tabs->getCurrentPanel() : NULL; - LLMessageSystem* msg = gMessageSystem; - - if (!panel_pick) return false; - - if (0 == option) + pic = getChild<LLTextureCtrl>("1st_life_pic",TRUE,FALSE); + if(pic) { - // If the viewer has a hacked god-mode, then this call will - // fail. - if(gAgent.isGodlike()) - { - msg->newMessage("PickGodDelete"); - msg->nextBlock("AgentData"); - msg->addUUID("AgentID", gAgent.getID()); - msg->addUUID("SessionID", gAgent.getSessionID()); - msg->nextBlock("Data"); - msg->addUUID("PickID", panel_pick->getPickID()); - // *HACK: We need to send the pick's creator id to accomplish - // the delete, and we don't use the query id for anything. JC - msg->addUUID( "QueryID", panel_pick->getPickCreatorID() ); - } - else - { - msg->newMessage("PickDelete"); - msg->nextBlock("AgentData"); - msg->addUUID("AgentID", gAgent.getID()); - msg->addUUID("SessionID", gAgent.getSessionID()); - msg->nextBlock("Data"); - msg->addUUID("PickID", panel_pick->getPickID()); - } - gAgent.sendReliableMessage(); - - if(tabs) - { - tabs->removeTabPanel(panel_pick); - } - delete panel_pick; - panel_pick = NULL; + pic->setFallbackImageName("default_land_picture.j2c"); } - return false; -} - - -//----------------------------------------------------------------------------- -// LLPanelAvatar -//----------------------------------------------------------------------------- -LLPanelAvatar::LLPanelAvatar( - const std::string& name, - const LLRect &rect, - BOOL allow_edit) - : - LLPanel(name, rect, FALSE), - mPanelSecondLife(NULL), - mPanelAdvanced(NULL), - mPanelClassified(NULL), - mPanelPicks(NULL), - mPanelNotes(NULL), - mPanelFirstLife(NULL), - mPanelWeb(NULL), - mDropTarget(NULL), - mAvatarID( LLUUID::null ), // mAvatarID is set with 'setAvatar' or 'setAvatarID' - mHaveProperties(FALSE), - mHaveStatistics(FALSE), - mHaveNotes(false), - mLastNotes(), - mAllowEdit(allow_edit) -{ - - sAllPanels.push_back(this); - - LLCallbackMap::map_t factory_map; - - factory_map["2nd Life"] = LLCallbackMap(createPanelAvatarSecondLife, this); - factory_map["WebProfile"] = LLCallbackMap(createPanelAvatarWeb, this); - factory_map["Interests"] = LLCallbackMap(createPanelAvatarInterests, this); - factory_map["Picks"] = LLCallbackMap(createPanelAvatarPicks, this); - factory_map["Classified"] = LLCallbackMap(createPanelAvatarClassified, this); - factory_map["1st Life"] = LLCallbackMap(createPanelAvatarFirstLife, this); - factory_map["My Notes"] = LLCallbackMap(createPanelAvatarNotes, this); - - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_avatar.xml", &factory_map); - - selectTab(0); - - -} -BOOL LLPanelAvatar::postBuild(void) -{ - mTab = getChild<LLTabContainer>("tab"); - childSetAction("Kick",onClickKick,this); - childSetAction("Freeze",onClickFreeze, this); - childSetAction("Unfreeze", onClickUnfreeze, this); - childSetAction("csr_btn", onClickCSR, this); - childSetAction("OK", onClickOK, this); - childSetAction("Cancel", onClickCancel, this); - - if(mTab && !sAllowFirstLife) - { - LLPanel* panel = mTab->getPanelByName("1st Life"); - if (panel) mTab->removeTabPanel(panel); - - panel = mTab->getPanelByName("WebProfile"); - if (panel) mTab->removeTabPanel(panel); - } - childSetVisible("Kick",FALSE); - childSetEnabled("Kick",FALSE); - childSetVisible("Freeze",FALSE); - childSetEnabled("Freeze",FALSE); - childSetVisible("Unfreeze",FALSE); - childSetEnabled("Unfreeze",FALSE); - childSetVisible("csr_btn", FALSE); - childSetEnabled("csr_btn", FALSE); + clearControls(); + updateChildrenList(); return TRUE; } - - -LLPanelAvatar::~LLPanelAvatar() -{ - sAllPanels.remove(this); -} - - -BOOL LLPanelAvatar::canClose() -{ - return mPanelClassified && mPanelClassified->canClose(); -} - -void LLPanelAvatar::setAvatar(LLViewerObject *avatarp) +void LLPanelAvatarProfile::onOpen(const LLSD& key) { - // find the avatar and grab the name - LLNameValue *firstname = avatarp->getNVPair("FirstName"); - LLNameValue *lastname = avatarp->getNVPair("LastName"); - - std::string name; - if (firstname && lastname) - { - name.assign( firstname->getString() ); - name.append(" "); - name.append( lastname->getString() ); - } - else - { - name.assign(""); - } - - // If we have an avatar pointer, they must be online. - setAvatarID(avatarp->getID(), name, ONLINE_STATUS_YES); + setAvatarId(key); + scrollToTop(); + updateChildrenList(); + updateData(); } -void LLPanelAvatar::setOnlineStatus(EOnlineStatus online_status) +void LLPanelAvatarProfile::scrollToTop() { - // Online status NO could be because they are hidden - // If they are a friend, we may know the truth! - if ((ONLINE_STATUS_YES != online_status) - && mIsFriend - && (LLAvatarTracker::instance().isBuddyOnline( mAvatarID ))) - { - online_status = ONLINE_STATUS_YES; - } - - mPanelSecondLife->childSetVisible("online_yes", (online_status == ONLINE_STATUS_YES)); - - // Since setOnlineStatus gets called after setAvatarID - // need to make sure that "Offer Teleport" doesn't get set - // to TRUE again for yourself - if (mAvatarID != gAgent.getID()) - { - childSetVisible("Offer Teleport...",TRUE); - } - - BOOL in_prelude = gAgent.inPrelude(); - if(gAgent.isGodlike()) - { - childSetEnabled("Offer Teleport...", TRUE); - childSetToolTip("Offer Teleport...", childGetValue("TeleportGod").asString()); - } - else if (in_prelude) - { - childSetEnabled("Offer Teleport...",FALSE); - childSetToolTip("Offer Teleport...",childGetValue("TeleportPrelude").asString()); - } - else + LLScrollContainer* scrollContainer = getChild<LLScrollContainer>("profile_scroll", FALSE, FALSE); + if (NULL != scrollContainer) { - childSetEnabled("Offer Teleport...", (online_status == ONLINE_STATUS_YES)); - childSetToolTip("Offer Teleport...", childGetValue("TeleportNormal").asString()); + scrollContainer->goToTop(); } } -void LLPanelAvatar::setAvatarID(const LLUUID &avatar_id, const std::string &name, - EOnlineStatus online_status) +void LLPanelAvatarProfile::updateChildrenList() { - if (avatar_id.isNull()) return; - - BOOL avatar_changed = FALSE; - if (avatar_id != mAvatarID) - { - avatar_changed = TRUE; - } - mAvatarID = avatar_id; - - // Determine if we have their calling card. - mIsFriend = is_agent_friend(mAvatarID); - - // setOnlineStatus uses mIsFriend - setOnlineStatus(online_status); - - BOOL own_avatar = (mAvatarID == gAgent.getID() ); - BOOL avatar_is_friend = LLAvatarTracker::instance().getBuddyInfo(mAvatarID) != NULL; - - mPanelSecondLife->enableControls(own_avatar && mAllowEdit); - mPanelWeb->enableControls(own_avatar && mAllowEdit); - mPanelAdvanced->enableControls(own_avatar && mAllowEdit); - // Teens don't have this. - if (mPanelFirstLife) mPanelFirstLife->enableControls(own_avatar && mAllowEdit); - - LLView *target_view = getChild<LLView>("drop_target_rect"); - if(target_view) - { - if (mDropTarget) - { - delete mDropTarget; - } - mDropTarget = new LLDropTarget("drop target", target_view->getRect(), mAvatarID); - addChild(mDropTarget); - mDropTarget->setAgentID(mAvatarID); - } - - LLNameEditor* name_edit = getChild<LLNameEditor>("name"); - if(name_edit) - { - if (name.empty()) - { - name_edit->setNameID(avatar_id, FALSE); - } - else - { - name_edit->setText(name); - } - } -// if (avatar_changed) - { - // While we're waiting for data off the network, clear out the - // old data. - mPanelSecondLife->clearControls(); - - mPanelPicks->deletePickPanels(); - mPanelPicks->setDataRequested(false); - - mPanelClassified->deleteClassifiedPanels(); - mPanelClassified->setDataRequested(false); - - mPanelNotes->clearControls(); - mPanelNotes->setDataRequested(false); - mHaveNotes = false; - mLastNotes.clear(); - - // Request just the first two pages of data. The picks, - // classifieds, and notes will be requested when that panel - // is made visible. JC - sendAvatarPropertiesRequest(); - - if (own_avatar) - { - if (mAllowEdit) - { - // OK button disabled until properties data arrives - childSetVisible("OK", true); - childSetEnabled("OK", false); - childSetVisible("Cancel",TRUE); - childSetEnabled("Cancel",TRUE); - } - else - { - childSetVisible("OK",FALSE); - childSetEnabled("OK",FALSE); - childSetVisible("Cancel",FALSE); - childSetEnabled("Cancel",FALSE); - } - childSetVisible("Instant Message...",FALSE); - childSetEnabled("Instant Message...",FALSE); - childSetVisible("Mute",FALSE); - childSetEnabled("Mute",FALSE); - childSetVisible("Offer Teleport...",FALSE); - childSetEnabled("Offer Teleport...",FALSE); - childSetVisible("drop target",FALSE); - childSetEnabled("drop target",FALSE); - childSetVisible("Find on Map",FALSE); - childSetEnabled("Find on Map",FALSE); - childSetVisible("Add Friend...",FALSE); - childSetEnabled("Add Friend...",FALSE); - childSetVisible("Pay...",FALSE); - childSetEnabled("Pay...",FALSE); - } - else - { - childSetVisible("OK",FALSE); - childSetEnabled("OK",FALSE); - - childSetVisible("Cancel",FALSE); - childSetEnabled("Cancel",FALSE); - - childSetVisible("Instant Message...",TRUE); - childSetEnabled("Instant Message...",FALSE); - childSetVisible("Mute",TRUE); - childSetEnabled("Mute",FALSE); - - childSetVisible("drop target",TRUE); - childSetEnabled("drop target",FALSE); - - childSetVisible("Find on Map",TRUE); - // Note: we don't always know online status, so always allow gods to try to track - BOOL enable_track = gAgent.isGodlike() || is_agent_mappable(mAvatarID); - childSetEnabled("Find on Map",enable_track); - if (!mIsFriend) - { - childSetToolTip("Find on Map",childGetValue("ShowOnMapNonFriend").asString()); - } - else if (ONLINE_STATUS_YES != online_status) - { - childSetToolTip("Find on Map",childGetValue("ShowOnMapFriendOffline").asString()); - } - else - { - childSetToolTip("Find on Map",childGetValue("ShowOnMapFriendOnline").asString()); - } - childSetVisible("Add Friend...", true); - childSetEnabled("Add Friend...", !avatar_is_friend); - childSetVisible("Pay...",TRUE); - childSetEnabled("Pay...",FALSE); - } - } - - BOOL is_god = FALSE; - if (gAgent.isGodlike()) is_god = TRUE; - - childSetVisible("Kick", is_god); - childSetEnabled("Kick", is_god); - childSetVisible("Freeze", is_god); - childSetEnabled("Freeze", is_god); - childSetVisible("Unfreeze", is_god); - childSetEnabled("Unfreeze", is_god); - childSetVisible("csr_btn", is_god); - childSetEnabled("csr_btn", is_god); -} - - -void LLPanelAvatar::resetGroupList() -{ - // only get these updates asynchronously via the group floater, which works on the agent only - if (mAvatarID != gAgent.getID()) + if (mUpdated || isEditMode()) { return; } - - if (mPanelSecondLife) + switch (mProfileType) { - LLScrollListCtrl* group_list = mPanelSecondLife->getChild<LLScrollListCtrl>("groups"); - if (group_list) - { - group_list->deleteAllItems(); - - S32 count = gAgent.mGroups.count(); - LLUUID id; - - for(S32 i = 0; i < count; ++i) - { - LLGroupData group_data = gAgent.mGroups.get(i); - id = group_data.mID; - std::string group_string; - /* Show group title? DUMMY_POWER for Don Grep - if(group_data.mOfficer) - { - group_string = "Officer of "; - } - else - { - group_string = "Member of "; - } - */ - - group_string += group_data.mName; - - LLSD row; - - row["id"] = id ; - row["columns"][0]["value"] = group_string; - row["columns"][0]["font"] = "SANSSERIF_SMALL"; - row["columns"][0]["width"] = 0; - group_list->addElement(row); - } - group_list->sortByColumnIndex(0, TRUE); - } - } -} - -// static -//----------------------------------------------------------------------------- -// onClickIM() -//----------------------------------------------------------------------------- -void LLPanelAvatar::onClickIM(void* userdata) -{ - LLPanelAvatar* self = (LLPanelAvatar*) userdata; - gIMMgr->setFloaterOpen(TRUE); + case PT_OWN: + childSetVisible("status_panel",FALSE); + childSetVisible("profile_buttons_panel",FALSE); + childSetVisible("title_groups_text",FALSE); + childSetVisible("sl_groups",FALSE); + mUpdated = true; + childSetVisible("status_me_panel",TRUE); + childSetVisible("profile_me_buttons_panel",TRUE); - std::string name; - LLNameEditor* nameedit = self->mPanelSecondLife->getChild<LLNameEditor>("name"); - if (nameedit) name = nameedit->getText(); - gIMMgr->addSession(name, IM_NOTHING_SPECIAL, self->mAvatarID); -} + break; + case PT_OTHER: + childSetVisible("status_me_panel",FALSE); + childSetVisible("profile_me_buttons_panel",FALSE); + childSetVisible("status_panel",TRUE); + childSetVisible("profile_buttons_panel",TRUE); + childSetVisible("title_groups_text",TRUE); + childSetVisible("sl_groups",TRUE); -// static -//----------------------------------------------------------------------------- -// onClickTrack() -//----------------------------------------------------------------------------- -void LLPanelAvatar::onClickTrack(void* userdata) -{ - LLPanelAvatar* self = (LLPanelAvatar*) userdata; - - if( gFloaterWorldMap ) - { - std::string name; - LLNameEditor* nameedit = self->mPanelSecondLife->getChild<LLNameEditor>("name"); - if (nameedit) name = nameedit->getText(); - gFloaterWorldMap->trackAvatar(self->mAvatarID, name); - LLFloaterWorldMap::show(NULL, TRUE); - } -} + // account actions + childSetVisible("account_actions_panel", FALSE); + childSetVisible("partner_edit_link", FALSE); - -// static -void LLPanelAvatar::onClickAddFriend(void* userdata) -{ - LLPanelAvatar* self = (LLPanelAvatar*) userdata; - LLNameEditor* name_edit = self->mPanelSecondLife->getChild<LLNameEditor>("name"); - if (name_edit) - { - LLPanelFriends::requestFriendshipDialog(self->getAvatarID(), - name_edit->getText()); + mUpdated = true; + break; + case PT_UNKNOWN: break;//do nothing + default: + llassert(false); } } - -//----------------------------------------------------------------------------- -// onClickMute() -//----------------------------------------------------------------------------- -void LLPanelAvatar::onClickMute(void *userdata) +void LLPanelAvatarProfile::onStatusChanged() { - LLPanelAvatar* self = (LLPanelAvatar*) userdata; - - LLUUID agent_id = self->getAvatarID(); - LLNameEditor* name_edit = self->mPanelSecondLife->getChild<LLNameEditor>("name"); + LLSD::String status = mStatusCombobox->getValue().asString(); - if (name_edit) + if ("online" == status) { - std::string agent_name = name_edit->getText(); - LLFloaterMute::showInstance(); - - if (LLMuteList::getInstance()->isMuted(agent_id)) - { - LLFloaterMute::getInstance()->selectMute(agent_id); - } - else - { - LLMute mute(agent_id, agent_name, LLMute::AGENT); - LLMuteList::getInstance()->add(mute); - } + gAgent.clearAFK(); + gAgent.clearBusy(); } -} - - -// static -void LLPanelAvatar::onClickOfferTeleport(void *userdata) -{ - LLPanelAvatar* self = (LLPanelAvatar*) userdata; - - handle_lure(self->mAvatarID); -} - - -// static -void LLPanelAvatar::onClickPay(void *userdata) -{ - LLPanelAvatar* self = (LLPanelAvatar*) userdata; - handle_pay_by_id(self->mAvatarID); -} - - -// static -void LLPanelAvatar::onClickOK(void *userdata) -{ - LLPanelAvatar *self = (LLPanelAvatar *)userdata; - - // JC: Only save the data if we actually got the original - // properties. Otherwise we might save blanks into - // the database. - if (self - && self->mHaveProperties) + else if ("away" == status) { - self->sendAvatarPropertiesUpdate(); - - LLTabContainer* tabs = self->getChild<LLTabContainer>("tab"); - if ( tabs->getCurrentPanel() != self->mPanelClassified ) - { - self->mPanelClassified->apply(); - - LLFloaterAvatarInfo *infop = LLFloaterAvatarInfo::getInstance(self->mAvatarID); - if (infop) - { - infop->close(); - } - } - else - { - if ( self->mPanelClassified->titleIsValid() ) - { - self->mPanelClassified->apply(); - - LLFloaterAvatarInfo *infop = LLFloaterAvatarInfo::getInstance(self->mAvatarID); - if (infop) - { - infop->close(); - } - } - } + gAgent.clearBusy(); + gAgent.setAFK(); } -} - -// static -void LLPanelAvatar::onClickCancel(void *userdata) -{ - LLPanelAvatar *self = (LLPanelAvatar *)userdata; - - if (self) - { - LLFloaterAvatarInfo *infop; - if ((infop = LLFloaterAvatarInfo::getInstance(self->mAvatarID))) - { - infop->close(); - } - else - { - // We're in the Search directory and are cancelling an edit - // to our own profile, so reset. - self->sendAvatarPropertiesRequest(); - } - } -} - - -void LLPanelAvatar::sendAvatarPropertiesRequest() -{ - lldebugs << "LLPanelAvatar::sendAvatarPropertiesRequest()" << llendl; - LLMessageSystem *msg = gMessageSystem; - - msg->newMessageFast(_PREHASH_AvatarPropertiesRequest); - msg->nextBlockFast( _PREHASH_AgentData); - msg->addUUIDFast( _PREHASH_AgentID, gAgent.getID() ); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->addUUIDFast( _PREHASH_AvatarID, mAvatarID); - gAgent.sendReliableMessage(); -} - -void LLPanelAvatar::sendAvatarNotesUpdate() -{ - std::string notes = mPanelNotes->childGetValue("notes edit").asString(); - - if (!mHaveNotes - && (notes.empty() || notes == getString("Loading"))) + else if ("busy" == status) { - // no notes from server and no user updates - return; + gAgent.clearAFK(); + gAgent.setBusy(); + LLNotifications::instance().add("BusyModeSet"); } - if (notes == mLastNotes) + else { - // Avatar notes unchanged - return; } - LLMessageSystem *msg = gMessageSystem; - - msg->newMessage("AvatarNotesUpdate"); - msg->nextBlock("AgentData"); - msg->addUUID("AgentID", gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->nextBlock("Data"); - msg->addUUID("TargetID", mAvatarID); - msg->addString("Notes", notes); - - gAgent.sendReliableMessage(); } - -// static -void LLPanelAvatar::processAvatarPropertiesReply(LLMessageSystem *msg, void**) +void LLPanelAvatarProfile::onStatusMessageChanged() { - LLUUID agent_id; // your id - LLUUID avatar_id; // target of this panel - LLUUID image_id; - LLUUID fl_image_id; - LLUUID partner_id; - std::string about_text; - std::string fl_about_text; - std::string born_on; - S32 charter_member_size = 0; - BOOL allow_publish = FALSE; - //BOOL mature = FALSE; - BOOL identified = FALSE; - BOOL transacted = FALSE; - BOOL age_verified = FALSE; - BOOL online = FALSE; - std::string profile_url; - - U32 flags = 0x0; - - //llinfos << "properties packet size " << msg->getReceiveSize() << llendl; - - msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id); - msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AvatarID, avatar_id ); - - for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter) - { - LLPanelAvatar* self = *iter; - if (self->mAvatarID != avatar_id) - { - continue; - } - self->childSetEnabled("Instant Message...",TRUE); - self->childSetEnabled("Pay...",TRUE); - self->childSetEnabled("Mute",TRUE); - - self->childSetEnabled("drop target",TRUE); - - self->mHaveProperties = TRUE; - self->enableOKIfReady(); - - msg->getUUIDFast( _PREHASH_PropertiesData, _PREHASH_ImageID, image_id ); - msg->getUUIDFast( _PREHASH_PropertiesData, _PREHASH_FLImageID, fl_image_id ); - msg->getUUIDFast(_PREHASH_PropertiesData, _PREHASH_PartnerID, partner_id); - msg->getStringFast(_PREHASH_PropertiesData, _PREHASH_AboutText, about_text ); - msg->getStringFast(_PREHASH_PropertiesData, _PREHASH_FLAboutText, fl_about_text ); - msg->getStringFast(_PREHASH_PropertiesData, _PREHASH_BornOn, born_on); - msg->getString("PropertiesData","ProfileURL", profile_url); - msg->getU32Fast(_PREHASH_PropertiesData, _PREHASH_Flags, flags); - - identified = (flags & AVATAR_IDENTIFIED); - transacted = (flags & AVATAR_TRANSACTED); - age_verified = (flags & AVATAR_AGEVERIFIED); // Not currently getting set in dataserver/lldataavatar.cpp for privacy considerations - allow_publish = (flags & AVATAR_ALLOW_PUBLISH); - online = (flags & AVATAR_ONLINE); - - U8 caption_index = 0; - std::string caption_text; - charter_member_size = msg->getSize("PropertiesData", "CharterMember"); - if(1 == charter_member_size) - { - msg->getBinaryData("PropertiesData", "CharterMember", &caption_index, 1); - } - else if(1 < charter_member_size) - { - msg->getString("PropertiesData", "CharterMember", caption_text); - } - - - if(caption_text.empty()) - { - LLStringUtil::format_map_t args; - caption_text = self->mPanelSecondLife->getString("CaptionTextAcctInfo"); - - const char* ACCT_TYPE[] = { - "AcctTypeResident", - "AcctTypeTrial", - "AcctTypeCharterMember", - "AcctTypeEmployee" - }; - caption_index = llclamp(caption_index, (U8)0, (U8)(LL_ARRAY_SIZE(ACCT_TYPE)-1)); - args["[ACCTTYPE]"] = self->mPanelSecondLife->getString(ACCT_TYPE[caption_index]); - - std::string payment_text = " "; - const S32 DEFAULT_CAPTION_LINDEN_INDEX = 3; - if(caption_index != DEFAULT_CAPTION_LINDEN_INDEX) - { - if(transacted) - { - payment_text = "PaymentInfoUsed"; - } - else if (identified) - { - payment_text = "PaymentInfoOnFile"; - } - else - { - payment_text = "NoPaymentInfoOnFile"; - } - args["[PAYMENTINFO]"] = self->mPanelSecondLife->getString(payment_text); - std::string age_text = age_verified ? "AgeVerified" : "NotAgeVerified"; - // Do not display age verification status at this time - //args["[[AGEVERIFICATION]]"] = self->mPanelSecondLife->getString(age_text); - args["[AGEVERIFICATION]"] = " "; - } - else - { - args["[PAYMENTINFO]"] = " "; - args["[AGEVERIFICATION]"] = " "; - } - LLStringUtil::format(caption_text, args); - } - - self->mPanelSecondLife->childSetValue("acct", caption_text); - self->mPanelSecondLife->childSetValue("born", born_on); - - EOnlineStatus online_status = (online) ? ONLINE_STATUS_YES : ONLINE_STATUS_NO; - - self->setOnlineStatus(online_status); - - self->mPanelWeb->setWebURL(profile_url); - - LLTextureCtrl* image_ctrl = self->mPanelSecondLife->getChild<LLTextureCtrl>("img"); - if(image_ctrl) - { - image_ctrl->setImageAssetID(image_id); - } - self->childSetValue("about", about_text); - - self->mPanelSecondLife->setPartnerID(partner_id); - self->mPanelSecondLife->updatePartnerName(); - - if (self->mPanelFirstLife) - { - // Teens don't get these - self->mPanelFirstLife->childSetValue("about", fl_about_text); - LLTextureCtrl* image_ctrl = self->mPanelFirstLife->getChild<LLTextureCtrl>("img"); - if(image_ctrl) - { - image_ctrl->setImageAssetID(fl_image_id); - } - - self->mPanelSecondLife->childSetValue("allow_publish", allow_publish); - - } - } + updateData(); } -// static -void LLPanelAvatar::processAvatarInterestsReply(LLMessageSystem *msg, void**) -{ - LLUUID agent_id; // your id - LLUUID avatar_id; // target of this panel - - U32 want_to_mask; - std::string want_to_text; - U32 skills_mask; - std::string skills_text; - std::string languages_text; - - //llinfos << "properties packet size " << msg->getReceiveSize() << llendl; - - msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id); - msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AvatarID, avatar_id ); - - for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter) - { - LLPanelAvatar* self = *iter; - if (self->mAvatarID != avatar_id) - { - continue; - } - - msg->getU32Fast( _PREHASH_PropertiesData, _PREHASH_WantToMask, want_to_mask ); - msg->getStringFast(_PREHASH_PropertiesData, _PREHASH_WantToText, want_to_text ); - msg->getU32Fast( _PREHASH_PropertiesData, _PREHASH_SkillsMask, skills_mask ); - msg->getStringFast(_PREHASH_PropertiesData, _PREHASH_SkillsText, skills_text ); - msg->getString(_PREHASH_PropertiesData, "LanguagesText", languages_text ); - - self->mPanelAdvanced->setWantSkills(want_to_mask, want_to_text, skills_mask, skills_text, languages_text); - } -} -// Separate function because the groups list can be very long, almost -// filling a packet. JC -// static -void LLPanelAvatar::processAvatarGroupsReply(LLMessageSystem *msg, void**) +//----------------------------------------------------------------------------- +// LLPanelAvatarNotes() +//----------------------------------------------------------------------------- +LLPanelAvatarNotes::LLPanelAvatarNotes(const LLUUID& id /* = LLUUID::null */) +:LLPanelProfileTab(id) { - LLUUID agent_id; // your id - LLUUID avatar_id; // target of this panel - U64 group_powers; - std::string group_title; - LLUUID group_id; - std::string group_name; - LLUUID group_insignia_id; - - llinfos << "groups packet size " << msg->getReceiveSize() << llendl; - - msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id); - msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AvatarID, avatar_id ); - - for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter) - { - LLPanelAvatar* self = *iter; - if (self->mAvatarID != avatar_id) - { - continue; - } - - LLScrollListCtrl* group_list = self->mPanelSecondLife->getChild<LLScrollListCtrl>("groups"); -// if(group_list) -// { -// group_list->deleteAllItems(); -// } - - S32 group_count = msg->getNumberOfBlocksFast(_PREHASH_GroupData); - if (0 == group_count) - { - if(group_list) group_list->addCommentText(std::string("None")); // *TODO: Translate - } - else - { - for(S32 i = 0; i < group_count; ++i) - { - msg->getU64( _PREHASH_GroupData, "GroupPowers", group_powers, i ); - msg->getStringFast(_PREHASH_GroupData, _PREHASH_GroupTitle, group_title, i ); - msg->getUUIDFast( _PREHASH_GroupData, _PREHASH_GroupID, group_id, i); - msg->getStringFast(_PREHASH_GroupData, _PREHASH_GroupName, group_name, i ); - msg->getUUIDFast( _PREHASH_GroupData, _PREHASH_GroupInsigniaID, group_insignia_id, i ); - - std::string group_string; - if (group_id.notNull()) - { - group_string.assign(group_name); - } - else - { - group_string.assign(""); - } - - // Is this really necessary? Remove existing entry if it exists. - // TODO: clear the whole list when a request for data is made - if (group_list) - { - S32 index = group_list->getItemIndex(group_id); - if ( index >= 0 ) - { - group_list->deleteSingleItem(index); - } - } - - LLSD row; - row["id"] = group_id; - row["columns"][0]["value"] = group_string; - row["columns"][0]["font"] = "SANSSERIF_SMALL"; - if (group_list) - { - group_list->addElement(row); - } - } - } - if(group_list) group_list->sortByColumnIndex(0, TRUE); - } + updateData(); } -// Don't enable the OK button until you actually have the data. -// Otherwise you will write blanks back into the database. -void LLPanelAvatar::enableOKIfReady() +LLPanelAvatarNotes::LLPanelAvatarNotes(const Params& params) +: LLPanelProfileTab(params) { - if(mHaveProperties && childIsVisible("OK")) - { - childSetEnabled("OK", TRUE); - } - else - { - childSetEnabled("OK", FALSE); - } -} - -void LLPanelAvatar::sendAvatarPropertiesUpdate() -{ - llinfos << "Sending avatarinfo update" << llendl; - BOOL allow_publish = FALSE; - BOOL mature = FALSE; - if (LLPanelAvatar::sAllowFirstLife) - { - allow_publish = childGetValue("allow_publish"); - //A profile should never be mature. - mature = FALSE; - } - U32 want_to_mask = 0x0; - U32 skills_mask = 0x0; - std::string want_to_text; - std::string skills_text; - std::string languages_text; - mPanelAdvanced->getWantSkills(&want_to_mask, want_to_text, &skills_mask, skills_text, languages_text); - - LLUUID first_life_image_id; - std::string first_life_about_text; - if (mPanelFirstLife) - { - first_life_about_text = mPanelFirstLife->childGetValue("about").asString(); - LLTextureCtrl* image_ctrl = mPanelFirstLife->getChild<LLTextureCtrl>("img"); - if(image_ctrl) - { - first_life_image_id = image_ctrl->getImageAssetID(); - } - } - - std::string about_text = mPanelSecondLife->childGetValue("about").asString(); - - LLMessageSystem *msg = gMessageSystem; - msg->newMessageFast(_PREHASH_AvatarPropertiesUpdate); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast( _PREHASH_AgentID, gAgent.getID() ); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() ); - msg->nextBlockFast(_PREHASH_PropertiesData); - - LLTextureCtrl* image_ctrl = mPanelSecondLife->getChild<LLTextureCtrl>("img"); - if(image_ctrl) - { - msg->addUUIDFast( _PREHASH_ImageID, image_ctrl->getImageAssetID()); - } - else - { - msg->addUUIDFast( _PREHASH_ImageID, LLUUID::null); - } -// msg->addUUIDFast( _PREHASH_ImageID, mPanelSecondLife->mimage_ctrl->getImageAssetID() ); - msg->addUUIDFast( _PREHASH_FLImageID, first_life_image_id); - msg->addStringFast( _PREHASH_AboutText, about_text); - msg->addStringFast( _PREHASH_FLAboutText, first_life_about_text); - - msg->addBOOL("AllowPublish", allow_publish); - msg->addBOOL("MaturePublish", mature); - msg->addString("ProfileURL", mPanelWeb->childGetText("url_edit")); - gAgent.sendReliableMessage(); - - msg->newMessage("AvatarInterestsUpdate"); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast( _PREHASH_AgentID, gAgent.getID() ); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() ); - msg->nextBlockFast(_PREHASH_PropertiesData); - msg->addU32Fast( _PREHASH_WantToMask, want_to_mask); - msg->addStringFast( _PREHASH_WantToText, want_to_text); - msg->addU32Fast( _PREHASH_SkillsMask, skills_mask); - msg->addStringFast( _PREHASH_SkillsText, skills_text); - msg->addString( "LanguagesText", languages_text); - gAgent.sendReliableMessage(); } -void LLPanelAvatar::selectTab(S32 tabnum) +LLPanelAvatarNotes::~LLPanelAvatarNotes() { - if(mTab) + if(getAvatarId().notNull()) { - mTab->selectTab(tabnum); + LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(),this); } } -void LLPanelAvatar::selectTabByName(std::string tab_name) +void* LLPanelAvatarNotes::create(void* data) { - if (mTab) + if(data) { - if (tab_name.empty()) - { - mTab->selectFirstTab(); - } - else - { - mTab->selectTabByName(tab_name); - } + LLSD* id = static_cast<LLSD*>(data); + return new LLPanelAvatarNotes(LLUUID(id->asUUID())); } + return new LLPanelAvatarNotes(); } - -void LLPanelAvatar::processAvatarNotesReply(LLMessageSystem *msg, void**) +void LLPanelAvatarNotes::updateData() { - // extract the agent id - LLUUID agent_id; - msg->getUUID("AgentData", "AgentID", agent_id); - - LLUUID target_id; - msg->getUUID("Data", "TargetID", target_id); + LLAvatarPropertiesProcessor::getInstance()->sendDataRequest(getAvatarId(),APT_NOTES); - // look up all panels which have this avatar - for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter) + const LLRelationship* relation = LLAvatarTracker::instance().getBuddyInfo(getAvatarId()); + if(relation) { - LLPanelAvatar* self = *iter; - if (self->mAvatarID != target_id) - { - continue; - } - - std::string text; - msg->getString("Data", "Notes", text); - self->childSetValue("notes edit", text); - self->childSetEnabled("notes edit", true); - self->mHaveNotes = true; - self->mLastNotes = text; - } -} - - -void LLPanelAvatar::processAvatarClassifiedReply(LLMessageSystem *msg, void** userdata) -{ - LLUUID agent_id; - LLUUID target_id; - - msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id); - msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_TargetID, target_id); + childSetEnabled("status_check",TRUE); + childSetEnabled("map_check",TRUE); + childSetEnabled("objects_check",TRUE); - // look up all panels which have this avatar target - for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter) - { - LLPanelAvatar* self = *iter; - if (self->mAvatarID != target_id) - { - continue; - } + S32 rights = relation->getRightsGrantedTo(); - self->mPanelClassified->processAvatarClassifiedReply(msg, userdata); + childSetValue("status_check",LLRelationship::GRANT_ONLINE_STATUS & rights ? TRUE : FALSE); + childSetValue("map_check",LLRelationship::GRANT_MAP_LOCATION & rights ? TRUE : FALSE); + childSetValue("objects_check",LLRelationship::GRANT_MODIFY_OBJECTS & rights ? TRUE : FALSE); } } -void LLPanelAvatar::processAvatarPicksReply(LLMessageSystem *msg, void** userdata) +BOOL LLPanelAvatarNotes::postBuild() { - LLUUID agent_id; - LLUUID target_id; + childSetCommitCallback("status_check",boost::bind(&LLPanelAvatarNotes::onCommitRights,this),NULL); + childSetCommitCallback("map_check",boost::bind(&LLPanelAvatarNotes::onCommitRights,this),NULL); + childSetCommitCallback("objects_check",boost::bind(&LLPanelAvatarNotes::onCommitRights,this),NULL); - msg->getUUID("AgentData", "AgentID", agent_id); - msg->getUUID("AgentData", "TargetID", target_id); + childSetCommitCallback("add_friend",(boost::bind(&LLPanelAvatarProfile::onAddFriend,this)),NULL); + childSetCommitCallback("im",(boost::bind(&LLPanelAvatarProfile::onIM,this)),NULL); +// childSetCommitCallback("call",(boost::bind(&LLPanelAvatarProfile::onCallButtonClick,this))); + childSetCommitCallback("teleport",(boost::bind(&LLPanelAvatarProfile::onTeleport,this)),NULL); +// childSetCommitCallback("share",(boost::bind(&LLPanelAvatarProfile::onShareButtonClick,this))); - // look up all panels which have this avatar target - for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter) + LLTextEditor* te = getChild<LLTextEditor>("notes_edit",TRUE,FALSE); + if(te) { - LLPanelAvatar* self = *iter; - if (self->mAvatarID != target_id) - { - continue; - } - - self->mPanelPicks->processAvatarPicksReply(msg, userdata); + te->setCommitCallback(boost::bind(&LLPanelAvatarNotes::onCommitNotes,this)); + te->setCommitOnFocusLost(TRUE); } -} - -// static -void LLPanelAvatar::onClickKick(void* userdata) -{ - LLPanelAvatar* self = (LLPanelAvatar*) userdata; - S32 left, top; - gFloaterView->getNewFloaterPosition(&left, &top); - LLRect rect(left, top, left+400, top-300); - - LLSD payload; - payload["avatar_id"] = self->mAvatarID; - LLNotifications::instance().add("KickUser", LLSD(), payload, finishKick); + return TRUE; } -//static -bool LLPanelAvatar::finishKick(const LLSD& notification, const LLSD& response) +void LLPanelAvatarNotes::onCommitNotes() { - S32 option = LLNotification::getSelectedOption(notification, response); - - if (option == 0) - { - LLUUID avatar_id = notification["payload"]["avatar_id"].asUUID(); - LLMessageSystem* msg = gMessageSystem; - - msg->newMessageFast(_PREHASH_GodKickUser); - msg->nextBlockFast(_PREHASH_UserInfo); - msg->addUUIDFast(_PREHASH_GodID, gAgent.getID() ); - msg->addUUIDFast(_PREHASH_GodSessionID, gAgent.getSessionID()); - msg->addUUIDFast(_PREHASH_AgentID, avatar_id ); - msg->addU32("KickFlags", KICK_FLAGS_DEFAULT ); - msg->addStringFast(_PREHASH_Reason, response["message"].asString() ); - gAgent.sendReliableMessage(); - } - return false; + std::string notes = childGetValue("notes_edit").asString(); + LLAvatarPropertiesProcessor::getInstance()-> sendNotes(getAvatarId(),notes); } -// static -void LLPanelAvatar::onClickFreeze(void* userdata) +void LLPanelAvatarNotes::onCommitRights() { - LLPanelAvatar* self = (LLPanelAvatar*) userdata; - LLSD payload; - payload["avatar_id"] = self->mAvatarID; - LLNotifications::instance().add("FreezeUser", LLSD(), payload, LLPanelAvatar::finishFreeze); -} + S32 rights = 0; -// static -bool LLPanelAvatar::finishFreeze(const LLSD& notification, const LLSD& response) -{ - S32 option = LLNotification::getSelectedOption(notification, response); + if(childGetValue("status_check").asBoolean()) + rights |= LLRelationship::GRANT_ONLINE_STATUS; + if(childGetValue("map_check").asBoolean()) + rights |= LLRelationship::GRANT_MAP_LOCATION; + if(childGetValue("objects_check").asBoolean()) + rights |= LLRelationship::GRANT_MODIFY_OBJECTS; - if (option == 0) - { - LLUUID avatar_id = notification["payload"]["avatar_id"].asUUID(); - LLMessageSystem* msg = gMessageSystem; - - msg->newMessageFast(_PREHASH_GodKickUser); - msg->nextBlockFast(_PREHASH_UserInfo); - msg->addUUIDFast(_PREHASH_GodID, gAgent.getID() ); - msg->addUUIDFast(_PREHASH_GodSessionID, gAgent.getSessionID()); - msg->addUUIDFast(_PREHASH_AgentID, avatar_id ); - msg->addU32("KickFlags", KICK_FLAGS_FREEZE ); - msg->addStringFast(_PREHASH_Reason, response["message"].asString() ); - gAgent.sendReliableMessage(); - } - return false; + LLAvatarPropertiesProcessor::getInstance()->sendFriendRights(getAvatarId(),rights); } -// static -void LLPanelAvatar::onClickUnfreeze(void* userdata) +void LLPanelAvatarNotes::clear() { - LLPanelAvatar* self = (LLPanelAvatar*) userdata; - LLSD payload; - payload["avatar_id"] = self->mAvatarID; - LLNotifications::instance().add("UnFreezeUser", LLSD(), payload, LLPanelAvatar::finishUnfreeze); -} + childSetValue("notes_edit",LLStringUtil::null); -// static -bool LLPanelAvatar::finishUnfreeze(const LLSD& notification, const LLSD& response) -{ - S32 option = LLNotification::getSelectedOption(notification, response); - std::string text = response["message"].asString(); - if (option == 0) - { - LLUUID avatar_id = notification["payload"]["avatar_id"].asUUID(); - LLMessageSystem* msg = gMessageSystem; - - msg->newMessageFast(_PREHASH_GodKickUser); - msg->nextBlockFast(_PREHASH_UserInfo); - msg->addUUIDFast(_PREHASH_GodID, gAgent.getID() ); - msg->addUUIDFast(_PREHASH_GodSessionID, gAgent.getSessionID()); - msg->addUUIDFast(_PREHASH_AgentID, avatar_id ); - msg->addU32("KickFlags", KICK_FLAGS_UNFREEZE ); - msg->addStringFast(_PREHASH_Reason, text ); - gAgent.sendReliableMessage(); - } - return false; + childSetEnabled("status_check",FALSE); + childSetEnabled("map_check",FALSE); + childSetEnabled("objects_check",FALSE); } -// static -void LLPanelAvatar::onClickCSR(void* userdata) +void LLPanelAvatarNotes::processProperties(void* data, EAvatarProcessorType type) { - LLPanelAvatar* self = (LLPanelAvatar*)userdata; - if (!self) return; - - LLNameEditor* name_edit = self->getChild<LLNameEditor>("name"); - if (!name_edit) return; - - std::string name = name_edit->getText(); - if (name.empty()) return; - - std::string url = "http://csr.lindenlab.com/agent/"; - - // slow and stupid, but it's late - S32 len = name.length(); - for (S32 i = 0; i < len; i++) + if(APT_NOTES == type) { - if (name[i] == ' ') + LLAvatarNotes* avatar_notes = static_cast<LLAvatarNotes*>(data); + if(avatar_notes && getAvatarId() == avatar_notes->target_id) { - url += "%20"; - } - else - { - url += name[i]; + childSetValue("notes_edit",avatar_notes->notes); + childSetEnabled("notes edit", true); + + LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(),this); } } - - LLWeb::loadURL(url); -} - - -void* LLPanelAvatar::createPanelAvatarSecondLife(void* data) -{ - LLPanelAvatar* self = (LLPanelAvatar*)data; - self->mPanelSecondLife = new LLPanelAvatarSecondLife(std::string("2nd Life"),LLRect(),self); - return self->mPanelSecondLife; -} - -void* LLPanelAvatar::createPanelAvatarWeb(void* data) -{ - LLPanelAvatar* self = (LLPanelAvatar*)data; - self->mPanelWeb = new LLPanelAvatarWeb(std::string("Web"),LLRect(),self); - return self->mPanelWeb; -} - -void* LLPanelAvatar::createPanelAvatarInterests(void* data) -{ - LLPanelAvatar* self = (LLPanelAvatar*)data; - self->mPanelAdvanced = new LLPanelAvatarAdvanced(std::string("Interests"),LLRect(),self); - return self->mPanelAdvanced; -} - - -void* LLPanelAvatar::createPanelAvatarPicks(void* data) -{ - LLPanelAvatar* self = (LLPanelAvatar*)data; - self->mPanelPicks = new LLPanelAvatarPicks(std::string("Picks"),LLRect(),self); - return self->mPanelPicks; -} - -void* LLPanelAvatar::createPanelAvatarClassified(void* data) -{ - LLPanelAvatar* self = (LLPanelAvatar*)data; - self->mPanelClassified = new LLPanelAvatarClassified(std::string("Classified"),LLRect(),self); - return self->mPanelClassified; -} - -void* LLPanelAvatar::createPanelAvatarFirstLife(void* data) -{ - LLPanelAvatar* self = (LLPanelAvatar*)data; - self->mPanelFirstLife = new LLPanelAvatarFirstLife(std::string("1st Life"), LLRect(), self); - return self->mPanelFirstLife; -} - -void* LLPanelAvatar::createPanelAvatarNotes(void* data) -{ - LLPanelAvatar* self = (LLPanelAvatar*)data; - self->mPanelNotes = new LLPanelAvatarNotes(std::string("My Notes"),LLRect(),self); - return self->mPanelNotes; } |