diff options
Diffstat (limited to 'indra/newview/llpanelgroupgeneral.cpp')
-rw-r--r-- | indra/newview/llpanelgroupgeneral.cpp | 1492 |
1 files changed, 746 insertions, 746 deletions
diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp index e4635bdc81..ca429ae2f8 100644 --- a/indra/newview/llpanelgroupgeneral.cpp +++ b/indra/newview/llpanelgroupgeneral.cpp @@ -1,746 +1,746 @@ -/**
- * @file llpanelgroupgeneral.cpp
- * @brief General information about a group.
- *
- * $LicenseInfo:firstyear=2006&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llpanelgroupgeneral.h"
-
-#include "llavatarnamecache.h"
-#include "llagent.h"
-#include "llagentbenefits.h"
-#include "llsdparam.h"
-#include "lluictrlfactory.h"
-#include "roles_constants.h"
-
-// UI elements
-#include "llbutton.h"
-#include "llcheckboxctrl.h"
-#include "llcombobox.h"
-#include "lldbstrings.h"
-#include "llavataractions.h"
-#include "llgroupactions.h"
-#include "lllineeditor.h"
-#include "llnamelistctrl.h"
-#include "llnotificationsutil.h"
-#include "llscrolllistitem.h"
-#include "llspinctrl.h"
-#include "llslurl.h"
-#include "lltextbox.h"
-#include "lltexteditor.h"
-#include "lltexturectrl.h"
-#include "lltrans.h"
-#include "llviewerwindow.h"
-
-static LLPanelInjector<LLPanelGroupGeneral> t_panel_group_general("panel_group_general");
-
-// consts
-const S32 MATURE_CONTENT = 1;
-const S32 NON_MATURE_CONTENT = 2;
-const S32 DECLINE_TO_STATE = 0;
-
-
-LLPanelGroupGeneral::LLPanelGroupGeneral()
-: LLPanelGroupTab(),
- mChanged(false),
- mFirstUse(true),
- mGroupNameEditor(NULL),
- mFounderName(NULL),
- mInsignia(NULL),
- mEditCharter(NULL),
- mCtrlShowInGroupList(NULL),
- mComboMature(NULL),
- mCtrlOpenEnrollment(NULL),
- mCtrlEnrollmentFee(NULL),
- mSpinEnrollmentFee(NULL),
- mCtrlReceiveNotices(NULL),
- mCtrlListGroup(NULL),
- mActiveTitleLabel(NULL),
- mComboActiveTitle(NULL)
-{
-
-}
-
-LLPanelGroupGeneral::~LLPanelGroupGeneral()
-{
-}
-
-bool LLPanelGroupGeneral::postBuild()
-{
- constexpr bool recurse = true;
-
- mEditCharter = getChild<LLTextEditor>("charter", recurse);
- if(mEditCharter)
- {
- mEditCharter->setCommitCallback(onCommitAny, this);
- mEditCharter->setFocusReceivedCallback(boost::bind(onFocusEdit, _1, this));
- mEditCharter->setFocusChangedCallback(boost::bind(onFocusEdit, _1, this));
- mEditCharter->setContentTrusted(false);
- }
-
- // Options
- mCtrlShowInGroupList = getChild<LLCheckBoxCtrl>("show_in_group_list", recurse);
- if (mCtrlShowInGroupList)
- {
- mCtrlShowInGroupList->setCommitCallback(onCommitAny, this);
- }
-
- mComboMature = getChild<LLComboBox>("group_mature_check", recurse);
- if(mComboMature)
- {
- mComboMature->setCurrentByIndex(0);
- mComboMature->setCommitCallback(onCommitAny, this);
- if (gAgent.isTeen())
- {
- // Teens don't get to set mature flag. JC
- mComboMature->setVisible(false);
- mComboMature->setCurrentByIndex(NON_MATURE_CONTENT);
- }
- }
- mCtrlOpenEnrollment = getChild<LLCheckBoxCtrl>("open_enrollement", recurse);
- if (mCtrlOpenEnrollment)
- {
- mCtrlOpenEnrollment->setCommitCallback(onCommitAny, this);
- }
-
- mCtrlEnrollmentFee = getChild<LLCheckBoxCtrl>("check_enrollment_fee", recurse);
- if (mCtrlEnrollmentFee)
- {
- mCtrlEnrollmentFee->setCommitCallback(onCommitEnrollment, this);
- }
-
- mSpinEnrollmentFee = getChild<LLSpinCtrl>("spin_enrollment_fee", recurse);
- if (mSpinEnrollmentFee)
- {
- mSpinEnrollmentFee->setCommitCallback(onCommitAny, this);
- mSpinEnrollmentFee->setPrecision(0);
- mSpinEnrollmentFee->resetDirty();
- }
-
- bool accept_notices = false;
- bool list_in_profile = false;
- LLGroupData data;
- if(gAgent.getGroupData(mGroupID,data))
- {
- accept_notices = data.mAcceptNotices;
- list_in_profile = data.mListInProfile;
- }
- mCtrlReceiveNotices = getChild<LLCheckBoxCtrl>("receive_notices", recurse);
- if (mCtrlReceiveNotices)
- {
- mCtrlReceiveNotices->setCommitCallback(onCommitUserOnly, this);
- mCtrlReceiveNotices->set(accept_notices);
- mCtrlReceiveNotices->setEnabled(data.mID.notNull());
- }
-
- mCtrlListGroup = getChild<LLCheckBoxCtrl>("list_groups_in_profile", recurse);
- if (mCtrlListGroup)
- {
- mCtrlListGroup->setCommitCallback(onCommitUserOnly, this);
- mCtrlListGroup->set(list_in_profile);
- mCtrlListGroup->setEnabled(data.mID.notNull());
- mCtrlListGroup->resetDirty();
- }
-
- mActiveTitleLabel = getChild<LLTextBox>("active_title_label", recurse);
-
- mComboActiveTitle = getChild<LLComboBox>("active_title", recurse);
- if (mComboActiveTitle)
- {
- mComboActiveTitle->setCommitCallback(onCommitAny, this);
- }
-
- mIncompleteMemberDataStr = getString("incomplete_member_data_str");
-
- // If the group_id is null, then we are creating a new group
- if (mGroupID.isNull())
- {
- mEditCharter->setEnabled(true);
-
- mCtrlShowInGroupList->setEnabled(true);
- mComboMature->setEnabled(true);
- mCtrlOpenEnrollment->setEnabled(true);
- mCtrlEnrollmentFee->setEnabled(true);
- mSpinEnrollmentFee->setEnabled(true);
-
- }
-
- return LLPanelGroupTab::postBuild();
-}
-
-void LLPanelGroupGeneral::setupCtrls(LLPanel* panel_group)
-{
- mInsignia = getChild<LLTextureCtrl>("insignia");
- if (mInsignia)
- {
- mInsignia->setCommitCallback(onCommitAny, this);
- mInsignia->setAllowLocalTexture(false);
- }
- mFounderName = getChild<LLTextBox>("founder_name");
-
-
- mGroupNameEditor = panel_group->getChild<LLLineEditor>("group_name_editor");
- mGroupNameEditor->setPrevalidate( LLTextValidate::validateASCIINoLeadingSpace );
-
-
-}
-
-// static
-void LLPanelGroupGeneral::onFocusEdit(LLFocusableElement* ctrl, void* data)
-{
- LLPanelGroupGeneral* self = (LLPanelGroupGeneral*)data;
- self->updateChanged();
- self->notifyObservers();
-}
-
-// static
-void LLPanelGroupGeneral::onCommitAny(LLUICtrl* ctrl, void* data)
-{
- LLPanelGroupGeneral* self = (LLPanelGroupGeneral*)data;
- self->updateChanged();
- self->notifyObservers();
-}
-
-// static
-void LLPanelGroupGeneral::onCommitUserOnly(LLUICtrl* ctrl, void* data)
-{
- LLPanelGroupGeneral* self = (LLPanelGroupGeneral*)data;
- self->mChanged = true;
- self->notifyObservers();
-}
-
-
-// static
-void LLPanelGroupGeneral::onCommitEnrollment(LLUICtrl* ctrl, void* data)
-{
- onCommitAny(ctrl, data);
-
- LLPanelGroupGeneral* self = (LLPanelGroupGeneral*)data;
- // Make sure both enrollment related widgets are there.
- if (!self->mCtrlEnrollmentFee || !self->mSpinEnrollmentFee)
- {
- return;
- }
-
- // Make sure the agent can change enrollment info.
- if (!gAgent.hasPowerInGroup(self->mGroupID,GP_MEMBER_OPTIONS)
- || !self->mAllowEdit)
- {
- return;
- }
-
- if (self->mCtrlEnrollmentFee->get())
- {
- self->mSpinEnrollmentFee->setEnabled(true);
- }
- else
- {
- self->mSpinEnrollmentFee->setEnabled(false);
- self->mSpinEnrollmentFee->set(0);
- }
-}
-
-// static
-void LLPanelGroupGeneral::onClickInfo(void *userdata)
-{
- LLPanelGroupGeneral *self = (LLPanelGroupGeneral *)userdata;
-
- if ( !self ) return;
-
- LL_DEBUGS() << "open group info: " << self->mGroupID << LL_ENDL;
-
- LLGroupActions::show(self->mGroupID);
-
-}
-
-bool LLPanelGroupGeneral::needsApply(std::string& mesg)
-{
- updateChanged();
- mesg = getString("group_info_unchanged");
- return mChanged || mGroupID.isNull();
-}
-
-void LLPanelGroupGeneral::activate()
-{
- LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
- if (mGroupID.notNull()
- && (!gdatap || mFirstUse))
- {
- LLGroupMgr::getInstance()->sendGroupTitlesRequest(mGroupID);
- LLGroupMgr::getInstance()->sendGroupPropertiesRequest(mGroupID);
-
- mFirstUse = false;
- }
- mChanged = false;
-
- update(GC_ALL);
-}
-
-void LLPanelGroupGeneral::draw()
-{
- LLPanelGroupTab::draw();
-}
-
-bool LLPanelGroupGeneral::apply(std::string& mesg)
-{
- if (mGroupID.isNull())
- {
- return false;
- }
-
- if (!mGroupID.isNull() && mAllowEdit && mComboActiveTitle && mComboActiveTitle->isDirty())
- {
- LLGroupMgr::getInstance()->sendGroupTitleUpdate(mGroupID,mComboActiveTitle->getCurrentID());
- update(GC_TITLES);
- mComboActiveTitle->resetDirty();
- }
-
- bool has_power_in_group = gAgent.hasPowerInGroup(mGroupID,GP_GROUP_CHANGE_IDENTITY);
-
- if (has_power_in_group)
- {
- LL_INFOS() << "LLPanelGroupGeneral::apply" << LL_ENDL;
-
- // Check to make sure mature has been set
- if(mComboMature &&
- mComboMature->getCurrentIndex() == DECLINE_TO_STATE)
- {
- LLNotificationsUtil::add("SetGroupMature", LLSD(), LLSD(),
- boost::bind(&LLPanelGroupGeneral::confirmMatureApply, this, _1, _2));
- return false;
- }
-
- LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
- if (!gdatap)
- {
- mesg = LLTrans::getString("NoGroupDataFound");
- mesg.append(mGroupID.asString());
- return false;
- }
- bool can_change_ident = false;
- bool can_change_member_opts = false;
- can_change_ident = gAgent.hasPowerInGroup(mGroupID,GP_GROUP_CHANGE_IDENTITY);
- can_change_member_opts = gAgent.hasPowerInGroup(mGroupID,GP_MEMBER_OPTIONS);
-
- if (can_change_ident)
- {
- if (mEditCharter) gdatap->mCharter = mEditCharter->getText();
- if (mInsignia) gdatap->mInsigniaID = mInsignia->getImageAssetID();
- if (mComboMature)
- {
- if (!gAgent.isTeen())
- {
- gdatap->mMaturePublish =
- mComboMature->getCurrentIndex() == MATURE_CONTENT;
- }
- else
- {
- gdatap->mMaturePublish = false;
- }
- }
- if (mCtrlShowInGroupList) gdatap->mShowInList = mCtrlShowInGroupList->get();
- }
-
- if (can_change_member_opts)
- {
- if (mCtrlOpenEnrollment) gdatap->mOpenEnrollment = mCtrlOpenEnrollment->get();
- if (mCtrlEnrollmentFee && mSpinEnrollmentFee)
- {
- gdatap->mMembershipFee = (mCtrlEnrollmentFee->get()) ?
- (S32) mSpinEnrollmentFee->get() : 0;
- // Set to the used value, and reset initial value used for isdirty check
- mSpinEnrollmentFee->set( (F32)gdatap->mMembershipFee );
- }
- }
-
- if (can_change_ident || can_change_member_opts)
- {
- LLGroupMgr::getInstance()->sendUpdateGroupInfo(mGroupID);
- }
- }
-
- bool receive_notices = false;
- bool list_in_profile = false;
- if (mCtrlReceiveNotices)
- receive_notices = mCtrlReceiveNotices->get();
- if (mCtrlListGroup)
- list_in_profile = mCtrlListGroup->get();
-
- gAgent.setUserGroupFlags(mGroupID, receive_notices, list_in_profile);
-
- resetDirty();
-
- mChanged = false;
-
- return true;
-}
-
-void LLPanelGroupGeneral::cancel()
-{
- mChanged = false;
-
- //cancel out all of the click changes to, although since we are
- //shifting tabs or closing the floater, this need not be done...yet
- notifyObservers();
-}
-
-// invoked from callbackConfirmMature
-bool LLPanelGroupGeneral::confirmMatureApply(const LLSD& notification, const LLSD& response)
-{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
- // 0 == Yes
- // 1 == No
- // 2 == Cancel
- switch(option)
- {
- case 0:
- mComboMature->setCurrentByIndex(MATURE_CONTENT);
- break;
- case 1:
- mComboMature->setCurrentByIndex(NON_MATURE_CONTENT);
- break;
- default:
- return false;
- }
-
- // If we got here it means they set a valid value
- std::string mesg = "";
- bool ret = apply(mesg);
- if ( !mesg.empty() )
- {
- LLSD args;
- args["MESSAGE"] = mesg;
- LLNotificationsUtil::add("GenericAlert", args);
- }
-
- return ret;
-}
-
-// virtual
-void LLPanelGroupGeneral::update(LLGroupChange gc)
-{
- if (mGroupID.isNull()) return;
-
- LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
-
- if (!gdatap) return;
-
- LLGroupData agent_gdatap;
- bool is_member = false;
- if (gAgent.getGroupData(mGroupID,agent_gdatap)) is_member = true;
-
- if (mComboActiveTitle)
- {
- mComboActiveTitle->setVisible(is_member);
- mComboActiveTitle->setEnabled(mAllowEdit);
-
- if ( mActiveTitleLabel) mActiveTitleLabel->setVisible(is_member);
-
- if (is_member)
- {
- LLUUID current_title_role;
-
- mComboActiveTitle->clear();
- mComboActiveTitle->removeall();
- bool has_selected_title = false;
-
- if (1 == gdatap->mTitles.size())
- {
- // Only the everyone title. Don't bother letting them try changing this.
- mComboActiveTitle->setEnabled(false);
- }
- else
- {
- mComboActiveTitle->setEnabled(true);
- }
-
- std::vector<LLGroupTitle>::const_iterator citer = gdatap->mTitles.begin();
- std::vector<LLGroupTitle>::const_iterator end = gdatap->mTitles.end();
-
- for ( ; citer != end; ++citer)
- {
- mComboActiveTitle->add(citer->mTitle,citer->mRoleID, (citer->mSelected ? ADD_TOP : ADD_BOTTOM));
- if (citer->mSelected)
- {
- mComboActiveTitle->setCurrentByID(citer->mRoleID);
- has_selected_title = true;
- }
- }
-
- if (!has_selected_title)
- {
- mComboActiveTitle->setCurrentByID(LLUUID::null);
- }
- }
-
- }
-
- // After role member data was changed in Roles->Members
- // need to update role titles. See STORM-918.
- if (gc == GC_ROLE_MEMBER_DATA)
- LLGroupMgr::getInstance()->sendGroupTitlesRequest(mGroupID);
-
- // If this was just a titles update, we are done.
- if (gc == GC_TITLES) return;
-
- bool can_change_ident = false;
- bool can_change_member_opts = false;
- can_change_ident = gAgent.hasPowerInGroup(mGroupID,GP_GROUP_CHANGE_IDENTITY);
- can_change_member_opts = gAgent.hasPowerInGroup(mGroupID,GP_MEMBER_OPTIONS);
-
- if (mCtrlShowInGroupList)
- {
- mCtrlShowInGroupList->set(gdatap->mShowInList);
- mCtrlShowInGroupList->setEnabled(mAllowEdit && can_change_ident);
- }
- if (mComboMature)
- {
- if(gdatap->mMaturePublish)
- {
- mComboMature->setCurrentByIndex(MATURE_CONTENT);
- }
- else
- {
- mComboMature->setCurrentByIndex(NON_MATURE_CONTENT);
- }
- mComboMature->setEnabled(mAllowEdit && can_change_ident);
- mComboMature->setVisible( !gAgent.isTeen() );
- }
- if (mCtrlOpenEnrollment)
- {
- mCtrlOpenEnrollment->set(gdatap->mOpenEnrollment);
- mCtrlOpenEnrollment->setEnabled(mAllowEdit && can_change_member_opts);
- }
- if (mCtrlEnrollmentFee)
- {
- mCtrlEnrollmentFee->set(gdatap->mMembershipFee > 0);
- mCtrlEnrollmentFee->setEnabled(mAllowEdit && can_change_member_opts);
- }
-
- if (mSpinEnrollmentFee)
- {
- S32 fee = gdatap->mMembershipFee;
- mSpinEnrollmentFee->set((F32)fee);
- mSpinEnrollmentFee->setEnabled( mAllowEdit &&
- (fee > 0) &&
- can_change_member_opts);
- }
- if (mCtrlReceiveNotices)
- {
- mCtrlReceiveNotices->setVisible(is_member);
- if (is_member)
- {
- mCtrlReceiveNotices->setEnabled(mAllowEdit);
- }
- }
-
-
- if (mInsignia) mInsignia->setEnabled(mAllowEdit && can_change_ident);
- if (mEditCharter) mEditCharter->setEnabled(mAllowEdit && can_change_ident);
-
- if (mGroupNameEditor) mGroupNameEditor->setVisible(false);
- if (mFounderName) mFounderName->setText(LLSLURL("agent", gdatap->mFounderID, "inspect").getSLURLString());
- if (mInsignia)
- {
- if (gdatap->mInsigniaID.notNull())
- {
- mInsignia->setImageAssetID(gdatap->mInsigniaID);
- }
- else
- {
- mInsignia->setImageAssetName(mInsignia->getDefaultImageName());
- }
- }
-
- if (mEditCharter)
- {
- mEditCharter->setParseURLs(!mAllowEdit || !can_change_ident);
- mEditCharter->setText(gdatap->mCharter);
- }
-
- resetDirty();
-}
-
-void LLPanelGroupGeneral::updateChanged()
-{
- // List all the controls we want to check for changes...
- LLUICtrl *check_list[] =
- {
- mGroupNameEditor,
- mFounderName,
- mInsignia,
- mEditCharter,
- mCtrlShowInGroupList,
- mComboMature,
- mCtrlOpenEnrollment,
- mCtrlEnrollmentFee,
- mSpinEnrollmentFee,
- mCtrlReceiveNotices,
- mCtrlListGroup,
- mActiveTitleLabel,
- mComboActiveTitle
- };
-
- mChanged = false;
-
- for( size_t i=0; i<LL_ARRAY_SIZE(check_list); i++ )
- {
- if( check_list[i] && check_list[i]->isDirty() )
- {
- mChanged = true;
- break;
- }
- }
-}
-
-void LLPanelGroupGeneral::reset()
-{
- mFounderName->setVisible(false);
-
-
- mCtrlReceiveNotices->set(false);
-
-
- mCtrlListGroup->set(true);
-
- mCtrlReceiveNotices->setEnabled(false);
- mCtrlReceiveNotices->setVisible(true);
-
- mCtrlListGroup->setEnabled(false);
-
- mGroupNameEditor->setEnabled(true);
- mEditCharter->setEnabled(true);
-
- mCtrlShowInGroupList->setEnabled(false);
- mComboMature->setEnabled(true);
-
- mCtrlOpenEnrollment->setEnabled(true);
-
- mCtrlEnrollmentFee->setEnabled(true);
-
- mSpinEnrollmentFee->setEnabled(true);
- mSpinEnrollmentFee->set((F32)0);
-
- mGroupNameEditor->setVisible(true);
-
- mComboActiveTitle->setVisible(false);
-
- mInsignia->setImageAssetID(LLUUID::null);
-
- mInsignia->setEnabled(true);
-
- mInsignia->setImageAssetName(mInsignia->getDefaultImageName());
-
- {
- std::string empty_str = "";
- mEditCharter->setText(empty_str);
- mGroupNameEditor->setText(empty_str);
- }
-
- {
- mComboMature->setEnabled(true);
- mComboMature->setVisible( !gAgent.isTeen() );
- mComboMature->selectFirstItem();
- }
-
-
- resetDirty();
-}
-
-void LLPanelGroupGeneral::resetDirty()
-{
- // List all the controls we want to check for changes...
- LLUICtrl *check_list[] =
- {
- mGroupNameEditor,
- mFounderName,
- mInsignia,
- mEditCharter,
- mCtrlShowInGroupList,
- mComboMature,
- mCtrlOpenEnrollment,
- mCtrlEnrollmentFee,
- mSpinEnrollmentFee,
- mCtrlReceiveNotices,
- mCtrlListGroup,
- mActiveTitleLabel,
- mComboActiveTitle
- };
-
- for( size_t i=0; i<LL_ARRAY_SIZE(check_list); i++ )
- {
- if( check_list[i] )
- check_list[i]->resetDirty() ;
- }
-
-
-}
-
-void LLPanelGroupGeneral::setGroupID(const LLUUID& id)
-{
- LLPanelGroupTab::setGroupID(id);
-
- if(id == LLUUID::null)
- {
- reset();
- return;
- }
-
- bool accept_notices = false;
- bool list_in_profile = false;
- LLGroupData data;
- if(gAgent.getGroupData(mGroupID,data))
- {
- accept_notices = data.mAcceptNotices;
- list_in_profile = data.mListInProfile;
- }
- mCtrlReceiveNotices = getChild<LLCheckBoxCtrl>("receive_notices");
- if (mCtrlReceiveNotices)
- {
- mCtrlReceiveNotices->set(accept_notices);
- mCtrlReceiveNotices->setEnabled(data.mID.notNull());
- }
-
- mCtrlListGroup = getChild<LLCheckBoxCtrl>("list_groups_in_profile");
- if (mCtrlListGroup)
- {
- mCtrlListGroup->set(list_in_profile);
- mCtrlListGroup->setEnabled(data.mID.notNull());
- }
-
- mCtrlShowInGroupList->setEnabled(data.mID.notNull());
-
- mActiveTitleLabel = getChild<LLTextBox>("active_title_label");
-
- mComboActiveTitle = getChild<LLComboBox>("active_title");
-
- mFounderName->setVisible(true);
-
- mInsignia->setImageAssetID(LLUUID::null);
-
- resetDirty();
-
- activate();
-}
+/** + * @file llpanelgroupgeneral.cpp + * @brief General information about a group. + * + * $LicenseInfo:firstyear=2006&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llpanelgroupgeneral.h" + +#include "llavatarnamecache.h" +#include "llagent.h" +#include "llagentbenefits.h" +#include "llsdparam.h" +#include "lluictrlfactory.h" +#include "roles_constants.h" + +// UI elements +#include "llbutton.h" +#include "llcheckboxctrl.h" +#include "llcombobox.h" +#include "lldbstrings.h" +#include "llavataractions.h" +#include "llgroupactions.h" +#include "lllineeditor.h" +#include "llnamelistctrl.h" +#include "llnotificationsutil.h" +#include "llscrolllistitem.h" +#include "llspinctrl.h" +#include "llslurl.h" +#include "lltextbox.h" +#include "lltexteditor.h" +#include "lltexturectrl.h" +#include "lltrans.h" +#include "llviewerwindow.h" + +static LLPanelInjector<LLPanelGroupGeneral> t_panel_group_general("panel_group_general"); + +// consts +const S32 MATURE_CONTENT = 1; +const S32 NON_MATURE_CONTENT = 2; +const S32 DECLINE_TO_STATE = 0; + + +LLPanelGroupGeneral::LLPanelGroupGeneral() +: LLPanelGroupTab(), + mChanged(false), + mFirstUse(true), + mGroupNameEditor(NULL), + mFounderName(NULL), + mInsignia(NULL), + mEditCharter(NULL), + mCtrlShowInGroupList(NULL), + mComboMature(NULL), + mCtrlOpenEnrollment(NULL), + mCtrlEnrollmentFee(NULL), + mSpinEnrollmentFee(NULL), + mCtrlReceiveNotices(NULL), + mCtrlListGroup(NULL), + mActiveTitleLabel(NULL), + mComboActiveTitle(NULL) +{ + +} + +LLPanelGroupGeneral::~LLPanelGroupGeneral() +{ +} + +bool LLPanelGroupGeneral::postBuild() +{ + constexpr bool recurse = true; + + mEditCharter = getChild<LLTextEditor>("charter", recurse); + if(mEditCharter) + { + mEditCharter->setCommitCallback(onCommitAny, this); + mEditCharter->setFocusReceivedCallback(boost::bind(onFocusEdit, _1, this)); + mEditCharter->setFocusChangedCallback(boost::bind(onFocusEdit, _1, this)); + mEditCharter->setContentTrusted(false); + } + + // Options + mCtrlShowInGroupList = getChild<LLCheckBoxCtrl>("show_in_group_list", recurse); + if (mCtrlShowInGroupList) + { + mCtrlShowInGroupList->setCommitCallback(onCommitAny, this); + } + + mComboMature = getChild<LLComboBox>("group_mature_check", recurse); + if(mComboMature) + { + mComboMature->setCurrentByIndex(0); + mComboMature->setCommitCallback(onCommitAny, this); + if (gAgent.isTeen()) + { + // Teens don't get to set mature flag. JC + mComboMature->setVisible(false); + mComboMature->setCurrentByIndex(NON_MATURE_CONTENT); + } + } + mCtrlOpenEnrollment = getChild<LLCheckBoxCtrl>("open_enrollement", recurse); + if (mCtrlOpenEnrollment) + { + mCtrlOpenEnrollment->setCommitCallback(onCommitAny, this); + } + + mCtrlEnrollmentFee = getChild<LLCheckBoxCtrl>("check_enrollment_fee", recurse); + if (mCtrlEnrollmentFee) + { + mCtrlEnrollmentFee->setCommitCallback(onCommitEnrollment, this); + } + + mSpinEnrollmentFee = getChild<LLSpinCtrl>("spin_enrollment_fee", recurse); + if (mSpinEnrollmentFee) + { + mSpinEnrollmentFee->setCommitCallback(onCommitAny, this); + mSpinEnrollmentFee->setPrecision(0); + mSpinEnrollmentFee->resetDirty(); + } + + bool accept_notices = false; + bool list_in_profile = false; + LLGroupData data; + if(gAgent.getGroupData(mGroupID,data)) + { + accept_notices = data.mAcceptNotices; + list_in_profile = data.mListInProfile; + } + mCtrlReceiveNotices = getChild<LLCheckBoxCtrl>("receive_notices", recurse); + if (mCtrlReceiveNotices) + { + mCtrlReceiveNotices->setCommitCallback(onCommitUserOnly, this); + mCtrlReceiveNotices->set(accept_notices); + mCtrlReceiveNotices->setEnabled(data.mID.notNull()); + } + + mCtrlListGroup = getChild<LLCheckBoxCtrl>("list_groups_in_profile", recurse); + if (mCtrlListGroup) + { + mCtrlListGroup->setCommitCallback(onCommitUserOnly, this); + mCtrlListGroup->set(list_in_profile); + mCtrlListGroup->setEnabled(data.mID.notNull()); + mCtrlListGroup->resetDirty(); + } + + mActiveTitleLabel = getChild<LLTextBox>("active_title_label", recurse); + + mComboActiveTitle = getChild<LLComboBox>("active_title", recurse); + if (mComboActiveTitle) + { + mComboActiveTitle->setCommitCallback(onCommitAny, this); + } + + mIncompleteMemberDataStr = getString("incomplete_member_data_str"); + + // If the group_id is null, then we are creating a new group + if (mGroupID.isNull()) + { + mEditCharter->setEnabled(true); + + mCtrlShowInGroupList->setEnabled(true); + mComboMature->setEnabled(true); + mCtrlOpenEnrollment->setEnabled(true); + mCtrlEnrollmentFee->setEnabled(true); + mSpinEnrollmentFee->setEnabled(true); + + } + + return LLPanelGroupTab::postBuild(); +} + +void LLPanelGroupGeneral::setupCtrls(LLPanel* panel_group) +{ + mInsignia = getChild<LLTextureCtrl>("insignia"); + if (mInsignia) + { + mInsignia->setCommitCallback(onCommitAny, this); + mInsignia->setAllowLocalTexture(false); + } + mFounderName = getChild<LLTextBox>("founder_name"); + + + mGroupNameEditor = panel_group->getChild<LLLineEditor>("group_name_editor"); + mGroupNameEditor->setPrevalidate( LLTextValidate::validateASCIINoLeadingSpace ); + + +} + +// static +void LLPanelGroupGeneral::onFocusEdit(LLFocusableElement* ctrl, void* data) +{ + LLPanelGroupGeneral* self = (LLPanelGroupGeneral*)data; + self->updateChanged(); + self->notifyObservers(); +} + +// static +void LLPanelGroupGeneral::onCommitAny(LLUICtrl* ctrl, void* data) +{ + LLPanelGroupGeneral* self = (LLPanelGroupGeneral*)data; + self->updateChanged(); + self->notifyObservers(); +} + +// static +void LLPanelGroupGeneral::onCommitUserOnly(LLUICtrl* ctrl, void* data) +{ + LLPanelGroupGeneral* self = (LLPanelGroupGeneral*)data; + self->mChanged = true; + self->notifyObservers(); +} + + +// static +void LLPanelGroupGeneral::onCommitEnrollment(LLUICtrl* ctrl, void* data) +{ + onCommitAny(ctrl, data); + + LLPanelGroupGeneral* self = (LLPanelGroupGeneral*)data; + // Make sure both enrollment related widgets are there. + if (!self->mCtrlEnrollmentFee || !self->mSpinEnrollmentFee) + { + return; + } + + // Make sure the agent can change enrollment info. + if (!gAgent.hasPowerInGroup(self->mGroupID,GP_MEMBER_OPTIONS) + || !self->mAllowEdit) + { + return; + } + + if (self->mCtrlEnrollmentFee->get()) + { + self->mSpinEnrollmentFee->setEnabled(true); + } + else + { + self->mSpinEnrollmentFee->setEnabled(false); + self->mSpinEnrollmentFee->set(0); + } +} + +// static +void LLPanelGroupGeneral::onClickInfo(void *userdata) +{ + LLPanelGroupGeneral *self = (LLPanelGroupGeneral *)userdata; + + if ( !self ) return; + + LL_DEBUGS() << "open group info: " << self->mGroupID << LL_ENDL; + + LLGroupActions::show(self->mGroupID); + +} + +bool LLPanelGroupGeneral::needsApply(std::string& mesg) +{ + updateChanged(); + mesg = getString("group_info_unchanged"); + return mChanged || mGroupID.isNull(); +} + +void LLPanelGroupGeneral::activate() +{ + LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID); + if (mGroupID.notNull() + && (!gdatap || mFirstUse)) + { + LLGroupMgr::getInstance()->sendGroupTitlesRequest(mGroupID); + LLGroupMgr::getInstance()->sendGroupPropertiesRequest(mGroupID); + + mFirstUse = false; + } + mChanged = false; + + update(GC_ALL); +} + +void LLPanelGroupGeneral::draw() +{ + LLPanelGroupTab::draw(); +} + +bool LLPanelGroupGeneral::apply(std::string& mesg) +{ + if (mGroupID.isNull()) + { + return false; + } + + if (!mGroupID.isNull() && mAllowEdit && mComboActiveTitle && mComboActiveTitle->isDirty()) + { + LLGroupMgr::getInstance()->sendGroupTitleUpdate(mGroupID,mComboActiveTitle->getCurrentID()); + update(GC_TITLES); + mComboActiveTitle->resetDirty(); + } + + bool has_power_in_group = gAgent.hasPowerInGroup(mGroupID,GP_GROUP_CHANGE_IDENTITY); + + if (has_power_in_group) + { + LL_INFOS() << "LLPanelGroupGeneral::apply" << LL_ENDL; + + // Check to make sure mature has been set + if(mComboMature && + mComboMature->getCurrentIndex() == DECLINE_TO_STATE) + { + LLNotificationsUtil::add("SetGroupMature", LLSD(), LLSD(), + boost::bind(&LLPanelGroupGeneral::confirmMatureApply, this, _1, _2)); + return false; + } + + LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID); + if (!gdatap) + { + mesg = LLTrans::getString("NoGroupDataFound"); + mesg.append(mGroupID.asString()); + return false; + } + bool can_change_ident = false; + bool can_change_member_opts = false; + can_change_ident = gAgent.hasPowerInGroup(mGroupID,GP_GROUP_CHANGE_IDENTITY); + can_change_member_opts = gAgent.hasPowerInGroup(mGroupID,GP_MEMBER_OPTIONS); + + if (can_change_ident) + { + if (mEditCharter) gdatap->mCharter = mEditCharter->getText(); + if (mInsignia) gdatap->mInsigniaID = mInsignia->getImageAssetID(); + if (mComboMature) + { + if (!gAgent.isTeen()) + { + gdatap->mMaturePublish = + mComboMature->getCurrentIndex() == MATURE_CONTENT; + } + else + { + gdatap->mMaturePublish = false; + } + } + if (mCtrlShowInGroupList) gdatap->mShowInList = mCtrlShowInGroupList->get(); + } + + if (can_change_member_opts) + { + if (mCtrlOpenEnrollment) gdatap->mOpenEnrollment = mCtrlOpenEnrollment->get(); + if (mCtrlEnrollmentFee && mSpinEnrollmentFee) + { + gdatap->mMembershipFee = (mCtrlEnrollmentFee->get()) ? + (S32) mSpinEnrollmentFee->get() : 0; + // Set to the used value, and reset initial value used for isdirty check + mSpinEnrollmentFee->set( (F32)gdatap->mMembershipFee ); + } + } + + if (can_change_ident || can_change_member_opts) + { + LLGroupMgr::getInstance()->sendUpdateGroupInfo(mGroupID); + } + } + + bool receive_notices = false; + bool list_in_profile = false; + if (mCtrlReceiveNotices) + receive_notices = mCtrlReceiveNotices->get(); + if (mCtrlListGroup) + list_in_profile = mCtrlListGroup->get(); + + gAgent.setUserGroupFlags(mGroupID, receive_notices, list_in_profile); + + resetDirty(); + + mChanged = false; + + return true; +} + +void LLPanelGroupGeneral::cancel() +{ + mChanged = false; + + //cancel out all of the click changes to, although since we are + //shifting tabs or closing the floater, this need not be done...yet + notifyObservers(); +} + +// invoked from callbackConfirmMature +bool LLPanelGroupGeneral::confirmMatureApply(const LLSD& notification, const LLSD& response) +{ + S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + // 0 == Yes + // 1 == No + // 2 == Cancel + switch(option) + { + case 0: + mComboMature->setCurrentByIndex(MATURE_CONTENT); + break; + case 1: + mComboMature->setCurrentByIndex(NON_MATURE_CONTENT); + break; + default: + return false; + } + + // If we got here it means they set a valid value + std::string mesg = ""; + bool ret = apply(mesg); + if ( !mesg.empty() ) + { + LLSD args; + args["MESSAGE"] = mesg; + LLNotificationsUtil::add("GenericAlert", args); + } + + return ret; +} + +// virtual +void LLPanelGroupGeneral::update(LLGroupChange gc) +{ + if (mGroupID.isNull()) return; + + LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID); + + if (!gdatap) return; + + LLGroupData agent_gdatap; + bool is_member = false; + if (gAgent.getGroupData(mGroupID,agent_gdatap)) is_member = true; + + if (mComboActiveTitle) + { + mComboActiveTitle->setVisible(is_member); + mComboActiveTitle->setEnabled(mAllowEdit); + + if ( mActiveTitleLabel) mActiveTitleLabel->setVisible(is_member); + + if (is_member) + { + LLUUID current_title_role; + + mComboActiveTitle->clear(); + mComboActiveTitle->removeall(); + bool has_selected_title = false; + + if (1 == gdatap->mTitles.size()) + { + // Only the everyone title. Don't bother letting them try changing this. + mComboActiveTitle->setEnabled(false); + } + else + { + mComboActiveTitle->setEnabled(true); + } + + std::vector<LLGroupTitle>::const_iterator citer = gdatap->mTitles.begin(); + std::vector<LLGroupTitle>::const_iterator end = gdatap->mTitles.end(); + + for ( ; citer != end; ++citer) + { + mComboActiveTitle->add(citer->mTitle,citer->mRoleID, (citer->mSelected ? ADD_TOP : ADD_BOTTOM)); + if (citer->mSelected) + { + mComboActiveTitle->setCurrentByID(citer->mRoleID); + has_selected_title = true; + } + } + + if (!has_selected_title) + { + mComboActiveTitle->setCurrentByID(LLUUID::null); + } + } + + } + + // After role member data was changed in Roles->Members + // need to update role titles. See STORM-918. + if (gc == GC_ROLE_MEMBER_DATA) + LLGroupMgr::getInstance()->sendGroupTitlesRequest(mGroupID); + + // If this was just a titles update, we are done. + if (gc == GC_TITLES) return; + + bool can_change_ident = false; + bool can_change_member_opts = false; + can_change_ident = gAgent.hasPowerInGroup(mGroupID,GP_GROUP_CHANGE_IDENTITY); + can_change_member_opts = gAgent.hasPowerInGroup(mGroupID,GP_MEMBER_OPTIONS); + + if (mCtrlShowInGroupList) + { + mCtrlShowInGroupList->set(gdatap->mShowInList); + mCtrlShowInGroupList->setEnabled(mAllowEdit && can_change_ident); + } + if (mComboMature) + { + if(gdatap->mMaturePublish) + { + mComboMature->setCurrentByIndex(MATURE_CONTENT); + } + else + { + mComboMature->setCurrentByIndex(NON_MATURE_CONTENT); + } + mComboMature->setEnabled(mAllowEdit && can_change_ident); + mComboMature->setVisible( !gAgent.isTeen() ); + } + if (mCtrlOpenEnrollment) + { + mCtrlOpenEnrollment->set(gdatap->mOpenEnrollment); + mCtrlOpenEnrollment->setEnabled(mAllowEdit && can_change_member_opts); + } + if (mCtrlEnrollmentFee) + { + mCtrlEnrollmentFee->set(gdatap->mMembershipFee > 0); + mCtrlEnrollmentFee->setEnabled(mAllowEdit && can_change_member_opts); + } + + if (mSpinEnrollmentFee) + { + S32 fee = gdatap->mMembershipFee; + mSpinEnrollmentFee->set((F32)fee); + mSpinEnrollmentFee->setEnabled( mAllowEdit && + (fee > 0) && + can_change_member_opts); + } + if (mCtrlReceiveNotices) + { + mCtrlReceiveNotices->setVisible(is_member); + if (is_member) + { + mCtrlReceiveNotices->setEnabled(mAllowEdit); + } + } + + + if (mInsignia) mInsignia->setEnabled(mAllowEdit && can_change_ident); + if (mEditCharter) mEditCharter->setEnabled(mAllowEdit && can_change_ident); + + if (mGroupNameEditor) mGroupNameEditor->setVisible(false); + if (mFounderName) mFounderName->setText(LLSLURL("agent", gdatap->mFounderID, "inspect").getSLURLString()); + if (mInsignia) + { + if (gdatap->mInsigniaID.notNull()) + { + mInsignia->setImageAssetID(gdatap->mInsigniaID); + } + else + { + mInsignia->setImageAssetName(mInsignia->getDefaultImageName()); + } + } + + if (mEditCharter) + { + mEditCharter->setParseURLs(!mAllowEdit || !can_change_ident); + mEditCharter->setText(gdatap->mCharter); + } + + resetDirty(); +} + +void LLPanelGroupGeneral::updateChanged() +{ + // List all the controls we want to check for changes... + LLUICtrl *check_list[] = + { + mGroupNameEditor, + mFounderName, + mInsignia, + mEditCharter, + mCtrlShowInGroupList, + mComboMature, + mCtrlOpenEnrollment, + mCtrlEnrollmentFee, + mSpinEnrollmentFee, + mCtrlReceiveNotices, + mCtrlListGroup, + mActiveTitleLabel, + mComboActiveTitle + }; + + mChanged = false; + + for( size_t i=0; i<LL_ARRAY_SIZE(check_list); i++ ) + { + if( check_list[i] && check_list[i]->isDirty() ) + { + mChanged = true; + break; + } + } +} + +void LLPanelGroupGeneral::reset() +{ + mFounderName->setVisible(false); + + + mCtrlReceiveNotices->set(false); + + + mCtrlListGroup->set(true); + + mCtrlReceiveNotices->setEnabled(false); + mCtrlReceiveNotices->setVisible(true); + + mCtrlListGroup->setEnabled(false); + + mGroupNameEditor->setEnabled(true); + mEditCharter->setEnabled(true); + + mCtrlShowInGroupList->setEnabled(false); + mComboMature->setEnabled(true); + + mCtrlOpenEnrollment->setEnabled(true); + + mCtrlEnrollmentFee->setEnabled(true); + + mSpinEnrollmentFee->setEnabled(true); + mSpinEnrollmentFee->set((F32)0); + + mGroupNameEditor->setVisible(true); + + mComboActiveTitle->setVisible(false); + + mInsignia->setImageAssetID(LLUUID::null); + + mInsignia->setEnabled(true); + + mInsignia->setImageAssetName(mInsignia->getDefaultImageName()); + + { + std::string empty_str = ""; + mEditCharter->setText(empty_str); + mGroupNameEditor->setText(empty_str); + } + + { + mComboMature->setEnabled(true); + mComboMature->setVisible( !gAgent.isTeen() ); + mComboMature->selectFirstItem(); + } + + + resetDirty(); +} + +void LLPanelGroupGeneral::resetDirty() +{ + // List all the controls we want to check for changes... + LLUICtrl *check_list[] = + { + mGroupNameEditor, + mFounderName, + mInsignia, + mEditCharter, + mCtrlShowInGroupList, + mComboMature, + mCtrlOpenEnrollment, + mCtrlEnrollmentFee, + mSpinEnrollmentFee, + mCtrlReceiveNotices, + mCtrlListGroup, + mActiveTitleLabel, + mComboActiveTitle + }; + + for( size_t i=0; i<LL_ARRAY_SIZE(check_list); i++ ) + { + if( check_list[i] ) + check_list[i]->resetDirty() ; + } + + +} + +void LLPanelGroupGeneral::setGroupID(const LLUUID& id) +{ + LLPanelGroupTab::setGroupID(id); + + if(id == LLUUID::null) + { + reset(); + return; + } + + bool accept_notices = false; + bool list_in_profile = false; + LLGroupData data; + if(gAgent.getGroupData(mGroupID,data)) + { + accept_notices = data.mAcceptNotices; + list_in_profile = data.mListInProfile; + } + mCtrlReceiveNotices = getChild<LLCheckBoxCtrl>("receive_notices"); + if (mCtrlReceiveNotices) + { + mCtrlReceiveNotices->set(accept_notices); + mCtrlReceiveNotices->setEnabled(data.mID.notNull()); + } + + mCtrlListGroup = getChild<LLCheckBoxCtrl>("list_groups_in_profile"); + if (mCtrlListGroup) + { + mCtrlListGroup->set(list_in_profile); + mCtrlListGroup->setEnabled(data.mID.notNull()); + } + + mCtrlShowInGroupList->setEnabled(data.mID.notNull()); + + mActiveTitleLabel = getChild<LLTextBox>("active_title_label"); + + mComboActiveTitle = getChild<LLComboBox>("active_title"); + + mFounderName->setVisible(true); + + mInsignia->setImageAssetID(LLUUID::null); + + resetDirty(); + + activate(); +} |