diff options
| author | Ansariel <ansariel.hiller@phoenixviewer.com> | 2024-05-22 19:04:52 +0200 |
|---|---|---|
| committer | Ansariel <ansariel.hiller@phoenixviewer.com> | 2024-05-22 19:04:52 +0200 |
| commit | 1b67dd855c41f5a0cda7ec2a68d98071986ca703 (patch) | |
| tree | ab243607f74f78200787bba5b9b88f07ef1b966f /indra/newview/llfloaterland.cpp | |
| parent | 6d6eabca44d08d5b97bfe3e941d2b9687c2246ea (diff) | |
| parent | e1623bb276f83a43ce7a197e388720c05bdefe61 (diff) | |
Merge remote-tracking branch 'origin/main' into DRTVWR-600-maint-A
# Conflicts:
# autobuild.xml
# indra/cmake/CMakeLists.txt
# indra/cmake/GoogleMock.cmake
# indra/llaudio/llaudioengine_fmodstudio.cpp
# indra/llaudio/llaudioengine_fmodstudio.h
# indra/llaudio/lllistener_fmodstudio.cpp
# indra/llaudio/lllistener_fmodstudio.h
# indra/llaudio/llstreamingaudio_fmodstudio.cpp
# indra/llaudio/llstreamingaudio_fmodstudio.h
# indra/llcharacter/llmultigesture.cpp
# indra/llcharacter/llmultigesture.h
# indra/llimage/llimage.cpp
# indra/llimage/llimagepng.cpp
# indra/llimage/llimageworker.cpp
# indra/llimage/tests/llimageworker_test.cpp
# indra/llmessage/tests/llmockhttpclient.h
# indra/llprimitive/llgltfmaterial.h
# indra/llrender/llfontfreetype.cpp
# indra/llui/llcombobox.cpp
# indra/llui/llfolderview.cpp
# indra/llui/llfolderviewmodel.h
# indra/llui/lllineeditor.cpp
# indra/llui/lllineeditor.h
# indra/llui/lltextbase.cpp
# indra/llui/lltextbase.h
# indra/llui/lltexteditor.cpp
# indra/llui/lltextvalidate.cpp
# indra/llui/lltextvalidate.h
# indra/llui/lluictrl.h
# indra/llui/llview.cpp
# indra/llwindow/llwindowmacosx.cpp
# indra/newview/app_settings/settings.xml
# indra/newview/llappearancemgr.cpp
# indra/newview/llappearancemgr.h
# indra/newview/llavatarpropertiesprocessor.cpp
# indra/newview/llavatarpropertiesprocessor.h
# indra/newview/llbreadcrumbview.cpp
# indra/newview/llbreadcrumbview.h
# indra/newview/llbreastmotion.cpp
# indra/newview/llbreastmotion.h
# indra/newview/llconversationmodel.h
# indra/newview/lldensityctrl.cpp
# indra/newview/lldensityctrl.h
# indra/newview/llface.inl
# indra/newview/llfloatereditsky.cpp
# indra/newview/llfloatereditwater.cpp
# indra/newview/llfloateremojipicker.h
# indra/newview/llfloaterimsessiontab.cpp
# indra/newview/llfloaterprofiletexture.cpp
# indra/newview/llfloaterprofiletexture.h
# indra/newview/llgesturemgr.cpp
# indra/newview/llgesturemgr.h
# indra/newview/llimpanel.cpp
# indra/newview/llimpanel.h
# indra/newview/llinventorybridge.cpp
# indra/newview/llinventorybridge.h
# indra/newview/llinventoryclipboard.cpp
# indra/newview/llinventoryclipboard.h
# indra/newview/llinventoryfunctions.cpp
# indra/newview/llinventoryfunctions.h
# indra/newview/llinventorygallery.cpp
# indra/newview/lllistbrowser.cpp
# indra/newview/lllistbrowser.h
# indra/newview/llpanelobjectinventory.cpp
# indra/newview/llpanelprofile.cpp
# indra/newview/llpanelprofile.h
# indra/newview/llpreviewgesture.cpp
# indra/newview/llsavedsettingsglue.cpp
# indra/newview/llsavedsettingsglue.h
# indra/newview/lltooldraganddrop.cpp
# indra/newview/llurllineeditorctrl.cpp
# indra/newview/llvectorperfoptions.cpp
# indra/newview/llvectorperfoptions.h
# indra/newview/llviewerparceloverlay.cpp
# indra/newview/llviewertexlayer.cpp
# indra/newview/llviewertexturelist.cpp
# indra/newview/macmain.h
# indra/test/test.cpp
Diffstat (limited to 'indra/newview/llfloaterland.cpp')
| -rw-r--r-- | indra/newview/llfloaterland.cpp | 6918 |
1 files changed, 3459 insertions, 3459 deletions
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index f8fc812d29..9001acc1fc 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -1,3459 +1,3459 @@ -/** - * @file llfloaterland.cpp - * @brief "About Land" floater, allowing display and editing of land parcel properties. - * - * $LicenseInfo:firstyear=2002&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 <sstream> -#include <time.h> - -#include "llfloaterland.h" - -#include "llavatarnamecache.h" -#include "llfocusmgr.h" -#include "llnotificationsutil.h" -#include "llparcel.h" -#include "message.h" - -#include "llagent.h" -#include "llagentaccess.h" -#include "llappviewer.h" -#include "llbutton.h" -#include "llcheckboxctrl.h" -#include "llcombobox.h" -#include "llfloaterreg.h" -#include "llfloateravatarpicker.h" -#include "llfloaterauction.h" -#include "llfloaterbanduration.h" -#include "llfloatergroups.h" -#include "llfloaterscriptlimits.h" -#include "llavataractions.h" -#include "lllineeditor.h" -#include "llnamelistctrl.h" -#include "llpanellandaudio.h" -#include "llpanellandmedia.h" -#include "llradiogroup.h" -#include "llresmgr.h" // getMonetaryString -#include "llscrolllistctrl.h" -#include "llscrolllistitem.h" -#include "llscrolllistcell.h" -#include "llselectmgr.h" -#include "llslurl.h" -#include "llspinctrl.h" -#include "lltabcontainer.h" -#include "lltextbox.h" -#include "lltexturectrl.h" -#include "lluiconstants.h" -#include "lluictrlfactory.h" -#include "llviewertexturelist.h" // LLUIImageList -#include "llviewermessage.h" -#include "llviewerparcelmgr.h" -#include "llviewerregion.h" -#include "llviewerstats.h" -#include "llviewertexteditor.h" -#include "llviewerwindow.h" -#include "llviewercontrol.h" -#include "roles_constants.h" -#include "lltrans.h" -#include "llpanelexperiencelisteditor.h" -#include "llpanelexperiencepicker.h" -#include "llpanelenvironment.h" -#include "llexperiencecache.h" - -#include "llgroupactions.h" -#include "llenvironment.h" - -const F64 COVENANT_REFRESH_TIME_SEC = 60.0f; - -static std::string OWNER_ONLINE = "0"; -static std::string OWNER_OFFLINE = "1"; -static std::string OWNER_GROUP = "2"; -static std::string MATURITY = "[MATURITY]"; - -// constants used in callbacks below - syntactic sugar. -static const bool BUY_GROUP_LAND = true; -static const bool BUY_PERSONAL_LAND = false; -LLPointer<LLParcelSelection> LLPanelLandGeneral::sSelectionForBuyPass = NULL; - -// Statics -LLParcelSelectionObserver* LLFloaterLand::sObserver = NULL; -S32 LLFloaterLand::sLastTab = 0; - -// Local classes -class LLParcelSelectionObserver : public LLParcelObserver -{ -public: - virtual void changed() { LLFloaterLand::refreshAll(); } -}; - -// class needed to get full access to textbox inside checkbox, because LLCheckBoxCtrl::setLabel() has string as its argument. -// It was introduced while implementing EXT-4706 -class LLCheckBoxWithTBAcess : public LLCheckBoxCtrl -{ -public: - LLTextBox* getTextBox() - { - return mLabel; - } -}; - - -class LLPanelLandExperiences - : public LLPanel -{ -public: - LLPanelLandExperiences(LLSafeHandle<LLParcelSelection>& parcelp); - virtual bool postBuild(); - void refresh(); - - void experienceAdded(const LLUUID& id, U32 xp_type, U32 access_type); - void experienceRemoved(const LLUUID& id, U32 access_type); -protected: - LLPanelExperienceListEditor* setupList( const char* control_name, U32 xp_type, U32 access_type ); - void refreshPanel(LLPanelExperienceListEditor* panel, U32 xp_type); - - LLSafeHandle<LLParcelSelection>& mParcel; - - - LLPanelExperienceListEditor* mAllowed; - LLPanelExperienceListEditor* mBlocked; -}; - - -class LLPanelLandEnvironment - : public LLPanelEnvironmentInfo -{ -public: - LLPanelLandEnvironment(LLSafeHandle<LLParcelSelection>& parcelp); - - virtual bool isRegion() const override { return false; } - virtual bool isLargeEnough() override - { - LLParcel *parcelp = mParcel->getParcel(); - return ((parcelp) ? (parcelp->getArea() >= MINIMUM_PARCEL_SIZE) : false); - } - - virtual bool postBuild() override; - virtual void refresh() override; - - virtual LLParcel * getParcel() override; - - virtual bool canEdit() override; - virtual S32 getParcelId() override; - -protected: - virtual void refreshFromSource() override; - - bool isSameRegion(); - - LLSafeHandle<LLParcelSelection> & mParcel; - S32 mLastParcelId; -}; - - -// inserts maturity info(icon and text) into target textbox -// names_floater - pointer to floater which contains strings with maturity icons filenames -// str_to_parse is string in format "txt1[MATURITY]txt2" where maturity icon and text will be inserted instead of [MATURITY] -void insert_maturity_into_textbox(LLTextBox* target_textbox, LLFloater* names_floater, std::string str_to_parse); - -//--------------------------------------------------------------------------- -// LLFloaterLand -//--------------------------------------------------------------------------- - -void send_parcel_select_objects(S32 parcel_local_id, U32 return_type, - uuid_list_t* return_ids = NULL) -{ - LLMessageSystem *msg = gMessageSystem; - - LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion(); - if (!region) return; - - // Since new highlight will be coming in, drop any highlights - // that exist right now. - LLSelectMgr::getInstance()->unhighlightAll(); - - msg->newMessageFast(_PREHASH_ParcelSelectObjects); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID()); - msg->nextBlockFast(_PREHASH_ParcelData); - msg->addS32Fast(_PREHASH_LocalID, parcel_local_id); - msg->addU32Fast(_PREHASH_ReturnType, return_type); - - // Throw all return ids into the packet. - // TODO: Check for too many ids. - if (return_ids) - { - uuid_list_t::iterator end = return_ids->end(); - for (uuid_list_t::iterator it = return_ids->begin(); - it != end; - ++it) - { - msg->nextBlockFast(_PREHASH_ReturnIDs); - msg->addUUIDFast(_PREHASH_ReturnID, (*it)); - } - } - else - { - // Put in a null key so that the message is complete. - msg->nextBlockFast(_PREHASH_ReturnIDs); - msg->addUUIDFast(_PREHASH_ReturnID, LLUUID::null); - } - - msg->sendReliable(region->getHost()); -} - -LLParcel* LLFloaterLand::getCurrentSelectedParcel() -{ - return mParcel->getParcel(); -}; - -//static -LLPanelLandObjects* LLFloaterLand::getCurrentPanelLandObjects() -{ - LLFloaterLand* land_instance = LLFloaterReg::getTypedInstance<LLFloaterLand>("about_land"); - if(land_instance) - { - return land_instance->mPanelObjects; - } - else - { - return NULL; - } -} - -//static -LLPanelLandCovenant* LLFloaterLand::getCurrentPanelLandCovenant() -{ - LLFloaterLand* land_instance = LLFloaterReg::getTypedInstance<LLFloaterLand>("about_land"); - if(land_instance) - { - return land_instance->mPanelCovenant; - } - else - { - return NULL; - } -} - -// static -void LLFloaterLand::refreshAll() -{ - LLFloaterLand* land_instance = LLFloaterReg::findTypedInstance<LLFloaterLand>("about_land"); - if(land_instance) - { - land_instance->refresh(); - } -} - -void LLFloaterLand::onOpen(const LLSD& key) -{ - // moved from triggering show instance in llviwermenu.cpp - - if (LLViewerParcelMgr::getInstance()->selectionEmpty()) - { - LLViewerParcelMgr::getInstance()->selectParcelAt(gAgent.getPositionGlobal()); - } - - // Done automatically when the selected parcel's properties arrive - // (and hence we have the local id). - // LLViewerParcelMgr::getInstance()->sendParcelAccessListRequest(AL_ACCESS | AL_BAN | AL_RENTER); - - mParcel = LLViewerParcelMgr::getInstance()->getFloatingParcelSelection(); - - // Refresh even if not over a region so we don't get an - // uninitialized dialog. The dialog is 0-region aware. - refresh(); -} - -void LLFloaterLand::onVisibilityChanged(const LLSD& visible) -{ - if (!visible.asBoolean()) - { - // Might have been showing owned objects - LLSelectMgr::getInstance()->unhighlightAll(); - - // Save which panel we had open - sLastTab = mTabLand->getCurrentPanelIndex(); - } -} - - -LLFloaterLand::LLFloaterLand(const LLSD& seed) -: LLFloater(seed) -{ - mFactoryMap["land_general_panel"] = LLCallbackMap(createPanelLandGeneral, this); - mFactoryMap["land_covenant_panel"] = LLCallbackMap(createPanelLandCovenant, this); - mFactoryMap["land_objects_panel"] = LLCallbackMap(createPanelLandObjects, this); - mFactoryMap["land_options_panel"] = LLCallbackMap(createPanelLandOptions, this); - mFactoryMap["land_audio_panel"] = LLCallbackMap(createPanelLandAudio, this); - mFactoryMap["land_media_panel"] = LLCallbackMap(createPanelLandMedia, this); - mFactoryMap["land_access_panel"] = LLCallbackMap(createPanelLandAccess, this); - mFactoryMap["land_experiences_panel"] = LLCallbackMap(createPanelLandExperiences, this); - mFactoryMap["land_environment_panel"] = LLCallbackMap(createPanelLandEnvironment, this); - - sObserver = new LLParcelSelectionObserver(); - LLViewerParcelMgr::getInstance()->addObserver( sObserver ); -} - -bool LLFloaterLand::postBuild() -{ - setVisibleCallback(boost::bind(&LLFloaterLand::onVisibilityChanged, this, _2)); - - LLTabContainer* tab = getChild<LLTabContainer>("landtab"); - - mTabLand = (LLTabContainer*) tab; - - if (tab) - { - tab->selectTab(sLastTab); - } - - return true; -} - - -// virtual -LLFloaterLand::~LLFloaterLand() -{ - LLViewerParcelMgr::getInstance()->removeObserver( sObserver ); - delete sObserver; - sObserver = NULL; -} - -// public -void LLFloaterLand::refresh() -{ - mPanelGeneral->refresh(); - mPanelObjects->refresh(); - mPanelOptions->refresh(); - mPanelAudio->refresh(); - mPanelMedia->refresh(); - mPanelAccess->refresh(); - mPanelCovenant->refresh(); - mPanelExperiences->refresh(); - mPanelEnvironment->refresh(); -} - - - -void* LLFloaterLand::createPanelLandGeneral(void* data) -{ - LLFloaterLand* self = (LLFloaterLand*)data; - self->mPanelGeneral = new LLPanelLandGeneral(self->mParcel); - return self->mPanelGeneral; -} - -// static -void* LLFloaterLand::createPanelLandCovenant(void* data) -{ - LLFloaterLand* self = (LLFloaterLand*)data; - self->mPanelCovenant = new LLPanelLandCovenant(self->mParcel); - return self->mPanelCovenant; -} - - -// static -void* LLFloaterLand::createPanelLandObjects(void* data) -{ - LLFloaterLand* self = (LLFloaterLand*)data; - self->mPanelObjects = new LLPanelLandObjects(self->mParcel); - return self->mPanelObjects; -} - -// static -void* LLFloaterLand::createPanelLandOptions(void* data) -{ - LLFloaterLand* self = (LLFloaterLand*)data; - self->mPanelOptions = new LLPanelLandOptions(self->mParcel); - return self->mPanelOptions; -} - -// static -void* LLFloaterLand::createPanelLandAudio(void* data) -{ - LLFloaterLand* self = (LLFloaterLand*)data; - self->mPanelAudio = new LLPanelLandAudio(self->mParcel); - return self->mPanelAudio; -} - -// static -void* LLFloaterLand::createPanelLandMedia(void* data) -{ - LLFloaterLand* self = (LLFloaterLand*)data; - self->mPanelMedia = new LLPanelLandMedia(self->mParcel); - return self->mPanelMedia; -} - -// static -void* LLFloaterLand::createPanelLandAccess(void* data) -{ - LLFloaterLand* self = (LLFloaterLand*)data; - self->mPanelAccess = new LLPanelLandAccess(self->mParcel); - return self->mPanelAccess; -} - -// static -void* LLFloaterLand::createPanelLandExperiences(void* data) -{ - LLFloaterLand* self = (LLFloaterLand*)data; - self->mPanelExperiences = new LLPanelLandExperiences(self->mParcel); - return self->mPanelExperiences; -} - -//static -void* LLFloaterLand::createPanelLandEnvironment(void* data) -{ - LLFloaterLand* self = (LLFloaterLand*)data; - self->mPanelEnvironment = new LLPanelLandEnvironment(self->mParcel); - return self->mPanelEnvironment; -} - - -//--------------------------------------------------------------------------- -// LLPanelLandGeneral -//--------------------------------------------------------------------------- - - -LLPanelLandGeneral::LLPanelLandGeneral(LLParcelSelectionHandle& parcel) -: LLPanel(), - mUncheckedSell(false), - mParcel(parcel) -{ -} - -bool LLPanelLandGeneral::postBuild() -{ - mEditName = getChild<LLLineEditor>("Name"); - mEditName->setCommitCallback(onCommitAny, this); - getChild<LLLineEditor>("Name")->setPrevalidate(LLTextValidate::validateASCIIPrintableNoPipe); - - mEditDesc = getChild<LLTextEditor>("Description"); - mEditDesc->setCommitOnFocusLost(true); - mEditDesc->setCommitCallback(onCommitAny, this); - mEditDesc->setContentTrusted(false); - // No prevalidate function - historically the prevalidate function was broken, - // allowing residents to put in characters like U+2661 WHITE HEART SUIT, so - // preserve that ability. - - mTextSalePending = getChild<LLTextBox>("SalePending"); - mTextOwnerLabel = getChild<LLTextBox>("Owner:"); - mTextOwner = getChild<LLTextBox>("OwnerText"); - mTextOwner->setIsFriendCallback(LLAvatarActions::isFriend); - - mContentRating = getChild<LLTextBox>("ContentRatingText"); - mLandType = getChild<LLTextBox>("LandTypeText"); - - mBtnProfile = getChild<LLButton>("Profile..."); - mBtnProfile->setClickedCallback(boost::bind(&LLPanelLandGeneral::onClickProfile, this)); - - - mTextGroupLabel = getChild<LLTextBox>("Group:"); - mTextGroup = getChild<LLTextBox>("GroupText"); - - - mBtnSetGroup = getChild<LLButton>("Set..."); - mBtnSetGroup->setCommitCallback(boost::bind(&LLPanelLandGeneral::onClickSetGroup, this)); - - - mCheckDeedToGroup = getChild<LLCheckBoxCtrl>( "check deed"); - childSetCommitCallback("check deed", onCommitAny, this); - - - mBtnDeedToGroup = getChild<LLButton>("Deed..."); - mBtnDeedToGroup->setClickedCallback(onClickDeed, this); - - - mCheckContributeWithDeed = getChild<LLCheckBoxCtrl>( "check contrib"); - childSetCommitCallback("check contrib", onCommitAny, this); - - - - mSaleInfoNotForSale = getChild<LLTextBox>("Not for sale."); - - mSaleInfoForSale1 = getChild<LLTextBox>("For Sale: Price L$[PRICE]."); - - - mBtnSellLand = getChild<LLButton>("Sell Land..."); - mBtnSellLand->setClickedCallback(onClickSellLand, this); - - mSaleInfoForSale2 = getChild<LLTextBox>("For sale to"); - - mSaleInfoForSaleObjects = getChild<LLTextBox>("Sell with landowners objects in parcel."); - - mSaleInfoForSaleNoObjects = getChild<LLTextBox>("Selling with no objects in parcel."); - - - mBtnStopSellLand = getChild<LLButton>("Cancel Land Sale"); - mBtnStopSellLand->setClickedCallback(onClickStopSellLand, this); - - - mTextClaimDateLabel = getChild<LLTextBox>("Claimed:"); - mTextClaimDate = getChild<LLTextBox>("DateClaimText"); - - - mTextPriceLabel = getChild<LLTextBox>("PriceLabel"); - mTextPrice = getChild<LLTextBox>("PriceText"); - - - mTextDwell = getChild<LLTextBox>("DwellText"); - - mBtnBuyLand = getChild<LLButton>("Buy Land..."); - mBtnBuyLand->setClickedCallback(onClickBuyLand, (void*)&BUY_PERSONAL_LAND); - - - mBtnBuyGroupLand = getChild<LLButton>("Buy For Group..."); - mBtnBuyGroupLand->setClickedCallback(onClickBuyLand, (void*)&BUY_GROUP_LAND); - - - mBtnBuyPass = getChild<LLButton>("Buy Pass..."); - mBtnBuyPass->setClickedCallback(onClickBuyPass, this); - - mBtnReleaseLand = getChild<LLButton>("Abandon Land..."); - mBtnReleaseLand->setClickedCallback(onClickRelease, NULL); - - mBtnReclaimLand = getChild<LLButton>("Reclaim Land..."); - mBtnReclaimLand->setClickedCallback(onClickReclaim, NULL); - - mBtnStartAuction = getChild<LLButton>("Linden Sale..."); - mBtnStartAuction->setClickedCallback(onClickStartAuction, this); - - mBtnScriptLimits = getChild<LLButton>("Scripts..."); - - if(gDisconnected) - { - return true; - } - - // note: on region change this will not be re checked, should not matter on Agni as - // 99% of the time all regions will return the same caps. In case of an erroneous setting - // to enabled the floater will just throw an error when trying to get it's cap - std::string url = gAgent.getRegionCapability("LandResources"); - if (!url.empty()) - { - if(mBtnScriptLimits) - { - mBtnScriptLimits->setClickedCallback(onClickScriptLimits, this); - } - } - else - { - if(mBtnScriptLimits) - { - mBtnScriptLimits->setVisible(false); - } - } - - return true; -} - - -// virtual -LLPanelLandGeneral::~LLPanelLandGeneral() -{ } - - -// public -void LLPanelLandGeneral::refresh() -{ - mEditName->setEnabled(false); - mEditName->setText(LLStringUtil::null); - - mEditDesc->setEnabled(false); - mEditDesc->setText(getString("no_selection_text")); - - mTextSalePending->setText(LLStringUtil::null); - mTextSalePending->setEnabled(false); - - mBtnDeedToGroup->setEnabled(false); - mBtnSetGroup->setEnabled(false); - mBtnStartAuction->setEnabled(false); - - mCheckDeedToGroup ->set(false); - mCheckDeedToGroup ->setEnabled(false); - mCheckContributeWithDeed->set(false); - mCheckContributeWithDeed->setEnabled(false); - - mTextOwner->setText(LLStringUtil::null); - mContentRating->setText(LLStringUtil::null); - mLandType->setText(LLStringUtil::null); - mBtnProfile->setLabel(getString("profile_text")); - mBtnProfile->setEnabled(false); - - mTextClaimDate->setText(LLStringUtil::null); - mTextGroup->setText(LLStringUtil::null); - mTextPrice->setText(LLStringUtil::null); - - mSaleInfoForSale1->setVisible(false); - mSaleInfoForSale2->setVisible(false); - mSaleInfoForSaleObjects->setVisible(false); - mSaleInfoForSaleNoObjects->setVisible(false); - mSaleInfoNotForSale->setVisible(false); - mBtnSellLand->setVisible(false); - mBtnStopSellLand->setVisible(false); - - mTextPriceLabel->setText(LLStringUtil::null); - mTextDwell->setText(LLStringUtil::null); - - mBtnBuyLand->setEnabled(false); - mBtnScriptLimits->setEnabled(false); - mBtnBuyGroupLand->setEnabled(false); - mBtnReleaseLand->setEnabled(false); - mBtnReclaimLand->setEnabled(false); - mBtnBuyPass->setEnabled(false); - - if(gDisconnected) - { - return; - } - - mBtnStartAuction->setVisible(gAgent.isGodlike()); - bool region_owner = false; - LLViewerRegion* regionp = LLViewerParcelMgr::getInstance()->getSelectionRegion(); - if(regionp && (regionp->getOwner() == gAgent.getID())) - { - region_owner = true; - mBtnReleaseLand->setVisible(false); - mBtnReclaimLand->setVisible(true); - } - else - { - mBtnReleaseLand->setVisible(true); - mBtnReclaimLand->setVisible(false); - } - LLParcel *parcel = mParcel->getParcel(); - if (parcel) - { - // something selected, hooray! - bool is_leased = (LLParcel::OS_LEASED == parcel->getOwnershipStatus()); - bool region_xfer = false; - if(regionp - && !(regionp->getRegionFlag(REGION_FLAGS_BLOCK_LAND_RESELL))) - { - region_xfer = true; - } - - if (regionp) - { - insert_maturity_into_textbox(mContentRating, gFloaterView->getParentFloater(this), MATURITY); - mLandType->setText(regionp->getLocalizedSimProductName()); - } - - // estate owner/manager cannot edit other parts of the parcel - bool estate_manager_sellable = !parcel->getAuctionID() - && gAgent.canManageEstate() - // estate manager/owner can only sell parcels owned by estate owner - && regionp - && (parcel->getOwnerID() == regionp->getOwner()); - bool owner_sellable = region_xfer && !parcel->getAuctionID() - && LLViewerParcelMgr::isParcelModifiableByAgent( - parcel, GP_LAND_SET_SALE_INFO); - bool can_be_sold = owner_sellable || estate_manager_sellable; - - const LLUUID &owner_id = parcel->getOwnerID(); - bool is_public = parcel->isPublic(); - - // Is it owned? - if (is_public) - { - mTextSalePending->setText(LLStringUtil::null); - mTextSalePending->setEnabled(false); - mTextOwner->setText(getString("public_text")); - mTextOwner->setEnabled(false); - mBtnProfile->setEnabled(false); - mTextClaimDate->setText(LLStringUtil::null); - mTextClaimDate->setEnabled(false); - mTextGroup->setText(getString("none_text")); - mTextGroup->setEnabled(false); - mBtnStartAuction->setEnabled(false); - } - else - { - if(!is_leased && (owner_id == gAgent.getID())) - { - mTextSalePending->setText(getString("need_tier_to_modify")); - mTextSalePending->setEnabled(true); - } - else if(parcel->getAuctionID()) - { - mTextSalePending->setText(getString("auction_id_text")); - mTextSalePending->setTextArg("[ID]", llformat("%u", parcel->getAuctionID())); - mTextSalePending->setEnabled(true); - } - else - { - // not the owner, or it is leased - mTextSalePending->setText(LLStringUtil::null); - mTextSalePending->setEnabled(false); - } - //refreshNames(); - mTextOwner->setEnabled(true); - - // We support both group and personal profiles - mBtnProfile->setEnabled(true); - - if (parcel->getGroupID().isNull()) - { - // Not group owned, so "Profile" - mBtnProfile->setLabel(getString("profile_text")); - - mTextGroup->setText(getString("none_text")); - mTextGroup->setEnabled(false); - } - else - { - // Group owned, so "Info" - mBtnProfile->setLabel(getString("info_text")); - - //mTextGroup->setText("HIPPOS!");//parcel->getGroupName()); - mTextGroup->setEnabled(true); - } - - // Display claim date - time_t claim_date = parcel->getClaimDate(); - std::string claim_date_str = getString("time_stamp_template"); - LLSD substitution; - substitution["datetime"] = (S32) claim_date; - LLStringUtil::format (claim_date_str, substitution); - mTextClaimDate->setText(claim_date_str); - mTextClaimDate->setEnabled(is_leased); - - bool enable_auction = (gAgent.getGodLevel() >= GOD_LIAISON) - && (owner_id == GOVERNOR_LINDEN_ID) - && (parcel->getAuctionID() == 0); - mBtnStartAuction->setEnabled(enable_auction); - } - - // Display options - bool can_edit_identity = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_CHANGE_IDENTITY); - mEditName->setEnabled(can_edit_identity); - mEditDesc->setEnabled(can_edit_identity); - mEditDesc->setParseURLs(!can_edit_identity); - - bool can_edit_agent_only = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_NO_POWERS); - mBtnSetGroup->setEnabled(can_edit_agent_only && !parcel->getIsGroupOwned()); - - const LLUUID& group_id = parcel->getGroupID(); - - // Can only allow deeding if you own it and it's got a group. - bool enable_deed = (owner_id == gAgent.getID() - && group_id.notNull() - && gAgent.isInGroup(group_id)); - // You don't need special powers to allow your object to - // be deeded to the group. - mCheckDeedToGroup->setEnabled(enable_deed); - mCheckDeedToGroup->set( parcel->getAllowDeedToGroup() ); - mCheckContributeWithDeed->setEnabled(enable_deed && parcel->getAllowDeedToGroup()); - mCheckContributeWithDeed->set(parcel->getContributeWithDeed()); - - // Actually doing the deeding requires you to have GP_LAND_DEED - // powers in the group. - bool can_deed = gAgent.hasPowerInGroup(group_id, GP_LAND_DEED); - mBtnDeedToGroup->setEnabled( parcel->getAllowDeedToGroup() - && group_id.notNull() - && can_deed - && !parcel->getIsGroupOwned() - ); - - mEditName->setText( parcel->getName() ); - mEditDesc->setText( parcel->getDesc() ); - - bool for_sale = parcel->getForSale(); - - mBtnSellLand->setVisible(false); - mBtnStopSellLand->setVisible(false); - - // show pricing information - S32 area; - S32 claim_price; - S32 rent_price; - F32 dwell = DWELL_NAN; - LLViewerParcelMgr::getInstance()->getDisplayInfo(&area, - &claim_price, - &rent_price, - &for_sale, - &dwell); - // Area - LLUIString price = getString("area_size_text"); - price.setArg("[AREA]", llformat("%d",area)); - mTextPriceLabel->setText(getString("area_text")); - mTextPrice->setText(price.getString()); - - if (dwell == DWELL_NAN) - { - mTextDwell->setText(LLTrans::getString("LoadingData")); - } - else - { - mTextDwell->setText(llformat("%.0f", dwell)); - } - - if (for_sale) - { - mSaleInfoForSale1->setVisible(true); - mSaleInfoForSale2->setVisible(true); - if (parcel->getSellWithObjects()) - { - mSaleInfoForSaleObjects->setVisible(true); - mSaleInfoForSaleNoObjects->setVisible(false); - } - else - { - mSaleInfoForSaleObjects->setVisible(false); - mSaleInfoForSaleNoObjects->setVisible(true); - } - mSaleInfoNotForSale->setVisible(false); - - F32 cost_per_sqm = 0.0f; - if (area > 0) - { - cost_per_sqm = (F32)parcel->getSalePrice() / (F32)area; - } - - S32 price = parcel->getSalePrice(); - mSaleInfoForSale1->setTextArg("[PRICE]", LLResMgr::getInstance()->getMonetaryString(price)); - mSaleInfoForSale1->setTextArg("[PRICE_PER_SQM]", llformat("%.1f", cost_per_sqm)); - if (can_be_sold) - { - mBtnStopSellLand->setVisible(true); - } - } - else - { - mSaleInfoForSale1->setVisible(false); - mSaleInfoForSale2->setVisible(false); - mSaleInfoForSaleObjects->setVisible(false); - mSaleInfoForSaleNoObjects->setVisible(false); - mSaleInfoNotForSale->setVisible(true); - if (can_be_sold) - { - mBtnSellLand->setVisible(true); - } - } - - refreshNames(); - - mBtnBuyLand->setEnabled( - LLViewerParcelMgr::getInstance()->canAgentBuyParcel(parcel, false)); - mBtnScriptLimits->setEnabled(true); -// LLViewerParcelMgr::getInstance()->canAgentBuyParcel(parcel, false)); - mBtnBuyGroupLand->setEnabled( - LLViewerParcelMgr::getInstance()->canAgentBuyParcel(parcel, true)); - - if(region_owner) - { - mBtnReclaimLand->setEnabled( - !is_public && (parcel->getOwnerID() != gAgent.getID())); - } - else - { - bool is_owner_release = LLViewerParcelMgr::isParcelOwnedByAgent(parcel, GP_LAND_RELEASE); - bool is_manager_release = (gAgent.canManageEstate() && - regionp && - (parcel->getOwnerID() != regionp->getOwner())); - bool can_release = is_owner_release || is_manager_release; - mBtnReleaseLand->setEnabled( can_release ); - } - - bool use_pass = parcel->getOwnerID()!= gAgent.getID() && parcel->getParcelFlag(PF_USE_PASS_LIST) && !LLViewerParcelMgr::getInstance()->isCollisionBanned();; - mBtnBuyPass->setEnabled(use_pass); - - } -} - -// public -void LLPanelLandGeneral::refreshNames() -{ - LLParcel *parcel = mParcel->getParcel(); - if (!parcel) - { - mTextOwner->setText(LLStringUtil::null); - mTextGroup->setText(LLStringUtil::null); - return; - } - - std::string owner; - if (parcel->getIsGroupOwned()) - { - owner = getString("group_owned_text"); - } - else - { - // Figure out the owner's name - owner = LLSLURL("agent", parcel->getOwnerID(), "inspect").getSLURLString(); - } - - if(LLParcel::OS_LEASE_PENDING == parcel->getOwnershipStatus()) - { - owner += getString("sale_pending_text"); - } - mTextOwner->setText(owner); - - std::string group; - if (!parcel->getGroupID().isNull()) - { - group = LLSLURL("group", parcel->getGroupID(), "inspect").getSLURLString(); - } - mTextGroup->setText(group); - - if (parcel->getForSale()) - { - const LLUUID& auth_buyer_id = parcel->getAuthorizedBuyerID(); - if(auth_buyer_id.notNull()) - { - std::string name; - name = LLSLURL("agent", auth_buyer_id, "inspect").getSLURLString(); - mSaleInfoForSale2->setTextArg("[BUYER]", name); - } - else - { - mSaleInfoForSale2->setTextArg("[BUYER]", getString("anyone")); - } - } -} - - -// virtual -void LLPanelLandGeneral::draw() -{ - LLPanel::draw(); -} - -void LLPanelLandGeneral::onClickSetGroup() -{ - LLFloater* parent_floater = gFloaterView->getParentFloater(this); - - LLFloaterGroupPicker* fg = LLFloaterReg::showTypedInstance<LLFloaterGroupPicker>("group_picker", LLSD(gAgent.getID())); - if (fg) - { - fg->setSelectGroupCallback( boost::bind(&LLPanelLandGeneral::setGroup, this, _1 )); - if (parent_floater) - { - LLRect new_rect = gFloaterView->findNeighboringPosition(parent_floater, fg); - fg->setOrigin(new_rect.mLeft, new_rect.mBottom); - parent_floater->addDependentFloater(fg); - } - } -} - -void LLPanelLandGeneral::onClickProfile() -{ - LLParcel* parcel = mParcel->getParcel(); - if (!parcel) return; - - if (parcel->getIsGroupOwned()) - { - const LLUUID& group_id = parcel->getGroupID(); - LLGroupActions::show(group_id); - } - else - { - const LLUUID& avatar_id = parcel->getOwnerID(); - LLAvatarActions::showProfile(avatar_id); - } -} - -// public -void LLPanelLandGeneral::setGroup(const LLUUID& group_id) -{ - LLParcel* parcel = mParcel->getParcel(); - if (!parcel) return; - - // Set parcel properties and send message - parcel->setGroupID(group_id); - //parcel->setGroupName(group_name); - //mTextGroup->setText(group_name); - - // Send update - LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate(parcel); - - // Update UI - refresh(); -} - -// static -void LLPanelLandGeneral::onClickBuyLand(void* data) -{ - bool* for_group = (bool*)data; - LLViewerParcelMgr::getInstance()->startBuyLand(*for_group); -} - -// static -void LLPanelLandGeneral::onClickScriptLimits(void* data) -{ - LLPanelLandGeneral* panelp = (LLPanelLandGeneral*)data; - LLParcel* parcel = panelp->mParcel->getParcel(); - if(parcel != NULL) - { - LLFloaterReg::showInstance("script_limits"); - } -} - -// static -void LLPanelLandGeneral::onClickDeed(void*) -{ - //LLParcel* parcel = mParcel->getParcel(); - //if (parcel) - //{ - LLViewerParcelMgr::getInstance()->startDeedLandToGroup(); - //} -} - -// static -void LLPanelLandGeneral::onClickRelease(void*) -{ - LLViewerParcelMgr::getInstance()->startReleaseLand(); -} - -// static -void LLPanelLandGeneral::onClickReclaim(void*) -{ - LL_DEBUGS() << "LLPanelLandGeneral::onClickReclaim()" << LL_ENDL; - LLViewerParcelMgr::getInstance()->reclaimParcel(); -} - -// static -bool LLPanelLandGeneral::enableBuyPass(void* data) -{ - LLPanelLandGeneral* panelp = (LLPanelLandGeneral*)data; - LLParcel* parcel = panelp != NULL ? panelp->mParcel->getParcel() : LLViewerParcelMgr::getInstance()->getParcelSelection()->getParcel(); - return (parcel != NULL) && (parcel->getParcelFlag(PF_USE_PASS_LIST) && !LLViewerParcelMgr::getInstance()->isCollisionBanned()); -} - - -// static -void LLPanelLandGeneral::onClickBuyPass(void* data) -{ - LLPanelLandGeneral* panelp = (LLPanelLandGeneral*)data; - LLParcel* parcel = panelp != NULL ? panelp->mParcel->getParcel() : LLViewerParcelMgr::getInstance()->getParcelSelection()->getParcel(); - - if (!parcel) return; - - S32 pass_price = parcel->getPassPrice(); - std::string parcel_name = parcel->getName(); - F32 pass_hours = parcel->getPassHours(); - - std::string cost, time; - cost = llformat("%d", pass_price); - time = llformat("%.2f", pass_hours); - - LLSD args; - args["COST"] = cost; - args["PARCEL_NAME"] = parcel_name; - args["TIME"] = time; - - // creating pointer on selection to avoid deselection of parcel until we are done with buying pass (EXT-6464) - sSelectionForBuyPass = LLViewerParcelMgr::getInstance()->getParcelSelection(); - LLNotificationsUtil::add("LandBuyPass", args, LLSD(), cbBuyPass); -} - -// static -void LLPanelLandGeneral::onClickStartAuction(void* data) -{ - LLPanelLandGeneral* panelp = (LLPanelLandGeneral*)data; - LLParcel* parcelp = panelp->mParcel->getParcel(); - if(parcelp) - { - if(parcelp->getForSale()) - { - LLNotificationsUtil::add("CannotStartAuctionAlreadyForSale"); - } - else - { - //LLFloaterAuction::showInstance(); - LLFloaterReg::showInstance("auction"); - } - } -} - -// static -bool LLPanelLandGeneral::cbBuyPass(const LLSD& notification, const LLSD& response) -{ - S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - if (0 == option) - { - // User clicked OK - LLViewerParcelMgr::getInstance()->buyPass(); - } - // we are done with buying pass, additional selection is no longer needed - sSelectionForBuyPass = NULL; - return false; -} - -// static -void LLPanelLandGeneral::onCommitAny(LLUICtrl *ctrl, void *userdata) -{ - LLPanelLandGeneral *panelp = (LLPanelLandGeneral *)userdata; - - LLParcel* parcel = panelp->mParcel->getParcel(); - if (!parcel) - { - return; - } - - // Extract data from UI - std::string name = panelp->mEditName->getText(); - std::string desc = panelp->mEditDesc->getText(); - - // Valid data from UI - - // Stuff data into selected parcel - parcel->setName(name); - parcel->setDesc(desc); - - bool allow_deed_to_group= panelp->mCheckDeedToGroup->get(); - bool contribute_with_deed = panelp->mCheckContributeWithDeed->get(); - - parcel->setParcelFlag(PF_ALLOW_DEED_TO_GROUP, allow_deed_to_group); - parcel->setContributeWithDeed(contribute_with_deed); - - // Send update to server - LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate( parcel ); - - // Might have changed properties, so let's redraw! - panelp->refresh(); -} - -// static -void LLPanelLandGeneral::onClickSellLand(void* data) -{ - LLViewerParcelMgr::getInstance()->startSellLand(); - LLPanelLandGeneral *panelp = (LLPanelLandGeneral *)data; - panelp->refresh(); -} - -// static -void LLPanelLandGeneral::onClickStopSellLand(void* data) -{ - LLPanelLandGeneral* panelp = (LLPanelLandGeneral*)data; - LLParcel* parcel = panelp->mParcel->getParcel(); - - parcel->setParcelFlag(PF_FOR_SALE, false); - parcel->setSalePrice(0); - parcel->setAuthorizedBuyerID(LLUUID::null); - - LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate(parcel); -} - -//--------------------------------------------------------------------------- -// LLPanelLandObjects -//--------------------------------------------------------------------------- -LLPanelLandObjects::LLPanelLandObjects(LLParcelSelectionHandle& parcel) - : LLPanel(), - - mParcel(parcel), - mParcelObjectBonus(NULL), - mSWTotalObjects(NULL), - mObjectContribution(NULL), - mTotalObjects(NULL), - mOwnerObjects(NULL), - mBtnShowOwnerObjects(NULL), - mBtnReturnOwnerObjects(NULL), - mGroupObjects(NULL), - mBtnShowGroupObjects(NULL), - mBtnReturnGroupObjects(NULL), - mOtherObjects(NULL), - mBtnShowOtherObjects(NULL), - mBtnReturnOtherObjects(NULL), - mSelectedObjects(NULL), - mCleanOtherObjectsTime(NULL), - mOtherTime(0), - mBtnRefresh(NULL), - mBtnReturnOwnerList(NULL), - mOwnerList(NULL), - mFirstReply(true), - mSelectedCount(0), - mSelectedIsGroup(false) -{ -} - - - -bool LLPanelLandObjects::postBuild() -{ - - mFirstReply = true; - mParcelObjectBonus = getChild<LLTextBox>("parcel_object_bonus"); - mSWTotalObjects = getChild<LLTextBox>("objects_available"); - mObjectContribution = getChild<LLTextBox>("object_contrib_text"); - mTotalObjects = getChild<LLTextBox>("total_objects_text"); - mOwnerObjects = getChild<LLTextBox>("owner_objects_text"); - - mBtnShowOwnerObjects = getChild<LLButton>("ShowOwner"); - mBtnShowOwnerObjects->setClickedCallback(onClickShowOwnerObjects, this); - - mBtnReturnOwnerObjects = getChild<LLButton>("ReturnOwner..."); - mBtnReturnOwnerObjects->setClickedCallback(onClickReturnOwnerObjects, this); - - mGroupObjects = getChild<LLTextBox>("group_objects_text"); - mBtnShowGroupObjects = getChild<LLButton>("ShowGroup"); - mBtnShowGroupObjects->setClickedCallback(onClickShowGroupObjects, this); - - mBtnReturnGroupObjects = getChild<LLButton>("ReturnGroup..."); - mBtnReturnGroupObjects->setClickedCallback(onClickReturnGroupObjects, this); - - mOtherObjects = getChild<LLTextBox>("other_objects_text"); - mBtnShowOtherObjects = getChild<LLButton>("ShowOther"); - mBtnShowOtherObjects->setClickedCallback(onClickShowOtherObjects, this); - - mBtnReturnOtherObjects = getChild<LLButton>("ReturnOther..."); - mBtnReturnOtherObjects->setClickedCallback(onClickReturnOtherObjects, this); - - mSelectedObjects = getChild<LLTextBox>("selected_objects_text"); - mCleanOtherObjectsTime = getChild<LLLineEditor>("clean other time"); - - mCleanOtherObjectsTime->setFocusLostCallback(boost::bind(onLostFocus, _1, this)); - mCleanOtherObjectsTime->setCommitCallback(onCommitClean, this); - getChild<LLLineEditor>("clean other time")->setPrevalidate(LLTextValidate::validateNonNegativeS32); - - mBtnRefresh = getChild<LLButton>("Refresh List"); - mBtnRefresh->setClickedCallback(onClickRefresh, this); - - mBtnReturnOwnerList = getChild<LLButton>("Return objects..."); - mBtnReturnOwnerList->setClickedCallback(onClickReturnOwnerList, this); - - mIconAvatarOnline = LLUIImageList::getInstance()->getUIImage("icon_avatar_online.tga", 0); - mIconAvatarOffline = LLUIImageList::getInstance()->getUIImage("icon_avatar_offline.tga", 0); - mIconGroup = LLUIImageList::getInstance()->getUIImage("icon_group.tga", 0); - - mOwnerList = getChild<LLNameListCtrl>("owner list"); - mOwnerList->setIsFriendCallback(LLAvatarActions::isFriend); - mOwnerList->sortByColumnIndex(3, false); - childSetCommitCallback("owner list", onCommitList, this); - mOwnerList->setDoubleClickCallback(onDoubleClickOwner, this); - mOwnerList->setContextMenu(LLScrollListCtrl::MENU_AVATAR); - - return true; -} - - - - -// virtual -LLPanelLandObjects::~LLPanelLandObjects() -{ } - -// static -void LLPanelLandObjects::onDoubleClickOwner(void *userdata) -{ - LLPanelLandObjects *self = (LLPanelLandObjects *)userdata; - - LLScrollListItem* item = self->mOwnerList->getFirstSelected(); - if (item) - { - LLUUID owner_id = item->getUUID(); - // Look up the selected name, for future dialog box use. - const LLScrollListCell* cell; - cell = item->getColumn(1); - if (!cell) - { - return; - } - // Is this a group? - bool is_group = cell->getValue().asString() == OWNER_GROUP; - if (is_group) - { - LLGroupActions::show(owner_id); - } - else - { - LLAvatarActions::showProfile(owner_id); - } - } -} - -// public -void LLPanelLandObjects::refresh() -{ - LLParcel *parcel = mParcel->getParcel(); - - mBtnShowOwnerObjects->setEnabled(false); - mBtnShowGroupObjects->setEnabled(false); - mBtnShowOtherObjects->setEnabled(false); - mBtnReturnOwnerObjects->setEnabled(false); - mBtnReturnGroupObjects->setEnabled(false); - mBtnReturnOtherObjects->setEnabled(false); - mCleanOtherObjectsTime->setEnabled(false); - mBtnRefresh-> setEnabled(false); - mBtnReturnOwnerList-> setEnabled(false); - - mSelectedOwners.clear(); - mOwnerList->deleteAllItems(); - mOwnerList->setEnabled(false); - - if (!parcel || gDisconnected) - { - mSWTotalObjects->setTextArg("[COUNT]", llformat("%d", 0)); - mSWTotalObjects->setTextArg("[TOTAL]", llformat("%d", 0)); - mSWTotalObjects->setTextArg("[AVAILABLE]", llformat("%d", 0)); - mObjectContribution->setTextArg("[COUNT]", llformat("%d", 0)); - mTotalObjects->setTextArg("[COUNT]", llformat("%d", 0)); - mOwnerObjects->setTextArg("[COUNT]", llformat("%d", 0)); - mGroupObjects->setTextArg("[COUNT]", llformat("%d", 0)); - mOtherObjects->setTextArg("[COUNT]", llformat("%d", 0)); - mSelectedObjects->setTextArg("[COUNT]", llformat("%d", 0)); - } - else - { - S32 sw_max = parcel->getSimWideMaxPrimCapacity(); - S32 sw_total = parcel->getSimWidePrimCount(); - S32 max = ll_round(parcel->getMaxPrimCapacity() * parcel->getParcelPrimBonus()); - S32 total = parcel->getPrimCount(); - S32 owned = parcel->getOwnerPrimCount(); - S32 group = parcel->getGroupPrimCount(); - S32 other = parcel->getOtherPrimCount(); - S32 selected = parcel->getSelectedPrimCount(); - F32 parcel_object_bonus = parcel->getParcelPrimBonus(); - mOtherTime = parcel->getCleanOtherTime(); - - // Can't have more than region max tasks, regardless of parcel - // object bonus factor. - LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion(); - if (region) - { - S32 max_tasks_per_region = (S32)region->getMaxTasks(); - sw_max = llmin(sw_max, max_tasks_per_region); - max = llmin(max, max_tasks_per_region); - } - - if (parcel_object_bonus != 1.0f) - { - mParcelObjectBonus->setVisible(true); - mParcelObjectBonus->setTextArg("[BONUS]", llformat("%.2f", parcel_object_bonus)); - } - else - { - mParcelObjectBonus->setVisible(false); - } - - if (sw_total > sw_max) - { - mSWTotalObjects->setText(getString("objects_deleted_text")); - mSWTotalObjects->setTextArg("[DELETED]", llformat("%d", sw_total - sw_max)); - } - else - { - mSWTotalObjects->setText(getString("objects_available_text")); - mSWTotalObjects->setTextArg("[AVAILABLE]", llformat("%d", sw_max - sw_total)); - } - mSWTotalObjects->setTextArg("[COUNT]", llformat("%d", sw_total)); - mSWTotalObjects->setTextArg("[MAX]", llformat("%d", sw_max)); - - mObjectContribution->setTextArg("[COUNT]", llformat("%d", max)); - mTotalObjects->setTextArg("[COUNT]", llformat("%d", total)); - mOwnerObjects->setTextArg("[COUNT]", llformat("%d", owned)); - mGroupObjects->setTextArg("[COUNT]", llformat("%d", group)); - mOtherObjects->setTextArg("[COUNT]", llformat("%d", other)); - mSelectedObjects->setTextArg("[COUNT]", llformat("%d", selected)); - mCleanOtherObjectsTime->setText(llformat("%d", mOtherTime)); - - bool can_return_owned = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_RETURN_GROUP_OWNED); - bool can_return_group_set = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_RETURN_GROUP_SET); - bool can_return_other = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_RETURN_NON_GROUP); - - if (can_return_owned || can_return_group_set || can_return_other) - { - if (owned && can_return_owned) - { - mBtnShowOwnerObjects->setEnabled(true); - mBtnReturnOwnerObjects->setEnabled(true); - } - if (group && can_return_group_set) - { - mBtnShowGroupObjects->setEnabled(true); - mBtnReturnGroupObjects->setEnabled(true); - } - if (other && can_return_other) - { - mBtnShowOtherObjects->setEnabled(true); - mBtnReturnOtherObjects->setEnabled(true); - } - - mCleanOtherObjectsTime->setEnabled(true); - mBtnRefresh->setEnabled(true); - } - } -} - -// virtual -void LLPanelLandObjects::draw() -{ - LLPanel::draw(); -} - -void send_other_clean_time_message(S32 parcel_local_id, S32 other_clean_time) -{ - LLMessageSystem *msg = gMessageSystem; - - LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion(); - if (!region) return; - - msg->newMessageFast(_PREHASH_ParcelSetOtherCleanTime); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID()); - msg->nextBlockFast(_PREHASH_ParcelData); - msg->addS32Fast(_PREHASH_LocalID, parcel_local_id); - msg->addS32Fast(_PREHASH_OtherCleanTime, other_clean_time); - - msg->sendReliable(region->getHost()); -} - -void send_return_objects_message(S32 parcel_local_id, S32 return_type, - uuid_list_t* owner_ids = NULL) -{ - LLMessageSystem *msg = gMessageSystem; - - LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion(); - if (!region) return; - - msg->newMessageFast(_PREHASH_ParcelReturnObjects); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID()); - msg->nextBlockFast(_PREHASH_ParcelData); - msg->addS32Fast(_PREHASH_LocalID, parcel_local_id); - msg->addU32Fast(_PREHASH_ReturnType, (U32) return_type); - - // Dummy task id, not used - msg->nextBlock("TaskIDs"); - msg->addUUID("TaskID", LLUUID::null); - - // Throw all return ids into the packet. - // TODO: Check for too many ids. - if (owner_ids) - { - uuid_list_t::iterator end = owner_ids->end(); - for (uuid_list_t::iterator it = owner_ids->begin(); - it != end; - ++it) - { - msg->nextBlockFast(_PREHASH_OwnerIDs); - msg->addUUIDFast(_PREHASH_OwnerID, (*it)); - } - } - else - { - msg->nextBlockFast(_PREHASH_OwnerIDs); - msg->addUUIDFast(_PREHASH_OwnerID, LLUUID::null); - } - - msg->sendReliable(region->getHost()); -} - -bool LLPanelLandObjects::callbackReturnOwnerObjects(const LLSD& notification, const LLSD& response) -{ - S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - LLParcel *parcel = mParcel->getParcel(); - if (0 == option) - { - if (parcel) - { - LLUUID owner_id = parcel->getOwnerID(); - LLSD args; - if (owner_id == gAgentID) - { - LLNotificationsUtil::add("OwnedObjectsReturned"); - } - else - { - args["NAME"] = LLSLURL("agent", owner_id, "completename").getSLURLString(); - LLNotificationsUtil::add("OtherObjectsReturned", args); - } - send_return_objects_message(parcel->getLocalID(), RT_OWNER); - } - } - - LLSelectMgr::getInstance()->unhighlightAll(); - LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate( parcel ); - refresh(); - return false; -} - -bool LLPanelLandObjects::callbackReturnGroupObjects(const LLSD& notification, const LLSD& response) -{ - S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - LLParcel *parcel = mParcel->getParcel(); - if (0 == option) - { - if (parcel) - { - std::string group_name; - gCacheName->getGroupName(parcel->getGroupID(), group_name); - LLSD args; - args["GROUPNAME"] = group_name; - LLNotificationsUtil::add("GroupObjectsReturned", args); - send_return_objects_message(parcel->getLocalID(), RT_GROUP); - } - } - LLSelectMgr::getInstance()->unhighlightAll(); - LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate( parcel ); - refresh(); - return false; -} - -bool LLPanelLandObjects::callbackReturnOtherObjects(const LLSD& notification, const LLSD& response) -{ - S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - LLParcel *parcel = mParcel->getParcel(); - if (0 == option) - { - if (parcel) - { - LLNotificationsUtil::add("UnOwnedObjectsReturned"); - send_return_objects_message(parcel->getLocalID(), RT_OTHER); - } - } - LLSelectMgr::getInstance()->unhighlightAll(); - LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate( parcel ); - refresh(); - return false; -} - -bool LLPanelLandObjects::callbackReturnOwnerList(const LLSD& notification, const LLSD& response) -{ - S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - LLParcel *parcel = mParcel->getParcel(); - if (0 == option) - { - if (parcel) - { - // Make sure we have something selected. - uuid_list_t::iterator selected = mSelectedOwners.begin(); - if (selected != mSelectedOwners.end()) - { - LLSD args; - if (mSelectedIsGroup) - { - args["GROUPNAME"] = mSelectedName; - LLNotificationsUtil::add("GroupObjectsReturned", args); - } - else - { - args["NAME"] = mSelectedName; - LLNotificationsUtil::add("OtherObjectsReturned2", args); - } - - send_return_objects_message(parcel->getLocalID(), RT_LIST, &(mSelectedOwners)); - } - } - } - LLSelectMgr::getInstance()->unhighlightAll(); - LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate( parcel ); - refresh(); - return false; -} - - -// static -void LLPanelLandObjects::onClickReturnOwnerList(void* userdata) -{ - LLPanelLandObjects *self = (LLPanelLandObjects *)userdata; - - LLParcel* parcelp = self->mParcel->getParcel(); - if (!parcelp) return; - - // Make sure we have something selected. - if (self->mSelectedOwners.empty()) - { - return; - } - //uuid_list_t::iterator selected_itr = self->mSelectedOwners.begin(); - //if (selected_itr == self->mSelectedOwners.end()) return; - - send_parcel_select_objects(parcelp->getLocalID(), RT_LIST, &(self->mSelectedOwners)); - - LLSD args; - args["NAME"] = self->mSelectedName; - args["N"] = llformat("%d",self->mSelectedCount); - if (self->mSelectedIsGroup) - { - LLNotificationsUtil::add("ReturnObjectsDeededToGroup", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOwnerList, self, _1, _2)); - } - else - { - LLNotificationsUtil::add("ReturnObjectsOwnedByUser", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOwnerList, self, _1, _2)); - } -} - - -// static -void LLPanelLandObjects::onClickRefresh(void* userdata) -{ - LLPanelLandObjects *self = (LLPanelLandObjects*)userdata; - - LLMessageSystem *msg = gMessageSystem; - - LLParcel* parcel = self->mParcel->getParcel(); - if (!parcel) return; - - LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion(); - if (!region) return; - - self->mBtnRefresh->setEnabled(false); - - // ready the list for results - self->mOwnerList->deleteAllItems(); - self->mOwnerList->setCommentText(LLTrans::getString("Searching")); - self->mOwnerList->setEnabled(false); - self->mFirstReply = true; - - // send the message - msg->newMessageFast(_PREHASH_ParcelObjectOwnersRequest); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->nextBlockFast(_PREHASH_ParcelData); - msg->addS32Fast(_PREHASH_LocalID, parcel->getLocalID()); - - msg->sendReliable(region->getHost()); -} - -// static -void LLPanelLandObjects::processParcelObjectOwnersReply(LLMessageSystem *msg, void **) -{ - LLPanelLandObjects* self = LLFloaterLand::getCurrentPanelLandObjects(); - - if (!self) - { - LL_WARNS() << "Received message for nonexistent LLPanelLandObject" - << LL_ENDL; - return; - } - - const LLFontGL* FONT = LLFontGL::getFontSansSerif(); - - // Extract all of the owners. - S32 rows = msg->getNumberOfBlocksFast(_PREHASH_Data); - //uuid_list_t return_ids; - LLUUID owner_id; - bool is_group_owned; - S32 object_count; - U32 most_recent_time = 0; - bool is_online; - std::string object_count_str; - //bool b_need_refresh = false; - - // If we were waiting for the first reply, clear the "Searching..." text. - if (self->mFirstReply) - { - self->mOwnerList->deleteAllItems(); - self->mFirstReply = false; - } - - for(S32 i = 0; i < rows; ++i) - { - msg->getUUIDFast(_PREHASH_Data, _PREHASH_OwnerID, owner_id, i); - msg->getBOOLFast(_PREHASH_Data, _PREHASH_IsGroupOwned, is_group_owned, i); - msg->getS32Fast (_PREHASH_Data, _PREHASH_Count, object_count, i); - msg->getBOOLFast(_PREHASH_Data, _PREHASH_OnlineStatus, is_online, i); - if(msg->has("DataExtended")) - { - msg->getU32("DataExtended", "TimeStamp", most_recent_time, i); - } - - if (owner_id.isNull()) - { - continue; - } - - LLNameListCtrl::NameItem item_params; - item_params.value = owner_id; - item_params.target = is_group_owned ? LLNameListCtrl::GROUP : LLNameListCtrl::INDIVIDUAL; - - if (is_group_owned) - { - item_params.columns.add().type("icon").value(self->mIconGroup->getName()).column("type"); - item_params.columns.add().value(OWNER_GROUP).font(FONT).column("online_status"); - } - else if (is_online) - { - item_params.columns.add().type("icon").value(self->mIconAvatarOnline->getName()).column("type"); - item_params.columns.add().value(OWNER_ONLINE).font(FONT).column("online_status"); - } - else // offline - { - item_params.columns.add().type("icon").value(self->mIconAvatarOffline->getName()).column("type"); - item_params.columns.add().value(OWNER_OFFLINE).font(FONT).column("online_status"); - } - - // Placeholder for name. - LLAvatarName av_name; - LLAvatarNameCache::get(owner_id, &av_name); - item_params.columns.add().value(av_name.getCompleteName()).font(FONT).column("name"); - - object_count_str = llformat("%d", object_count); - item_params.columns.add().value(object_count_str).font(FONT).column("count"); - item_params.columns.add().value(LLDate((time_t)most_recent_time)).font(FONT).column("mostrecent").type("date"); - - self->mOwnerList->addNameItemRow(item_params); - LL_DEBUGS() << "object owner " << owner_id << " (" << (is_group_owned ? "group" : "agent") - << ") owns " << object_count << " objects." << LL_ENDL; - } - - // check for no results - if (0 == self->mOwnerList->getItemCount()) - { - self->mOwnerList->setCommentText(LLTrans::getString("NoneFound")); - } - else - { - self->mOwnerList->setEnabled(true); - } - - self->mBtnRefresh->setEnabled(true); -} - -// static -void LLPanelLandObjects::onCommitList(LLUICtrl* ctrl, void* data) -{ - LLPanelLandObjects* self = (LLPanelLandObjects*)data; - - if (false == self->mOwnerList->getCanSelect()) - { - return; - } - LLScrollListItem *item = self->mOwnerList->getFirstSelected(); - if (item) - { - // Look up the selected name, for future dialog box use. - const LLScrollListCell* cell; - cell = item->getColumn(1); - if (!cell) - { - return; - } - // Is this a group? - self->mSelectedIsGroup = cell->getValue().asString() == OWNER_GROUP; - cell = item->getColumn(2); - self->mSelectedName = cell->getValue().asString(); - cell = item->getColumn(3); - self->mSelectedCount = atoi(cell->getValue().asString().c_str()); - - // Set the selection, and enable the return button. - self->mSelectedOwners.clear(); - self->mSelectedOwners.insert(item->getUUID()); - self->mBtnReturnOwnerList->setEnabled(true); - - // Highlight this user's objects - clickShowCore(self, RT_LIST, &(self->mSelectedOwners)); - } -} - -// static -void LLPanelLandObjects::clickShowCore(LLPanelLandObjects* self, S32 return_type, uuid_list_t* list) -{ - LLParcel* parcel = self->mParcel->getParcel(); - if (!parcel) return; - - send_parcel_select_objects(parcel->getLocalID(), return_type, list); -} - -// static -void LLPanelLandObjects::onClickShowOwnerObjects(void* userdata) -{ - clickShowCore((LLPanelLandObjects*)userdata, RT_OWNER); -} - -// static -void LLPanelLandObjects::onClickShowGroupObjects(void* userdata) -{ - clickShowCore((LLPanelLandObjects*)userdata, (RT_GROUP)); -} - -// static -void LLPanelLandObjects::onClickShowOtherObjects(void* userdata) -{ - clickShowCore((LLPanelLandObjects*)userdata, RT_OTHER); -} - -// static -void LLPanelLandObjects::onClickReturnOwnerObjects(void* userdata) -{ - S32 owned = 0; - - LLPanelLandObjects* panelp = (LLPanelLandObjects*)userdata; - LLParcel* parcel = panelp->mParcel->getParcel(); - if (!parcel) return; - - owned = parcel->getOwnerPrimCount(); - - send_parcel_select_objects(parcel->getLocalID(), RT_OWNER); - - LLUUID owner_id = parcel->getOwnerID(); - - LLSD args; - args["N"] = llformat("%d",owned); - - if (owner_id == gAgent.getID()) - { - LLNotificationsUtil::add("ReturnObjectsOwnedBySelf", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOwnerObjects, panelp, _1, _2)); - } - else - { - args["NAME"] = LLSLURL("agent", owner_id, "completename").getSLURLString(); - LLNotificationsUtil::add("ReturnObjectsOwnedByUser", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOwnerObjects, panelp, _1, _2)); - } -} - -// static -void LLPanelLandObjects::onClickReturnGroupObjects(void* userdata) -{ - LLPanelLandObjects* panelp = (LLPanelLandObjects*)userdata; - LLParcel* parcel = panelp->mParcel->getParcel(); - if (!parcel) return; - - send_parcel_select_objects(parcel->getLocalID(), RT_GROUP); - - std::string group_name; - gCacheName->getGroupName(parcel->getGroupID(), group_name); - - LLSD args; - args["NAME"] = group_name; - args["N"] = llformat("%d", parcel->getGroupPrimCount()); - - // create and show confirmation textbox - LLNotificationsUtil::add("ReturnObjectsDeededToGroup", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnGroupObjects, panelp, _1, _2)); -} - -// static -void LLPanelLandObjects::onClickReturnOtherObjects(void* userdata) -{ - S32 other = 0; - - LLPanelLandObjects* panelp = (LLPanelLandObjects*)userdata; - LLParcel* parcel = panelp->mParcel->getParcel(); - if (!parcel) return; - - other = parcel->getOtherPrimCount(); - - send_parcel_select_objects(parcel->getLocalID(), RT_OTHER); - - LLSD args; - args["N"] = llformat("%d", other); - - if (parcel->getIsGroupOwned()) - { - std::string group_name; - gCacheName->getGroupName(parcel->getGroupID(), group_name); - args["NAME"] = group_name; - - LLNotificationsUtil::add("ReturnObjectsNotOwnedByGroup", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOtherObjects, panelp, _1, _2)); - } - else - { - LLUUID owner_id = parcel->getOwnerID(); - - if (owner_id == gAgent.getID()) - { - LLNotificationsUtil::add("ReturnObjectsNotOwnedBySelf", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOtherObjects, panelp, _1, _2)); - } - else - { - args["NAME"] = LLSLURL("agent", owner_id, "completename").getSLURLString(); - LLNotificationsUtil::add("ReturnObjectsNotOwnedByUser", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOtherObjects, panelp, _1, _2)); - } - } -} - -// static -void LLPanelLandObjects::onLostFocus(LLFocusableElement* caller, void* user_data) -{ - onCommitClean((LLUICtrl*)caller, user_data); -} - -// static -void LLPanelLandObjects::onCommitClean(LLUICtrl *caller, void* user_data) -{ - LLPanelLandObjects *lop = (LLPanelLandObjects *)user_data; - LLParcel* parcel = lop->mParcel->getParcel(); - if (parcel) - { - S32 return_time = atoi(lop->mCleanOtherObjectsTime->getText().c_str()); - // Only send return time if it has changed - if (return_time != lop->mOtherTime) - { - lop->mOtherTime = return_time; - - parcel->setCleanOtherTime(lop->mOtherTime); - send_other_clean_time_message(parcel->getLocalID(), lop->mOtherTime); - } -} -} - - -//--------------------------------------------------------------------------- -// LLPanelLandOptions -//--------------------------------------------------------------------------- - -LLPanelLandOptions::LLPanelLandOptions(LLParcelSelectionHandle& parcel) -: LLPanel(), - mCheckEditObjects(NULL), - mCheckEditGroupObjects(NULL), - mCheckAllObjectEntry(NULL), - mCheckGroupObjectEntry(NULL), - mCheckSafe(NULL), - mCheckFly(NULL), - mCheckGroupScripts(NULL), - mCheckOtherScripts(NULL), - mCheckShowDirectory(NULL), - mCategoryCombo(NULL), - mLandingTypeCombo(NULL), - mSnapshotCtrl(NULL), - mLocationText(NULL), - mSeeAvatarsText(NULL), - mSetBtn(NULL), - mClearBtn(NULL), - mMatureCtrl(NULL), - mPushRestrictionCtrl(NULL), - mSeeAvatarsCtrl(NULL), - mParcel(parcel) -{ -} - - -bool LLPanelLandOptions::postBuild() -{ - mCheckEditObjects = getChild<LLCheckBoxCtrl>( "edit objects check"); - childSetCommitCallback("edit objects check", onCommitAny, this); - - mCheckEditGroupObjects = getChild<LLCheckBoxCtrl>( "edit group objects check"); - childSetCommitCallback("edit group objects check", onCommitAny, this); - - mCheckAllObjectEntry = getChild<LLCheckBoxCtrl>( "all object entry check"); - childSetCommitCallback("all object entry check", onCommitAny, this); - - mCheckGroupObjectEntry = getChild<LLCheckBoxCtrl>( "group object entry check"); - childSetCommitCallback("group object entry check", onCommitAny, this); - - mCheckGroupScripts = getChild<LLCheckBoxCtrl>( "check group scripts"); - childSetCommitCallback("check group scripts", onCommitAny, this); - - - mCheckFly = getChild<LLCheckBoxCtrl>( "check fly"); - childSetCommitCallback("check fly", onCommitAny, this); - - - mCheckOtherScripts = getChild<LLCheckBoxCtrl>( "check other scripts"); - childSetCommitCallback("check other scripts", onCommitAny, this); - - - mCheckSafe = getChild<LLCheckBoxCtrl>( "check safe"); - childSetCommitCallback("check safe", onCommitAny, this); - - - mPushRestrictionCtrl = getChild<LLCheckBoxCtrl>( "PushRestrictCheck"); - childSetCommitCallback("PushRestrictCheck", onCommitAny, this); - - mSeeAvatarsCtrl = getChild<LLCheckBoxCtrl>( "SeeAvatarsCheck"); - childSetCommitCallback("SeeAvatarsCheck", onCommitAny, this); - - mSeeAvatarsText = getChild<LLTextBox>("allow_see_label"); - if (mSeeAvatarsText) - { - mSeeAvatarsText->setShowCursorHand(false); - mSeeAvatarsText->setSoundFlags(LLView::MOUSE_UP); - mSeeAvatarsText->setClickedCallback(boost::bind(&toggleSeeAvatars, this)); - } - - mCheckShowDirectory = getChild<LLCheckBoxCtrl>( "ShowDirectoryCheck"); - childSetCommitCallback("ShowDirectoryCheck", onCommitAny, this); - - - mCategoryCombo = getChild<LLComboBox>( "land category"); - childSetCommitCallback("land category", onCommitAny, this); - - - mMatureCtrl = getChild<LLCheckBoxCtrl>( "MatureCheck"); - childSetCommitCallback("MatureCheck", onCommitAny, this); - - if (gAgent.wantsPGOnly()) - { - // Disable these buttons if they are PG (Teen) users - mMatureCtrl->setVisible(false); - mMatureCtrl->setEnabled(false); - } - - - mSnapshotCtrl = getChild<LLTextureCtrl>("snapshot_ctrl"); - if (mSnapshotCtrl) - { - mSnapshotCtrl->setCommitCallback( onCommitAny, this ); - mSnapshotCtrl->setAllowNoTexture ( true ); - mSnapshotCtrl->setImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER); - mSnapshotCtrl->setDnDFilterPermMask(PERM_COPY | PERM_TRANSFER); - } - else - { - LL_WARNS() << "LLUICtrlFactory::getTexturePickerByName() returned NULL for 'snapshot_ctrl'" << LL_ENDL; - } - - - mLocationText = getChild<LLTextBox>("landing_point"); - - mSetBtn = getChild<LLButton>("Set"); - mSetBtn->setClickedCallback(onClickSet, this); - - - mClearBtn = getChild<LLButton>("Clear"); - mClearBtn->setClickedCallback(onClickClear, this); - - - mLandingTypeCombo = getChild<LLComboBox>( "landing type"); - childSetCommitCallback("landing type", onCommitAny, this); - - return true; -} - - -// virtual -LLPanelLandOptions::~LLPanelLandOptions() -{ } - - -// virtual -void LLPanelLandOptions::refresh() -{ - refreshSearch(); - - LLParcel *parcel = mParcel->getParcel(); - if (!parcel || gDisconnected) - { - mCheckEditObjects ->set(false); - mCheckEditObjects ->setEnabled(false); - - mCheckEditGroupObjects ->set(false); - mCheckEditGroupObjects ->setEnabled(false); - - mCheckAllObjectEntry ->set(false); - mCheckAllObjectEntry ->setEnabled(false); - - mCheckGroupObjectEntry ->set(false); - mCheckGroupObjectEntry ->setEnabled(false); - - mCheckSafe ->set(false); - mCheckSafe ->setEnabled(false); - - mCheckFly ->set(false); - mCheckFly ->setEnabled(false); - - mCheckGroupScripts ->set(false); - mCheckGroupScripts ->setEnabled(false); - - mCheckOtherScripts ->set(false); - mCheckOtherScripts ->setEnabled(false); - - mPushRestrictionCtrl->set(false); - mPushRestrictionCtrl->setEnabled(false); - - mSeeAvatarsCtrl->set(true); - mSeeAvatarsCtrl->setEnabled(false); - mSeeAvatarsText->setEnabled(false); - - mLandingTypeCombo->setCurrentByIndex(0); - mLandingTypeCombo->setEnabled(false); - - mSnapshotCtrl->setImageAssetID(LLUUID::null); - mSnapshotCtrl->setEnabled(false); - - mLocationText->setTextArg("[LANDING]", getString("landing_point_none")); - mSetBtn->setEnabled(false); - mClearBtn->setEnabled(false); - - mMatureCtrl->setEnabled(false); - } - else - { - // something selected, hooray! - - // Display options - bool can_change_options = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_OPTIONS); - mCheckEditObjects ->set( parcel->getAllowModify() ); - mCheckEditObjects ->setEnabled( can_change_options ); - - mCheckEditGroupObjects ->set( parcel->getAllowGroupModify() || parcel->getAllowModify()); - mCheckEditGroupObjects ->setEnabled( can_change_options && !parcel->getAllowModify() ); // If others edit is enabled, then this is explicitly enabled. - - mCheckAllObjectEntry ->set( parcel->getAllowAllObjectEntry() ); - mCheckAllObjectEntry ->setEnabled( can_change_options ); - - mCheckGroupObjectEntry ->set( parcel->getAllowGroupObjectEntry() || parcel->getAllowAllObjectEntry()); - mCheckGroupObjectEntry ->setEnabled( can_change_options && !parcel->getAllowAllObjectEntry() ); - - mCheckSafe ->set( !parcel->getAllowDamage() ); - mCheckSafe ->setEnabled( can_change_options ); - - mCheckFly ->set( parcel->getAllowFly() ); - mCheckFly ->setEnabled( can_change_options ); - - mCheckGroupScripts ->set( parcel->getAllowGroupScripts() || parcel->getAllowOtherScripts()); - mCheckGroupScripts ->setEnabled( can_change_options && !parcel->getAllowOtherScripts()); - - mCheckOtherScripts ->set( parcel->getAllowOtherScripts() ); - mCheckOtherScripts ->setEnabled( can_change_options ); - - mPushRestrictionCtrl->set( parcel->getRestrictPushObject() ); - if(parcel->getRegionPushOverride()) - { - mPushRestrictionCtrl->setLabel(getString("push_restrict_region_text")); - mPushRestrictionCtrl->setEnabled(false); - mPushRestrictionCtrl->set(true); - } - else - { - mPushRestrictionCtrl->setLabel(getString("push_restrict_text")); - mPushRestrictionCtrl->setEnabled(can_change_options); - } - - mSeeAvatarsCtrl->set(parcel->getSeeAVs()); - mSeeAvatarsCtrl->setEnabled(can_change_options && parcel->getHaveNewParcelLimitData()); - mSeeAvatarsText->setEnabled(can_change_options && parcel->getHaveNewParcelLimitData()); - - bool can_change_landing_point = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, - GP_LAND_SET_LANDING_POINT); - mLandingTypeCombo->setCurrentByIndex((S32)parcel->getLandingType()); - mLandingTypeCombo->setEnabled( can_change_landing_point ); - - bool can_change_identity = - LLViewerParcelMgr::isParcelModifiableByAgent( - parcel, GP_LAND_CHANGE_IDENTITY); - mSnapshotCtrl->setImageAssetID(parcel->getSnapshotID()); - mSnapshotCtrl->setEnabled( can_change_identity ); - - // find out where we're looking and convert that to an angle in degrees on a regular compass (not the internal representation) - LLVector3 user_look_at = parcel->getUserLookAt(); - U32 user_look_at_angle = ( (U32)( ( atan2(user_look_at[1], -user_look_at[0]) + F_PI * 2 ) * RAD_TO_DEG + 0.5) - 90) % 360; - - LLVector3 pos = parcel->getUserLocation(); - if (pos.isExactlyZero()) - { - mLocationText->setTextArg("[LANDING]", getString("landing_point_none")); - } - else - { - mLocationText->setTextArg("[LANDING]",llformat("%d, %d, %d (%d\xC2\xB0)", - ll_round(pos.mV[VX]), - ll_round(pos.mV[VY]), - ll_round(pos.mV[VZ]), - user_look_at_angle)); - } - - mSetBtn->setEnabled( can_change_landing_point ); - mClearBtn->setEnabled( can_change_landing_point ); - - if (gAgent.wantsPGOnly()) - { - // Disable these buttons if they are PG (Teen) users - mMatureCtrl->setVisible(false); - mMatureCtrl->setEnabled(false); - } - else - { - // not teen so fill in the data for the maturity control - mMatureCtrl->setVisible(true); - LLStyle::Params style; - style.image(LLUI::getUIImage(gFloaterView->getParentFloater(this)->getString("maturity_icon_moderate"))); - LLCheckBoxWithTBAcess* fullaccess_mature_ctrl = (LLCheckBoxWithTBAcess*)mMatureCtrl; - fullaccess_mature_ctrl->getTextBox()->setText(LLStringExplicit("")); - fullaccess_mature_ctrl->getTextBox()->appendImageSegment(style); - fullaccess_mature_ctrl->getTextBox()->appendText(getString("mature_check_mature"), false); - fullaccess_mature_ctrl->setToolTip(getString("mature_check_mature_tooltip")); - fullaccess_mature_ctrl->reshape(fullaccess_mature_ctrl->getRect().getWidth(), fullaccess_mature_ctrl->getRect().getHeight(), false); - - // they can see the checkbox, but its disposition depends on the - // state of the region - LLViewerRegion* regionp = LLViewerParcelMgr::getInstance()->getSelectionRegion(); - if (regionp) - { - if (regionp->getSimAccess() == SIM_ACCESS_PG) - { - mMatureCtrl->setEnabled(false); - mMatureCtrl->set(false); - } - else if (regionp->getSimAccess() == SIM_ACCESS_MATURE) - { - mMatureCtrl->setEnabled(can_change_identity); - mMatureCtrl->set(parcel->getMaturePublish()); - } - else if (regionp->getSimAccess() == SIM_ACCESS_ADULT) - { - mMatureCtrl->setEnabled(false); - mMatureCtrl->set(true); - mMatureCtrl->setLabel(getString("mature_check_adult")); - mMatureCtrl->setToolTip(getString("mature_check_adult_tooltip")); - } - } - } - } -} - -// virtual -void LLPanelLandOptions::draw() -{ - LLPanel::draw(); -} - - -// private -void LLPanelLandOptions::refreshSearch() -{ - LLParcel *parcel = mParcel->getParcel(); - if (!parcel || gDisconnected) - { - mCheckShowDirectory->set(false); - mCheckShowDirectory->setEnabled(false); - - const std::string& none_string = LLParcel::getCategoryString(LLParcel::C_NONE); - mCategoryCombo->setValue(none_string); - mCategoryCombo->setEnabled(false); - return; - } - - LLViewerRegion* region = - LLViewerParcelMgr::getInstance()->getSelectionRegion(); - - bool can_change = - LLViewerParcelMgr::isParcelModifiableByAgent( - parcel, GP_LAND_FIND_PLACES) - && region - && !(region->getRegionFlag(REGION_FLAGS_BLOCK_PARCEL_SEARCH)); - - bool show_directory = parcel->getParcelFlag(PF_SHOW_DIRECTORY); - mCheckShowDirectory->set(show_directory); - - // Set by string in case the order in UI doesn't match the order by index. - LLParcel::ECategory cat = parcel->getCategory(); - const std::string& category_string = LLParcel::getCategoryString(cat); - mCategoryCombo->setValue(category_string); - - std::string tooltip; - bool enable_show_directory = false; - // Parcels <= 128 square meters cannot be listed in search, in an - // effort to reduce search spam from small parcels. See also - // the search crawler "grid-crawl.py" in secondlife.com/doc/app/search/ JC - const S32 MIN_PARCEL_AREA_FOR_SEARCH = 128; - bool large_enough = parcel->getArea() >= MIN_PARCEL_AREA_FOR_SEARCH; - if (large_enough) - { - if (can_change) - { - tooltip = getString("search_enabled_tooltip"); - enable_show_directory = true; - } - else - { - tooltip = getString("search_disabled_permissions_tooltip"); - enable_show_directory = false; - } - } - else - { - // not large enough to include in search - if (can_change) - { - if (show_directory) - { - // parcels that are too small, but are still in search for - // legacy reasons, need to have the check box enabled so - // the owner can delist the parcel. JC - tooltip = getString("search_enabled_tooltip"); - enable_show_directory = true; - } - else - { - tooltip = getString("search_disabled_small_tooltip"); - enable_show_directory = false; - } - } - else - { - // both too small and don't have permission, so just - // show the permissions as the reason (which is probably - // the more common case) JC - tooltip = getString("search_disabled_permissions_tooltip"); - enable_show_directory = false; - } - } - mCheckShowDirectory->setToolTip(tooltip); - mCategoryCombo->setToolTip(tooltip); - mCheckShowDirectory->setEnabled(enable_show_directory); - mCategoryCombo->setEnabled(enable_show_directory); -} - - -// static -void LLPanelLandOptions::onCommitAny(LLUICtrl *ctrl, void *userdata) -{ - LLPanelLandOptions *self = (LLPanelLandOptions *)userdata; - - LLParcel* parcel = self->mParcel->getParcel(); - if (!parcel) - { - return; - } - - // Extract data from UI - bool create_objects = self->mCheckEditObjects->get(); - bool create_group_objects = self->mCheckEditGroupObjects->get() || self->mCheckEditObjects->get(); - bool all_object_entry = self->mCheckAllObjectEntry->get(); - bool group_object_entry = self->mCheckGroupObjectEntry->get() || self->mCheckAllObjectEntry->get(); - bool allow_terraform = false; // removed from UI so always off now - self->mCheckEditLand->get(); - bool allow_damage = !self->mCheckSafe->get(); - bool allow_fly = self->mCheckFly->get(); - bool allow_landmark = true; // cannot restrict landmark creation - bool allow_other_scripts = self->mCheckOtherScripts->get(); - bool allow_group_scripts = self->mCheckGroupScripts->get() || allow_other_scripts; - bool allow_publish = false; - bool mature_publish = self->mMatureCtrl->get(); - bool push_restriction = self->mPushRestrictionCtrl->get(); - bool see_avs = self->mSeeAvatarsCtrl->get(); - bool show_directory = self->mCheckShowDirectory->get(); - // we have to get the index from a lookup, not from the position in the dropdown! - S32 category_index = LLParcel::getCategoryFromString(self->mCategoryCombo->getSelectedValue()); - S32 landing_type_index = self->mLandingTypeCombo->getCurrentIndex(); - LLUUID snapshot_id = self->mSnapshotCtrl->getImageAssetID(); - LLViewerRegion* region; - region = LLViewerParcelMgr::getInstance()->getSelectionRegion(); - - if (region && region->getAllowDamage()) - { // Damage is allowed on the region - server will always allow scripts - if ( (!allow_other_scripts && parcel->getParcelFlag(PF_ALLOW_OTHER_SCRIPTS)) || - (!allow_group_scripts && parcel->getParcelFlag(PF_ALLOW_GROUP_SCRIPTS)) ) - { // Don't allow turning off "Run Scripts" if damage is allowed in the region - self->mCheckOtherScripts->set(parcel->getParcelFlag(PF_ALLOW_OTHER_SCRIPTS)); // Restore UI to actual settings - self->mCheckGroupScripts->set(parcel->getParcelFlag(PF_ALLOW_GROUP_SCRIPTS)); - LLNotificationsUtil::add("UnableToDisableOutsideScripts"); - return; - } - } - - // Push data into current parcel - parcel->setParcelFlag(PF_CREATE_OBJECTS, create_objects); - parcel->setParcelFlag(PF_CREATE_GROUP_OBJECTS, create_group_objects); - parcel->setParcelFlag(PF_ALLOW_ALL_OBJECT_ENTRY, all_object_entry); - parcel->setParcelFlag(PF_ALLOW_GROUP_OBJECT_ENTRY, group_object_entry); - parcel->setParcelFlag(PF_ALLOW_TERRAFORM, allow_terraform); - parcel->setParcelFlag(PF_ALLOW_DAMAGE, allow_damage); - parcel->setParcelFlag(PF_ALLOW_FLY, allow_fly); - parcel->setParcelFlag(PF_ALLOW_LANDMARK, allow_landmark); - parcel->setParcelFlag(PF_ALLOW_GROUP_SCRIPTS, allow_group_scripts); - parcel->setParcelFlag(PF_ALLOW_OTHER_SCRIPTS, allow_other_scripts); - parcel->setParcelFlag(PF_SHOW_DIRECTORY, show_directory); - parcel->setParcelFlag(PF_ALLOW_PUBLISH, allow_publish); - parcel->setParcelFlag(PF_MATURE_PUBLISH, mature_publish); - parcel->setParcelFlag(PF_RESTRICT_PUSHOBJECT, push_restriction); - parcel->setCategory((LLParcel::ECategory)category_index); - parcel->setLandingType((LLParcel::ELandingType)landing_type_index); - parcel->setSnapshotID(snapshot_id); - parcel->setSeeAVs(see_avs); - - // Send current parcel data upstream to server - LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate( parcel ); - - // Might have changed properties, so let's redraw! - self->refresh(); -} - - -// static -void LLPanelLandOptions::onClickSet(void* userdata) -{ - LLPanelLandOptions* self = (LLPanelLandOptions*)userdata; - - LLParcel* selected_parcel = self->mParcel->getParcel(); - if (!selected_parcel) return; - - LLParcel* agent_parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); - if (!agent_parcel) return; - - if (agent_parcel->getLocalID() != selected_parcel->getLocalID()) - { - LLNotificationsUtil::add("MustBeInParcel"); - return; - } - - LLVector3 pos_region = gAgent.getPositionAgent(); - selected_parcel->setUserLocation(pos_region); - selected_parcel->setUserLookAt(gAgent.getFrameAgent().getAtAxis()); - - LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate(selected_parcel); - - self->refresh(); -} - -void LLPanelLandOptions::onClickClear(void* userdata) -{ - LLPanelLandOptions* self = (LLPanelLandOptions*)userdata; - - LLParcel* selected_parcel = self->mParcel->getParcel(); - if (!selected_parcel) return; - - // yes, this magic number of 0,0,0 means that it is clear - LLVector3 zero_vec(0.f, 0.f, 0.f); - selected_parcel->setUserLocation(zero_vec); - selected_parcel->setUserLookAt(zero_vec); - - LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate(selected_parcel); - - self->refresh(); -} - -void LLPanelLandOptions::toggleSeeAvatars(void* userdata) -{ - LLPanelLandOptions* self = (LLPanelLandOptions*)userdata; - if (self) - { - self->getChild<LLCheckBoxCtrl>("SeeAvatarsCheck")->toggle(); - self->getChild<LLCheckBoxCtrl>("SeeAvatarsCheck")->setBtnFocus(); - self->onCommitAny(NULL, userdata); - } -} -//--------------------------------------------------------------------------- -// LLPanelLandAccess -//--------------------------------------------------------------------------- - -LLPanelLandAccess::LLPanelLandAccess(LLParcelSelectionHandle& parcel) - : LLPanel(), - mParcel(parcel) -{ -} - - -bool LLPanelLandAccess::postBuild() -{ - childSetCommitCallback("public_access", onCommitPublicAccess, this); - childSetCommitCallback("limit_payment", onCommitAny, this); - childSetCommitCallback("limit_age_verified", onCommitAny, this); - childSetCommitCallback("GroupCheck", onCommitGroupCheck, this); - childSetCommitCallback("PassCheck", onCommitAny, this); - childSetCommitCallback("pass_combo", onCommitAny, this); - childSetCommitCallback("PriceSpin", onCommitAny, this); - childSetCommitCallback("HoursSpin", onCommitAny, this); - - childSetAction("add_allowed", boost::bind(&LLPanelLandAccess::onClickAddAccess, this)); - childSetAction("remove_allowed", onClickRemoveAccess, this); - childSetAction("add_banned", boost::bind(&LLPanelLandAccess::onClickAddBanned, this)); - childSetAction("remove_banned", onClickRemoveBanned, this); - - mListAccess = getChild<LLNameListCtrl>("AccessList"); - if (mListAccess) - { - mListAccess->sortByColumnIndex(0, true); // ascending - mListAccess->setContextMenu(LLScrollListCtrl::MENU_AVATAR); - } - - mListBanned = getChild<LLNameListCtrl>("BannedList"); - if (mListBanned) - { - mListBanned->sortByColumnIndex(0, true); // ascending - mListBanned->setContextMenu(LLScrollListCtrl::MENU_AVATAR); - mListBanned->setAlternateSort(); - } - - return true; -} - - -LLPanelLandAccess::~LLPanelLandAccess() -{ -} - -void LLPanelLandAccess::refresh() -{ - LLFloater* parent_floater = gFloaterView->getParentFloater(this); - LLParcel *parcel = mParcel->getParcel(); - - // Display options - if (parcel && !gDisconnected) - { - bool use_access_list = parcel->getParcelFlag(PF_USE_ACCESS_LIST); - bool use_group = parcel->getParcelFlag(PF_USE_ACCESS_GROUP); - bool public_access = !use_access_list; - - if (parcel->getRegionAllowAccessOverride()) - { - getChild<LLUICtrl>("public_access")->setValue(public_access); - getChild<LLUICtrl>("GroupCheck")->setValue(use_group); - } - else - { - getChild<LLUICtrl>("public_access")->setValue(true); - getChild<LLUICtrl>("GroupCheck")->setValue(false); - } - std::string group_name; - gCacheName->getGroupName(parcel->getGroupID(), group_name); - getChild<LLUICtrl>("GroupCheck")->setLabelArg("[GROUP]", group_name ); - - // Allow list - if (mListAccess) - { - // Clear the sort order so we don't re-sort on every add. - mListAccess->clearSortOrder(); - mListAccess->deleteAllItems(); - S32 count = parcel->mAccessList.size(); - getChild<LLUICtrl>("AllowedText")->setTextArg("[COUNT]", llformat("%d",count)); - getChild<LLUICtrl>("AllowedText")->setTextArg("[MAX]", llformat("%d",PARCEL_MAX_ACCESS_LIST)); - - getChild<LLUICtrl>("AccessList")->setToolTipArg(LLStringExplicit("[LISTED]"), llformat("%d",count)); - getChild<LLUICtrl>("AccessList")->setToolTipArg(LLStringExplicit("[MAX]"), llformat("%d",PARCEL_MAX_ACCESS_LIST)); - - for (LLAccessEntry::map::const_iterator cit = parcel->mAccessList.begin(); - cit != parcel->mAccessList.end(); ++cit) - { - const LLAccessEntry& entry = (*cit).second; - std::string prefix; - if (entry.mTime != 0) - { - LLStringUtil::format_map_t args; - S32 now = time(NULL); - S32 seconds = entry.mTime - now; - if (seconds < 0) seconds = 0; - prefix.assign(" ("); - if (seconds >= 120) - { - args["[MINUTES]"] = llformat("%d", (seconds/60)); - std::string buf = parent_floater->getString ("Minutes", args); - prefix.append(buf); - } - else if (seconds >= 60) - { - prefix.append("1 " + parent_floater->getString("Minute")); - } - else - { - args["[SECONDS]"] = llformat("%d", seconds); - std::string buf = parent_floater->getString ("Seconds", args); - prefix.append(buf); - } - prefix.append(" " + parent_floater->getString("Remaining") + ") "); - } - mListAccess->addNameItem(entry.mID, ADD_DEFAULT, true, "", prefix); - } - mListAccess->sortByName(true); - } - - // Ban List - if(mListBanned) - { - // Clear the sort order so we don't re-sort on every add. - mListBanned->clearSortOrder(); - mListBanned->deleteAllItems(); - S32 count = parcel->mBanList.size(); - getChild<LLUICtrl>("BanCheck")->setTextArg("[COUNT]", llformat("%d",count)); - getChild<LLUICtrl>("BanCheck")->setTextArg("[MAX]", llformat("%d",PARCEL_MAX_ACCESS_LIST)); - - getChild<LLUICtrl>("BannedList")->setToolTipArg(LLStringExplicit("[LISTED]"), llformat("%d",count)); - getChild<LLUICtrl>("BannedList")->setToolTipArg(LLStringExplicit("[MAX]"), llformat("%d",PARCEL_MAX_ACCESS_LIST)); - - for (LLAccessEntry::map::const_iterator cit = parcel->mBanList.begin(); - cit != parcel->mBanList.end(); ++cit) - { - const LLAccessEntry& entry = (*cit).second; - std::string duration; - S32 seconds = -1; - if (entry.mTime != 0) - { - LLStringUtil::format_map_t args; - S32 now = time(NULL); - seconds = entry.mTime - now; - if (seconds < 0) seconds = 0; - - if (seconds >= 7200) - { - args["[HOURS]"] = llformat("%d", (seconds / 3600)); - duration = parent_floater->getString("Hours", args); - } - else if (seconds >= 3600) - { - duration = "1 " + parent_floater->getString("Hour"); - } - else if (seconds >= 120) - { - args["[MINUTES]"] = llformat("%d", (seconds / 60)); - duration = parent_floater->getString("Minutes", args); - } - else if (seconds >= 60) - { - duration = "1 " + parent_floater->getString("Minute"); - } - else - { - args["[SECONDS]"] = llformat("%d", seconds); - duration = parent_floater->getString("Seconds", args); - } - } - else - { - duration = parent_floater->getString("Always"); - } - LLSD item; - item["id"] = entry.mID; - LLSD& columns = item["columns"]; - columns[0]["column"] = "name"; // to be populated later - columns[1]["column"] = "duration"; - columns[1]["value"] = duration; - columns[1]["alt_value"] = entry.mTime != 0 ? std::to_string(seconds) : "Always"; - mListBanned->addElement(item); - } - mListBanned->sortByName(true); - } - - if(parcel->getRegionDenyAnonymousOverride()) - { - getChild<LLUICtrl>("limit_payment")->setValue(true); - getChild<LLUICtrl>("limit_payment")->setLabelArg("[ESTATE_PAYMENT_LIMIT]", getString("access_estate_defined") ); - } - else - { - getChild<LLUICtrl>("limit_payment")->setValue((parcel->getParcelFlag(PF_DENY_ANONYMOUS))); - getChild<LLUICtrl>("limit_payment")->setLabelArg("[ESTATE_PAYMENT_LIMIT]", std::string() ); - } - if(parcel->getRegionDenyAgeUnverifiedOverride()) - { - getChild<LLUICtrl>("limit_age_verified")->setValue(true); - getChild<LLUICtrl>("limit_age_verified")->setLabelArg("[ESTATE_AGE_LIMIT]", getString("access_estate_defined") ); - } - else - { - getChild<LLUICtrl>("limit_age_verified")->setValue((parcel->getParcelFlag(PF_DENY_AGEUNVERIFIED))); - getChild<LLUICtrl>("limit_age_verified")->setLabelArg("[ESTATE_AGE_LIMIT]", std::string() ); - } - - bool use_pass = parcel->getParcelFlag(PF_USE_PASS_LIST); - getChild<LLUICtrl>("PassCheck")->setValue(use_pass); - LLCtrlSelectionInterface* passcombo = childGetSelectionInterface("pass_combo"); - if (passcombo) - { - if (public_access || !use_pass) - { - passcombo->selectByValue("anyone"); - } - } - - S32 pass_price = parcel->getPassPrice(); - getChild<LLUICtrl>("PriceSpin")->setValue((F32)pass_price ); - - F32 pass_hours = parcel->getPassHours(); - getChild<LLUICtrl>("HoursSpin")->setValue(pass_hours ); - } - else - { - getChild<LLUICtrl>("public_access")->setValue(false); - getChild<LLUICtrl>("limit_payment")->setValue(false); - getChild<LLUICtrl>("limit_age_verified")->setValue(false); - getChild<LLUICtrl>("GroupCheck")->setValue(false); - getChild<LLUICtrl>("GroupCheck")->setLabelArg("[GROUP]", LLStringUtil::null ); - getChild<LLUICtrl>("PassCheck")->setValue(false); - getChild<LLUICtrl>("PriceSpin")->setValue((F32)PARCEL_PASS_PRICE_DEFAULT); - getChild<LLUICtrl>("HoursSpin")->setValue(PARCEL_PASS_HOURS_DEFAULT ); - getChild<LLUICtrl>("AccessList")->setToolTipArg(LLStringExplicit("[LISTED]"), llformat("%d",0)); - getChild<LLUICtrl>("AccessList")->setToolTipArg(LLStringExplicit("[MAX]"), llformat("%d",0)); - getChild<LLUICtrl>("BannedList")->setToolTipArg(LLStringExplicit("[LISTED]"), llformat("%d",0)); - getChild<LLUICtrl>("BannedList")->setToolTipArg(LLStringExplicit("[MAX]"), llformat("%d",0)); - } -} - -void LLPanelLandAccess::refresh_ui() -{ - getChildView("public_access")->setEnabled(false); - getChildView("limit_payment")->setEnabled(false); - getChildView("limit_age_verified")->setEnabled(false); - getChildView("GroupCheck")->setEnabled(false); - getChildView("PassCheck")->setEnabled(false); - getChildView("pass_combo")->setEnabled(false); - getChildView("PriceSpin")->setEnabled(false); - getChildView("HoursSpin")->setEnabled(false); - getChildView("AccessList")->setEnabled(false); - getChildView("BannedList")->setEnabled(false); - getChildView("add_allowed")->setEnabled(false); - getChildView("remove_allowed")->setEnabled(false); - getChildView("add_banned")->setEnabled(false); - getChildView("remove_banned")->setEnabled(false); - - LLParcel *parcel = mParcel->getParcel(); - if (parcel && !gDisconnected) - { - bool can_manage_allowed = false; - bool can_manage_banned = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_MANAGE_BANNED); - - if (parcel->getRegionAllowAccessOverride()) - { // Estate owner may have disabled allowing the parcel owner from managing access. - can_manage_allowed = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_MANAGE_ALLOWED); - } - - getChildView("public_access")->setEnabled(can_manage_allowed); - bool public_access = getChild<LLUICtrl>("public_access")->getValue().asBoolean(); - if (public_access) - { - bool override = false; - if(parcel->getRegionDenyAnonymousOverride()) - { - override = true; - getChildView("limit_payment")->setEnabled(false); - } - else - { - getChildView("limit_payment")->setEnabled(can_manage_allowed); - } - if(parcel->getRegionDenyAgeUnverifiedOverride()) - { - override = true; - getChildView("limit_age_verified")->setEnabled(false); - } - else - { - getChildView("limit_age_verified")->setEnabled(can_manage_allowed); - } - if (override) - { - getChildView("Only Allow")->setToolTip(getString("estate_override")); - } - else - { - getChildView("Only Allow")->setToolTip(std::string()); - } - getChildView("PassCheck")->setEnabled(false); - getChildView("pass_combo")->setEnabled(false); - getChildView("AccessList")->setEnabled(false); - } - else - { - getChildView("limit_payment")->setEnabled(false); - getChildView("limit_age_verified")->setEnabled(false); - - - bool sell_passes = getChild<LLUICtrl>("PassCheck")->getValue().asBoolean(); - getChildView("PassCheck")->setEnabled(can_manage_allowed); - if (sell_passes) - { - getChildView("pass_combo")->setEnabled(can_manage_allowed); - getChildView("PriceSpin")->setEnabled(can_manage_allowed); - getChildView("HoursSpin")->setEnabled(can_manage_allowed); - } - } - std::string group_name; - if (gCacheName->getGroupName(parcel->getGroupID(), group_name)) - { - bool can_allow_groups = !public_access || (public_access && (getChild<LLUICtrl>("limit_payment")->getValue().asBoolean() ^ getChild<LLUICtrl>("limit_age_verified")->getValue().asBoolean())); - getChildView("GroupCheck")->setEnabled(can_manage_allowed && can_allow_groups); - } - getChildView("AccessList")->setEnabled(can_manage_allowed); - S32 allowed_list_count = parcel->mAccessList.size(); - getChildView("add_allowed")->setEnabled(can_manage_allowed && allowed_list_count < PARCEL_MAX_ACCESS_LIST); - bool has_selected = (mListAccess && mListAccess->getSelectionInterface()->getFirstSelectedIndex() >= 0); - getChildView("remove_allowed")->setEnabled(can_manage_allowed && has_selected); - - getChildView("BannedList")->setEnabled(can_manage_banned); - S32 banned_list_count = parcel->mBanList.size(); - getChildView("add_banned")->setEnabled(can_manage_banned && banned_list_count < PARCEL_MAX_ACCESS_LIST); - has_selected = (mListBanned && mListBanned->getSelectionInterface()->getFirstSelectedIndex() >= 0); - getChildView("remove_banned")->setEnabled(can_manage_banned && has_selected); - } -} - - -// public -void LLPanelLandAccess::refreshNames() -{ - LLParcel* parcel = mParcel->getParcel(); - std::string group_name; - if(parcel) - { - gCacheName->getGroupName(parcel->getGroupID(), group_name); - } - getChild<LLUICtrl>("GroupCheck")->setLabelArg("[GROUP]", group_name); -} - - -// virtual -void LLPanelLandAccess::draw() -{ - refresh_ui(); - refreshNames(); - LLPanel::draw(); -} - -// static -void LLPanelLandAccess::onCommitPublicAccess(LLUICtrl *ctrl, void *userdata) -{ - LLPanelLandAccess *self = (LLPanelLandAccess *)userdata; - LLParcel* parcel = self->mParcel->getParcel(); - if (!parcel) - { - return; - } - - onCommitAny(ctrl, userdata); -} - -void LLPanelLandAccess::onCommitGroupCheck(LLUICtrl *ctrl, void *userdata) -{ - LLPanelLandAccess *self = (LLPanelLandAccess *)userdata; - LLParcel* parcel = self->mParcel->getParcel(); - if (!parcel) - { - return; - } - - bool use_pass_list = !self->getChild<LLUICtrl>("public_access")->getValue().asBoolean(); - bool use_access_group = self->getChild<LLUICtrl>("GroupCheck")->getValue().asBoolean(); - LLCtrlSelectionInterface* passcombo = self->childGetSelectionInterface("pass_combo"); - if (passcombo) - { - if (use_access_group && use_pass_list) - { - if (passcombo->getSelectedValue().asString() == "group") - { - passcombo->selectByValue("anyone"); - } - } - } - - onCommitAny(ctrl, userdata); -} - -// static -void LLPanelLandAccess::onCommitAny(LLUICtrl *ctrl, void *userdata) -{ - LLPanelLandAccess *self = (LLPanelLandAccess *)userdata; - - LLParcel* parcel = self->mParcel->getParcel(); - if (!parcel) - { - return; - } - - // Extract data from UI - bool public_access = self->getChild<LLUICtrl>("public_access")->getValue().asBoolean(); - bool use_access_group = self->getChild<LLUICtrl>("GroupCheck")->getValue().asBoolean(); - if (use_access_group) - { - std::string group_name; - if (!gCacheName->getGroupName(parcel->getGroupID(), group_name)) - { - use_access_group = false; - } - } - - bool limit_payment = false, limit_age_verified = false; - bool use_access_list = false; - bool use_pass_list = false; - - if (public_access) - { - use_access_list = false; - limit_payment = self->getChild<LLUICtrl>("limit_payment")->getValue().asBoolean(); - limit_age_verified = self->getChild<LLUICtrl>("limit_age_verified")->getValue().asBoolean(); - } - else - { - use_access_list = true; - use_pass_list = self->getChild<LLUICtrl>("PassCheck")->getValue().asBoolean(); - LLCtrlSelectionInterface* passcombo = self->childGetSelectionInterface("pass_combo"); - if (passcombo) - { - if (use_access_group && use_pass_list) - { - if (passcombo->getSelectedValue().asString() == "group") - { - use_access_group = false; - } - } - } - } - - S32 pass_price = llfloor((F32)self->getChild<LLUICtrl>("PriceSpin")->getValue().asReal()); - F32 pass_hours = (F32)self->getChild<LLUICtrl>("HoursSpin")->getValue().asReal(); - - // Push data into current parcel - parcel->setParcelFlag(PF_USE_ACCESS_GROUP, use_access_group); - parcel->setParcelFlag(PF_USE_ACCESS_LIST, use_access_list); - parcel->setParcelFlag(PF_USE_PASS_LIST, use_pass_list); - parcel->setParcelFlag(PF_USE_BAN_LIST, true); - parcel->setParcelFlag(PF_DENY_ANONYMOUS, limit_payment); - parcel->setParcelFlag(PF_DENY_AGEUNVERIFIED, limit_age_verified); - - parcel->setPassPrice( pass_price ); - parcel->setPassHours( pass_hours ); - - // Send current parcel data upstream to server - LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate( parcel ); - - // Might have changed properties, so let's redraw! - self->refresh(); -} - -void LLPanelLandAccess::onClickAddAccess() -{ - LLView * button = findChild<LLButton>("add_allowed"); - LLFloater * root_floater = gFloaterView->getParentFloater(this); - LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show( - boost::bind(&LLPanelLandAccess::callbackAvatarCBAccess, this, _1), false, false, false, root_floater->getName(), button); - if (picker) - { - root_floater->addDependentFloater(picker); - } -} - -void LLPanelLandAccess::callbackAvatarCBAccess(const uuid_vec_t& ids) -{ - if (!ids.empty()) - { - LLUUID id = ids[0]; - LLParcel* parcel = mParcel->getParcel(); - if (parcel && parcel->addToAccessList(id, 0)) - { - U32 lists_to_update = AL_ACCESS; - // agent was successfully added to access list - // but we also need to check ban list to ensure that agent will not be in two lists simultaneously - if(parcel->removeFromBanList(id)) - { - lists_to_update |= AL_BAN; - } - LLViewerParcelMgr::getInstance()->sendParcelAccessListUpdate(lists_to_update); - refresh(); - } - } -} - -// static -void LLPanelLandAccess::onClickRemoveAccess(void* data) -{ - LLPanelLandAccess* panelp = (LLPanelLandAccess*)data; - if (panelp && panelp->mListAccess) - { - LLParcel* parcel = panelp->mParcel->getParcel(); - if (parcel) - { - std::vector<LLScrollListItem*> names = panelp->mListAccess->getAllSelected(); - for (std::vector<LLScrollListItem*>::iterator iter = names.begin(); - iter != names.end(); ) - { - LLScrollListItem* item = *iter++; - const LLUUID& agent_id = item->getUUID(); - parcel->removeFromAccessList(agent_id); - } - LLViewerParcelMgr::getInstance()->sendParcelAccessListUpdate(AL_ACCESS); - panelp->refresh(); - } - } -} - -// static -void LLPanelLandAccess::onClickAddBanned() -{ - LLView * button = findChild<LLButton>("add_banned"); - LLFloater * root_floater = gFloaterView->getParentFloater(this); - LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show( - boost::bind(&LLPanelLandAccess::callbackAvatarCBBanned, this, _1), true, false, false, root_floater->getName(), button); - if (picker) - { - root_floater->addDependentFloater(picker); - } -} - -// static -void LLPanelLandAccess::callbackAvatarCBBanned(const uuid_vec_t& ids) -{ - LLFloater * root_floater = gFloaterView->getParentFloater(this); - LLFloaterBanDuration* duration_floater = LLFloaterBanDuration::show( - boost::bind(&LLPanelLandAccess::callbackAvatarCBBanned2, this, _1, _2), ids); - if (duration_floater) - { - root_floater->addDependentFloater(duration_floater); - } -} - -void LLPanelLandAccess::callbackAvatarCBBanned2(const uuid_vec_t& ids, S32 duration) -{ - LLParcel* parcel = mParcel->getParcel(); - if (!parcel) return; - - U32 lists_to_update = 0; - - for (uuid_vec_t::const_iterator it = ids.begin(); it < ids.end(); it++) - { - LLUUID id = *it; - if (parcel->addToBanList(id, duration)) - { - lists_to_update |= AL_BAN; - // agent was successfully added to ban list - // but we also need to check access list to ensure that agent will not be in two lists simultaneously - if (parcel->removeFromAccessList(id)) - { - lists_to_update |= AL_ACCESS; - } - } - } - if (lists_to_update > 0) - { - LLViewerParcelMgr::getInstance()->sendParcelAccessListUpdate(lists_to_update); - refresh(); - } -} - -// static -void LLPanelLandAccess::onClickRemoveBanned(void* data) -{ - LLPanelLandAccess* panelp = (LLPanelLandAccess*)data; - if (panelp && panelp->mListBanned) - { - LLParcel* parcel = panelp->mParcel->getParcel(); - if (parcel) - { - std::vector<LLScrollListItem*> names = panelp->mListBanned->getAllSelected(); - for (std::vector<LLScrollListItem*>::iterator iter = names.begin(); - iter != names.end(); ) - { - LLScrollListItem* item = *iter++; - const LLUUID& agent_id = item->getUUID(); - parcel->removeFromBanList(agent_id); - } - LLViewerParcelMgr::getInstance()->sendParcelAccessListUpdate(AL_BAN); - panelp->refresh(); - } - } -} - -//--------------------------------------------------------------------------- -// LLPanelLandCovenant -//--------------------------------------------------------------------------- -LLPanelLandCovenant::LLPanelLandCovenant(LLParcelSelectionHandle& parcel) - : LLPanel(), - mParcel(parcel), - mNextUpdateTime(0) -{ -} - -LLPanelLandCovenant::~LLPanelLandCovenant() -{ -} - -bool LLPanelLandCovenant::postBuild() -{ - mLastRegionID = LLUUID::null; - mNextUpdateTime = 0; - mTextEstateOwner = getChild<LLTextBox>("estate_owner_text"); - mTextEstateOwner->setIsFriendCallback(LLAvatarActions::isFriend); - return true; -} - -// virtual -void LLPanelLandCovenant::refresh() -{ - LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion(); - if(!region || gDisconnected) return; - - LLTextBox* region_name = getChild<LLTextBox>("region_name_text"); - if (region_name) - { - region_name->setText(region->getName()); - } - - LLTextBox* region_landtype = getChild<LLTextBox>("region_landtype_text"); - region_landtype->setText(region->getLocalizedSimProductName()); - - LLTextBox* region_maturity = getChild<LLTextBox>("region_maturity_text"); - if (region_maturity) - { - insert_maturity_into_textbox(region_maturity, gFloaterView->getParentFloater(this), MATURITY); - } - - LLTextBox* resellable_clause = getChild<LLTextBox>("resellable_clause"); - if (resellable_clause) - { - if (region->getRegionFlag(REGION_FLAGS_BLOCK_LAND_RESELL)) - { - resellable_clause->setText(getString("can_not_resell")); - } - else - { - resellable_clause->setText(getString("can_resell")); - } - } - - LLTextBox* changeable_clause = getChild<LLTextBox>("changeable_clause"); - if (changeable_clause) - { - if (region->getRegionFlag(REGION_FLAGS_ALLOW_PARCEL_CHANGES)) - { - changeable_clause->setText(getString("can_change")); - } - else - { - changeable_clause->setText(getString("can_not_change")); - } - } - - if (mLastRegionID != region->getRegionID() - || mNextUpdateTime < LLTimer::getElapsedSeconds()) - { - // Request Covenant Info - // Note: LLPanelLandCovenant doesn't change Covenant's content and any - // changes made by Estate floater should be requested by Estate floater - LLMessageSystem *msg = gMessageSystem; - msg->newMessage("EstateCovenantRequest"); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID()); - msg->sendReliable(region->getHost()); - - mLastRegionID = region->getRegionID(); - mNextUpdateTime = LLTimer::getElapsedSeconds() + COVENANT_REFRESH_TIME_SEC; - } -} - -// static -void LLPanelLandCovenant::updateCovenantText(const std::string &string) -{ - LLPanelLandCovenant* self = LLFloaterLand::getCurrentPanelLandCovenant(); - if (self) - { - LLViewerTextEditor* editor = self->getChild<LLViewerTextEditor>("covenant_editor"); - editor->setText(string); - } -} - -// static -void LLPanelLandCovenant::updateEstateName(const std::string& name) -{ - LLPanelLandCovenant* self = LLFloaterLand::getCurrentPanelLandCovenant(); - if (self) - { - LLTextBox* editor = self->getChild<LLTextBox>("estate_name_text"); - if (editor) editor->setText(name); - } -} - -// static -void LLPanelLandCovenant::updateLastModified(const std::string& text) -{ - LLPanelLandCovenant* self = LLFloaterLand::getCurrentPanelLandCovenant(); - if (self) - { - LLTextBox* editor = self->getChild<LLTextBox>("covenant_timestamp_text"); - if (editor) editor->setText(text); - } -} - -// static -void LLPanelLandCovenant::updateEstateOwnerName(const std::string& name) -{ - LLPanelLandCovenant* self = LLFloaterLand::getCurrentPanelLandCovenant(); - if (self) - { - self->mTextEstateOwner->setText(name); - } -} - -// inserts maturity info(icon and text) into target textbox -// names_floater - pointer to floater which contains strings with maturity icons filenames -// str_to_parse is string in format "txt1[MATURITY]txt2" where maturity icon and text will be inserted instead of [MATURITY] -void insert_maturity_into_textbox(LLTextBox* target_textbox, LLFloater* names_floater, std::string str_to_parse) -{ - LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion(); - if (!region) - return; - - LLStyle::Params style; - - U8 sim_access = region->getSimAccess(); - - switch(sim_access) - { - case SIM_ACCESS_PG: - style.image(LLUI::getUIImage(names_floater->getString("maturity_icon_general"))); - break; - - case SIM_ACCESS_ADULT: - style.image(LLUI::getUIImage(names_floater->getString("maturity_icon_adult"))); - break; - - case SIM_ACCESS_MATURE: - style.image(LLUI::getUIImage(names_floater->getString("maturity_icon_moderate"))); - break; - - default: - break; - } - - size_t maturity_pos = str_to_parse.find(MATURITY); - - if (maturity_pos == std::string::npos) - { - return; - } - - std::string text_before_rating = str_to_parse.substr(0, maturity_pos); - std::string text_after_rating = str_to_parse.substr(maturity_pos + MATURITY.length()); - - target_textbox->setText(text_before_rating); - - target_textbox->appendImageSegment(style); - - target_textbox->appendText(LLViewerParcelMgr::getInstance()->getSelectionRegion()->getSimAccessString(), false); - target_textbox->appendText(text_after_rating, false); -} - -LLPanelLandExperiences::LLPanelLandExperiences( LLSafeHandle<LLParcelSelection>& parcelp ) - : mParcel(parcelp) -{ - -} - - -bool LLPanelLandExperiences::postBuild() -{ - mAllowed = setupList("panel_allowed", EXPERIENCE_KEY_TYPE_ALLOWED, AL_ALLOW_EXPERIENCE); - mBlocked = setupList("panel_blocked", EXPERIENCE_KEY_TYPE_BLOCKED, AL_BLOCK_EXPERIENCE); - - // only non-grid-wide experiences - mAllowed->addFilter(boost::bind(LLPanelExperiencePicker::FilterWithProperty, _1, LLExperienceCache::PROPERTY_GRID)); - - // no privileged ones - mBlocked->addFilter(boost::bind(LLPanelExperiencePicker::FilterWithoutProperties, _1, LLExperienceCache::PROPERTY_PRIVILEGED|LLExperienceCache::PROPERTY_GRID)); - - getChild<LLLayoutPanel>("trusted_layout_panel")->setVisible(false); - getChild<LLTextBox>("experiences_help_text")->setVisible(false); - getChild<LLTextBox>("allowed_text_help")->setText(getString("allowed_parcel_text")); - getChild<LLTextBox>("blocked_text_help")->setText(getString("blocked_parcel_text")); - - return LLPanel::postBuild(); -} - -LLPanelExperienceListEditor* LLPanelLandExperiences::setupList( const char* control_name, U32 xp_type, U32 access_type ) -{ - LLPanelExperienceListEditor* child = findChild<LLPanelExperienceListEditor>(control_name); - if(child) - { - child->getChild<LLTextBox>("text_name")->setText(child->getString(control_name)); - child->setMaxExperienceIDs(PARCEL_MAX_EXPERIENCE_LIST); - child->setAddedCallback(boost::bind(&LLPanelLandExperiences::experienceAdded, this, _1, xp_type, access_type)); - child->setRemovedCallback(boost::bind(&LLPanelLandExperiences::experienceRemoved, this, _1, access_type)); - } - - return child; -} - -void LLPanelLandExperiences::experienceAdded( const LLUUID& id, U32 xp_type, U32 access_type ) -{ - LLParcel* parcel = mParcel->getParcel(); - if (parcel) - { - parcel->setExperienceKeyType(id, xp_type); - LLViewerParcelMgr::getInstance()->sendParcelAccessListUpdate(access_type); - refresh(); - } -} - -void LLPanelLandExperiences::experienceRemoved( const LLUUID& id, U32 access_type ) -{ - LLParcel* parcel = mParcel->getParcel(); - if (parcel) - { - parcel->setExperienceKeyType(id, EXPERIENCE_KEY_TYPE_NONE); - LLViewerParcelMgr::getInstance()->sendParcelAccessListUpdate(access_type); - refresh(); - } -} - -void LLPanelLandExperiences::refreshPanel(LLPanelExperienceListEditor* panel, U32 xp_type) -{ - LLParcel *parcel = mParcel->getParcel(); - - // Display options - if (panel == NULL) - { - return; - } - if (!parcel || gDisconnected) - { - // disable the panel - panel->setEnabled(false); - panel->setExperienceIds(LLSD::emptyArray()); - } - else - { - // enable the panel - panel->setEnabled(true); - LLAccessEntry::map entries = parcel->getExperienceKeysByType(xp_type); - LLAccessEntry::map::iterator it = entries.begin(); - LLSD ids = LLSD::emptyArray(); - for (/**/; it != entries.end(); ++it) - { - ids.append(it->second.mID); - } - panel->setExperienceIds(ids); - panel->setReadonly(!LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_OPTIONS)); - panel->refreshExperienceCounter(); - } -} - -void LLPanelLandExperiences::refresh() -{ - refreshPanel(mAllowed, EXPERIENCE_KEY_TYPE_ALLOWED); - refreshPanel(mBlocked, EXPERIENCE_KEY_TYPE_BLOCKED); -} - -//========================================================================= - -LLPanelLandEnvironment::LLPanelLandEnvironment(LLParcelSelectionHandle& parcel) : - LLPanelEnvironmentInfo(), - mParcel(parcel), - mLastParcelId(INVALID_PARCEL_ID) -{ -} - -bool LLPanelLandEnvironment::postBuild() -{ - if (!LLPanelEnvironmentInfo::postBuild()) - return false; - - getChild<LLUICtrl>(BTN_USEDEFAULT)->setLabelArg("[USEDEFAULT]", getString(STR_LABEL_USEREGION)); - getChild<LLUICtrl>(CHK_ALLOWOVERRIDE)->setVisible(false); - getChild<LLUICtrl>(PNL_REGION_MSG)->setVisible(false); - getChild<LLUICtrl>(PNL_ENVIRONMENT_ALTITUDES)->setVisible(true); - - return true; -} - -void LLPanelLandEnvironment::refresh() -{ - if (gDisconnected) - return; - - commitDayLenOffsetChanges(false); // commit unsaved changes if any - - if (!isSameRegion()) - { - setCrossRegion(true); - mCurrentEnvironment.reset(); - mLastParcelId = INVALID_PARCEL_ID; - mCurEnvVersion = INVALID_PARCEL_ENVIRONMENT_VERSION; - setControlsEnabled(false); - return; - } - - if (mLastParcelId != getParcelId()) - { - mCurEnvVersion = INVALID_PARCEL_ENVIRONMENT_VERSION; - mCurrentEnvironment.reset(); - } - - if (!mCurrentEnvironment && mCurEnvVersion <= INVALID_PARCEL_ENVIRONMENT_VERSION) - { - refreshFromSource(); - return; - } - - LLPanelEnvironmentInfo::refresh(); -} - -void LLPanelLandEnvironment::refreshFromSource() -{ - LLParcel *parcel = getParcel(); - - if (!LLEnvironment::instance().isExtendedEnvironmentEnabled()) - { - setNoEnvironmentSupport(true); - setControlsEnabled(false); - mCurEnvVersion = INVALID_PARCEL_ENVIRONMENT_VERSION; - return; - } - setNoEnvironmentSupport(false); - - if (!parcel) - { - setNoSelection(true); - setControlsEnabled(false); - mCurEnvVersion = INVALID_PARCEL_ENVIRONMENT_VERSION; - return; - } - - setNoSelection(false); - if (isSameRegion()) - { - LL_DEBUGS("ENVIRONMENT") << "Requesting environment for parcel " << parcel->getLocalID() << ", known version " << mCurEnvVersion << LL_ENDL; - setCrossRegion(false); - - LLHandle<LLPanel> that_h = getHandle(); - - if (mCurEnvVersion < UNSET_PARCEL_ENVIRONMENT_VERSION) - { - // to mark as requesting - mCurEnvVersion = parcel->getParcelEnvironmentVersion(); - } - mLastParcelId = parcel->getLocalID(); - - LLEnvironment::instance().requestParcel(parcel->getLocalID(), - [that_h](S32 parcel_id, LLEnvironment::EnvironmentInfo::ptr_t envifo) - { - LLPanelLandEnvironment *that = (LLPanelLandEnvironment*)that_h.get(); - if (!that) return; - that->mLastParcelId = parcel_id; - that->onEnvironmentReceived(parcel_id, envifo); - }); - } - else - { - setCrossRegion(true); - mCurrentEnvironment.reset(); - mLastParcelId = INVALID_PARCEL_ID; - mCurEnvVersion = INVALID_PARCEL_ENVIRONMENT_VERSION; - } - setControlsEnabled(false); -} - - -bool LLPanelLandEnvironment::isSameRegion() -{ - LLViewerRegion* regionp = LLViewerParcelMgr::instance().getSelectionRegion(); - - return (!regionp || (regionp->getRegionID() == gAgent.getRegion()->getRegionID())); -} - -LLParcel *LLPanelLandEnvironment::getParcel() -{ - return mParcel->getParcel(); -} - - -bool LLPanelLandEnvironment::canEdit() -{ - LLParcel *parcel = getParcel(); - if (!parcel) - return false; - - return LLEnvironment::instance().canAgentUpdateParcelEnvironment(parcel) && mAllowOverride; -} - -S32 LLPanelLandEnvironment::getParcelId() -{ - LLParcel *parcel = getParcel(); - if (!parcel) - return INVALID_PARCEL_ID; - - return parcel->getLocalID(); -} +/**
+ * @file llfloaterland.cpp
+ * @brief "About Land" floater, allowing display and editing of land parcel properties.
+ *
+ * $LicenseInfo:firstyear=2002&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 <sstream>
+#include <time.h>
+
+#include "llfloaterland.h"
+
+#include "llavatarnamecache.h"
+#include "llfocusmgr.h"
+#include "llnotificationsutil.h"
+#include "llparcel.h"
+#include "message.h"
+
+#include "llagent.h"
+#include "llagentaccess.h"
+#include "llappviewer.h"
+#include "llbutton.h"
+#include "llcheckboxctrl.h"
+#include "llcombobox.h"
+#include "llfloaterreg.h"
+#include "llfloateravatarpicker.h"
+#include "llfloaterauction.h"
+#include "llfloaterbanduration.h"
+#include "llfloatergroups.h"
+#include "llfloaterscriptlimits.h"
+#include "llavataractions.h"
+#include "lllineeditor.h"
+#include "llnamelistctrl.h"
+#include "llpanellandaudio.h"
+#include "llpanellandmedia.h"
+#include "llradiogroup.h"
+#include "llresmgr.h" // getMonetaryString
+#include "llscrolllistctrl.h"
+#include "llscrolllistitem.h"
+#include "llscrolllistcell.h"
+#include "llselectmgr.h"
+#include "llslurl.h"
+#include "llspinctrl.h"
+#include "lltabcontainer.h"
+#include "lltextbox.h"
+#include "lltexturectrl.h"
+#include "lluiconstants.h"
+#include "lluictrlfactory.h"
+#include "llviewertexturelist.h" // LLUIImageList
+#include "llviewermessage.h"
+#include "llviewerparcelmgr.h"
+#include "llviewerregion.h"
+#include "llviewerstats.h"
+#include "llviewertexteditor.h"
+#include "llviewerwindow.h"
+#include "llviewercontrol.h"
+#include "roles_constants.h"
+#include "lltrans.h"
+#include "llpanelexperiencelisteditor.h"
+#include "llpanelexperiencepicker.h"
+#include "llpanelenvironment.h"
+#include "llexperiencecache.h"
+
+#include "llgroupactions.h"
+#include "llenvironment.h"
+
+const F64 COVENANT_REFRESH_TIME_SEC = 60.0f;
+
+static std::string OWNER_ONLINE = "0";
+static std::string OWNER_OFFLINE = "1";
+static std::string OWNER_GROUP = "2";
+static std::string MATURITY = "[MATURITY]";
+
+// constants used in callbacks below - syntactic sugar.
+static const bool BUY_GROUP_LAND = true;
+static const bool BUY_PERSONAL_LAND = false;
+LLPointer<LLParcelSelection> LLPanelLandGeneral::sSelectionForBuyPass = NULL;
+
+// Statics
+LLParcelSelectionObserver* LLFloaterLand::sObserver = NULL;
+S32 LLFloaterLand::sLastTab = 0;
+
+// Local classes
+class LLParcelSelectionObserver : public LLParcelObserver
+{
+public:
+ virtual void changed() { LLFloaterLand::refreshAll(); }
+};
+
+// class needed to get full access to textbox inside checkbox, because LLCheckBoxCtrl::setLabel() has string as its argument.
+// It was introduced while implementing EXT-4706
+class LLCheckBoxWithTBAcess : public LLCheckBoxCtrl
+{
+public:
+ LLTextBox* getTextBox()
+ {
+ return mLabel;
+ }
+};
+
+
+class LLPanelLandExperiences
+ : public LLPanel
+{
+public:
+ LLPanelLandExperiences(LLSafeHandle<LLParcelSelection>& parcelp);
+ virtual bool postBuild();
+ void refresh();
+
+ void experienceAdded(const LLUUID& id, U32 xp_type, U32 access_type);
+ void experienceRemoved(const LLUUID& id, U32 access_type);
+protected:
+ LLPanelExperienceListEditor* setupList( const char* control_name, U32 xp_type, U32 access_type );
+ void refreshPanel(LLPanelExperienceListEditor* panel, U32 xp_type);
+
+ LLSafeHandle<LLParcelSelection>& mParcel;
+
+
+ LLPanelExperienceListEditor* mAllowed;
+ LLPanelExperienceListEditor* mBlocked;
+};
+
+
+class LLPanelLandEnvironment
+ : public LLPanelEnvironmentInfo
+{
+public:
+ LLPanelLandEnvironment(LLSafeHandle<LLParcelSelection>& parcelp);
+
+ virtual bool isRegion() const override { return false; }
+ virtual bool isLargeEnough() override
+ {
+ LLParcel *parcelp = mParcel->getParcel();
+ return ((parcelp) ? (parcelp->getArea() >= MINIMUM_PARCEL_SIZE) : false);
+ }
+
+ virtual bool postBuild() override;
+ virtual void refresh() override;
+
+ virtual LLParcel * getParcel() override;
+
+ virtual bool canEdit() override;
+ virtual S32 getParcelId() override;
+
+protected:
+ virtual void refreshFromSource() override;
+
+ bool isSameRegion();
+
+ LLSafeHandle<LLParcelSelection> & mParcel;
+ S32 mLastParcelId;
+};
+
+
+// inserts maturity info(icon and text) into target textbox
+// names_floater - pointer to floater which contains strings with maturity icons filenames
+// str_to_parse is string in format "txt1[MATURITY]txt2" where maturity icon and text will be inserted instead of [MATURITY]
+void insert_maturity_into_textbox(LLTextBox* target_textbox, LLFloater* names_floater, std::string str_to_parse);
+
+//---------------------------------------------------------------------------
+// LLFloaterLand
+//---------------------------------------------------------------------------
+
+void send_parcel_select_objects(S32 parcel_local_id, U32 return_type,
+ uuid_list_t* return_ids = NULL)
+{
+ LLMessageSystem *msg = gMessageSystem;
+
+ LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
+ if (!region) return;
+
+ // Since new highlight will be coming in, drop any highlights
+ // that exist right now.
+ LLSelectMgr::getInstance()->unhighlightAll();
+
+ msg->newMessageFast(_PREHASH_ParcelSelectObjects);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID());
+ msg->nextBlockFast(_PREHASH_ParcelData);
+ msg->addS32Fast(_PREHASH_LocalID, parcel_local_id);
+ msg->addU32Fast(_PREHASH_ReturnType, return_type);
+
+ // Throw all return ids into the packet.
+ // TODO: Check for too many ids.
+ if (return_ids)
+ {
+ uuid_list_t::iterator end = return_ids->end();
+ for (uuid_list_t::iterator it = return_ids->begin();
+ it != end;
+ ++it)
+ {
+ msg->nextBlockFast(_PREHASH_ReturnIDs);
+ msg->addUUIDFast(_PREHASH_ReturnID, (*it));
+ }
+ }
+ else
+ {
+ // Put in a null key so that the message is complete.
+ msg->nextBlockFast(_PREHASH_ReturnIDs);
+ msg->addUUIDFast(_PREHASH_ReturnID, LLUUID::null);
+ }
+
+ msg->sendReliable(region->getHost());
+}
+
+LLParcel* LLFloaterLand::getCurrentSelectedParcel()
+{
+ return mParcel->getParcel();
+};
+
+//static
+LLPanelLandObjects* LLFloaterLand::getCurrentPanelLandObjects()
+{
+ LLFloaterLand* land_instance = LLFloaterReg::getTypedInstance<LLFloaterLand>("about_land");
+ if(land_instance)
+ {
+ return land_instance->mPanelObjects;
+ }
+ else
+ {
+ return NULL;
+ }
+}
+
+//static
+LLPanelLandCovenant* LLFloaterLand::getCurrentPanelLandCovenant()
+{
+ LLFloaterLand* land_instance = LLFloaterReg::getTypedInstance<LLFloaterLand>("about_land");
+ if(land_instance)
+ {
+ return land_instance->mPanelCovenant;
+ }
+ else
+ {
+ return NULL;
+ }
+}
+
+// static
+void LLFloaterLand::refreshAll()
+{
+ LLFloaterLand* land_instance = LLFloaterReg::findTypedInstance<LLFloaterLand>("about_land");
+ if(land_instance)
+ {
+ land_instance->refresh();
+ }
+}
+
+void LLFloaterLand::onOpen(const LLSD& key)
+{
+ // moved from triggering show instance in llviwermenu.cpp
+
+ if (LLViewerParcelMgr::getInstance()->selectionEmpty())
+ {
+ LLViewerParcelMgr::getInstance()->selectParcelAt(gAgent.getPositionGlobal());
+ }
+
+ // Done automatically when the selected parcel's properties arrive
+ // (and hence we have the local id).
+ // LLViewerParcelMgr::getInstance()->sendParcelAccessListRequest(AL_ACCESS | AL_BAN | AL_RENTER);
+
+ mParcel = LLViewerParcelMgr::getInstance()->getFloatingParcelSelection();
+
+ // Refresh even if not over a region so we don't get an
+ // uninitialized dialog. The dialog is 0-region aware.
+ refresh();
+}
+
+void LLFloaterLand::onVisibilityChanged(const LLSD& visible)
+{
+ if (!visible.asBoolean())
+ {
+ // Might have been showing owned objects
+ LLSelectMgr::getInstance()->unhighlightAll();
+
+ // Save which panel we had open
+ sLastTab = mTabLand->getCurrentPanelIndex();
+ }
+}
+
+
+LLFloaterLand::LLFloaterLand(const LLSD& seed)
+: LLFloater(seed)
+{
+ mFactoryMap["land_general_panel"] = LLCallbackMap(createPanelLandGeneral, this);
+ mFactoryMap["land_covenant_panel"] = LLCallbackMap(createPanelLandCovenant, this);
+ mFactoryMap["land_objects_panel"] = LLCallbackMap(createPanelLandObjects, this);
+ mFactoryMap["land_options_panel"] = LLCallbackMap(createPanelLandOptions, this);
+ mFactoryMap["land_audio_panel"] = LLCallbackMap(createPanelLandAudio, this);
+ mFactoryMap["land_media_panel"] = LLCallbackMap(createPanelLandMedia, this);
+ mFactoryMap["land_access_panel"] = LLCallbackMap(createPanelLandAccess, this);
+ mFactoryMap["land_experiences_panel"] = LLCallbackMap(createPanelLandExperiences, this);
+ mFactoryMap["land_environment_panel"] = LLCallbackMap(createPanelLandEnvironment, this);
+
+ sObserver = new LLParcelSelectionObserver();
+ LLViewerParcelMgr::getInstance()->addObserver( sObserver );
+}
+
+bool LLFloaterLand::postBuild()
+{
+ setVisibleCallback(boost::bind(&LLFloaterLand::onVisibilityChanged, this, _2));
+
+ LLTabContainer* tab = getChild<LLTabContainer>("landtab");
+
+ mTabLand = (LLTabContainer*) tab;
+
+ if (tab)
+ {
+ tab->selectTab(sLastTab);
+ }
+
+ return true;
+}
+
+
+// virtual
+LLFloaterLand::~LLFloaterLand()
+{
+ LLViewerParcelMgr::getInstance()->removeObserver( sObserver );
+ delete sObserver;
+ sObserver = NULL;
+}
+
+// public
+void LLFloaterLand::refresh()
+{
+ mPanelGeneral->refresh();
+ mPanelObjects->refresh();
+ mPanelOptions->refresh();
+ mPanelAudio->refresh();
+ mPanelMedia->refresh();
+ mPanelAccess->refresh();
+ mPanelCovenant->refresh();
+ mPanelExperiences->refresh();
+ mPanelEnvironment->refresh();
+}
+
+
+
+void* LLFloaterLand::createPanelLandGeneral(void* data)
+{
+ LLFloaterLand* self = (LLFloaterLand*)data;
+ self->mPanelGeneral = new LLPanelLandGeneral(self->mParcel);
+ return self->mPanelGeneral;
+}
+
+// static
+void* LLFloaterLand::createPanelLandCovenant(void* data)
+{
+ LLFloaterLand* self = (LLFloaterLand*)data;
+ self->mPanelCovenant = new LLPanelLandCovenant(self->mParcel);
+ return self->mPanelCovenant;
+}
+
+
+// static
+void* LLFloaterLand::createPanelLandObjects(void* data)
+{
+ LLFloaterLand* self = (LLFloaterLand*)data;
+ self->mPanelObjects = new LLPanelLandObjects(self->mParcel);
+ return self->mPanelObjects;
+}
+
+// static
+void* LLFloaterLand::createPanelLandOptions(void* data)
+{
+ LLFloaterLand* self = (LLFloaterLand*)data;
+ self->mPanelOptions = new LLPanelLandOptions(self->mParcel);
+ return self->mPanelOptions;
+}
+
+// static
+void* LLFloaterLand::createPanelLandAudio(void* data)
+{
+ LLFloaterLand* self = (LLFloaterLand*)data;
+ self->mPanelAudio = new LLPanelLandAudio(self->mParcel);
+ return self->mPanelAudio;
+}
+
+// static
+void* LLFloaterLand::createPanelLandMedia(void* data)
+{
+ LLFloaterLand* self = (LLFloaterLand*)data;
+ self->mPanelMedia = new LLPanelLandMedia(self->mParcel);
+ return self->mPanelMedia;
+}
+
+// static
+void* LLFloaterLand::createPanelLandAccess(void* data)
+{
+ LLFloaterLand* self = (LLFloaterLand*)data;
+ self->mPanelAccess = new LLPanelLandAccess(self->mParcel);
+ return self->mPanelAccess;
+}
+
+// static
+void* LLFloaterLand::createPanelLandExperiences(void* data)
+{
+ LLFloaterLand* self = (LLFloaterLand*)data;
+ self->mPanelExperiences = new LLPanelLandExperiences(self->mParcel);
+ return self->mPanelExperiences;
+}
+
+//static
+void* LLFloaterLand::createPanelLandEnvironment(void* data)
+{
+ LLFloaterLand* self = (LLFloaterLand*)data;
+ self->mPanelEnvironment = new LLPanelLandEnvironment(self->mParcel);
+ return self->mPanelEnvironment;
+}
+
+
+//---------------------------------------------------------------------------
+// LLPanelLandGeneral
+//---------------------------------------------------------------------------
+
+
+LLPanelLandGeneral::LLPanelLandGeneral(LLParcelSelectionHandle& parcel)
+: LLPanel(),
+ mUncheckedSell(false),
+ mParcel(parcel)
+{
+}
+
+bool LLPanelLandGeneral::postBuild()
+{
+ mEditName = getChild<LLLineEditor>("Name");
+ mEditName->setCommitCallback(onCommitAny, this);
+ getChild<LLLineEditor>("Name")->setPrevalidate(LLTextValidate::validateASCIIPrintableNoPipe);
+
+ mEditDesc = getChild<LLTextEditor>("Description");
+ mEditDesc->setCommitOnFocusLost(true);
+ mEditDesc->setCommitCallback(onCommitAny, this);
+ mEditDesc->setContentTrusted(false);
+ // No prevalidate function - historically the prevalidate function was broken,
+ // allowing residents to put in characters like U+2661 WHITE HEART SUIT, so
+ // preserve that ability.
+
+ mTextSalePending = getChild<LLTextBox>("SalePending");
+ mTextOwnerLabel = getChild<LLTextBox>("Owner:");
+ mTextOwner = getChild<LLTextBox>("OwnerText");
+ mTextOwner->setIsFriendCallback(LLAvatarActions::isFriend);
+
+ mContentRating = getChild<LLTextBox>("ContentRatingText");
+ mLandType = getChild<LLTextBox>("LandTypeText");
+
+ mBtnProfile = getChild<LLButton>("Profile...");
+ mBtnProfile->setClickedCallback(boost::bind(&LLPanelLandGeneral::onClickProfile, this));
+
+
+ mTextGroupLabel = getChild<LLTextBox>("Group:");
+ mTextGroup = getChild<LLTextBox>("GroupText");
+
+
+ mBtnSetGroup = getChild<LLButton>("Set...");
+ mBtnSetGroup->setCommitCallback(boost::bind(&LLPanelLandGeneral::onClickSetGroup, this));
+
+
+ mCheckDeedToGroup = getChild<LLCheckBoxCtrl>( "check deed");
+ childSetCommitCallback("check deed", onCommitAny, this);
+
+
+ mBtnDeedToGroup = getChild<LLButton>("Deed...");
+ mBtnDeedToGroup->setClickedCallback(onClickDeed, this);
+
+
+ mCheckContributeWithDeed = getChild<LLCheckBoxCtrl>( "check contrib");
+ childSetCommitCallback("check contrib", onCommitAny, this);
+
+
+
+ mSaleInfoNotForSale = getChild<LLTextBox>("Not for sale.");
+
+ mSaleInfoForSale1 = getChild<LLTextBox>("For Sale: Price L$[PRICE].");
+
+
+ mBtnSellLand = getChild<LLButton>("Sell Land...");
+ mBtnSellLand->setClickedCallback(onClickSellLand, this);
+
+ mSaleInfoForSale2 = getChild<LLTextBox>("For sale to");
+
+ mSaleInfoForSaleObjects = getChild<LLTextBox>("Sell with landowners objects in parcel.");
+
+ mSaleInfoForSaleNoObjects = getChild<LLTextBox>("Selling with no objects in parcel.");
+
+
+ mBtnStopSellLand = getChild<LLButton>("Cancel Land Sale");
+ mBtnStopSellLand->setClickedCallback(onClickStopSellLand, this);
+
+
+ mTextClaimDateLabel = getChild<LLTextBox>("Claimed:");
+ mTextClaimDate = getChild<LLTextBox>("DateClaimText");
+
+
+ mTextPriceLabel = getChild<LLTextBox>("PriceLabel");
+ mTextPrice = getChild<LLTextBox>("PriceText");
+
+
+ mTextDwell = getChild<LLTextBox>("DwellText");
+
+ mBtnBuyLand = getChild<LLButton>("Buy Land...");
+ mBtnBuyLand->setClickedCallback(onClickBuyLand, (void*)&BUY_PERSONAL_LAND);
+
+
+ mBtnBuyGroupLand = getChild<LLButton>("Buy For Group...");
+ mBtnBuyGroupLand->setClickedCallback(onClickBuyLand, (void*)&BUY_GROUP_LAND);
+
+
+ mBtnBuyPass = getChild<LLButton>("Buy Pass...");
+ mBtnBuyPass->setClickedCallback(onClickBuyPass, this);
+
+ mBtnReleaseLand = getChild<LLButton>("Abandon Land...");
+ mBtnReleaseLand->setClickedCallback(onClickRelease, NULL);
+
+ mBtnReclaimLand = getChild<LLButton>("Reclaim Land...");
+ mBtnReclaimLand->setClickedCallback(onClickReclaim, NULL);
+
+ mBtnStartAuction = getChild<LLButton>("Linden Sale...");
+ mBtnStartAuction->setClickedCallback(onClickStartAuction, this);
+
+ mBtnScriptLimits = getChild<LLButton>("Scripts...");
+
+ if(gDisconnected)
+ {
+ return true;
+ }
+
+ // note: on region change this will not be re checked, should not matter on Agni as
+ // 99% of the time all regions will return the same caps. In case of an erroneous setting
+ // to enabled the floater will just throw an error when trying to get it's cap
+ std::string url = gAgent.getRegionCapability("LandResources");
+ if (!url.empty())
+ {
+ if(mBtnScriptLimits)
+ {
+ mBtnScriptLimits->setClickedCallback(onClickScriptLimits, this);
+ }
+ }
+ else
+ {
+ if(mBtnScriptLimits)
+ {
+ mBtnScriptLimits->setVisible(false);
+ }
+ }
+
+ return true;
+}
+
+
+// virtual
+LLPanelLandGeneral::~LLPanelLandGeneral()
+{ }
+
+
+// public
+void LLPanelLandGeneral::refresh()
+{
+ mEditName->setEnabled(false);
+ mEditName->setText(LLStringUtil::null);
+
+ mEditDesc->setEnabled(false);
+ mEditDesc->setText(getString("no_selection_text"));
+
+ mTextSalePending->setText(LLStringUtil::null);
+ mTextSalePending->setEnabled(false);
+
+ mBtnDeedToGroup->setEnabled(false);
+ mBtnSetGroup->setEnabled(false);
+ mBtnStartAuction->setEnabled(false);
+
+ mCheckDeedToGroup ->set(false);
+ mCheckDeedToGroup ->setEnabled(false);
+ mCheckContributeWithDeed->set(false);
+ mCheckContributeWithDeed->setEnabled(false);
+
+ mTextOwner->setText(LLStringUtil::null);
+ mContentRating->setText(LLStringUtil::null);
+ mLandType->setText(LLStringUtil::null);
+ mBtnProfile->setLabel(getString("profile_text"));
+ mBtnProfile->setEnabled(false);
+
+ mTextClaimDate->setText(LLStringUtil::null);
+ mTextGroup->setText(LLStringUtil::null);
+ mTextPrice->setText(LLStringUtil::null);
+
+ mSaleInfoForSale1->setVisible(false);
+ mSaleInfoForSale2->setVisible(false);
+ mSaleInfoForSaleObjects->setVisible(false);
+ mSaleInfoForSaleNoObjects->setVisible(false);
+ mSaleInfoNotForSale->setVisible(false);
+ mBtnSellLand->setVisible(false);
+ mBtnStopSellLand->setVisible(false);
+
+ mTextPriceLabel->setText(LLStringUtil::null);
+ mTextDwell->setText(LLStringUtil::null);
+
+ mBtnBuyLand->setEnabled(false);
+ mBtnScriptLimits->setEnabled(false);
+ mBtnBuyGroupLand->setEnabled(false);
+ mBtnReleaseLand->setEnabled(false);
+ mBtnReclaimLand->setEnabled(false);
+ mBtnBuyPass->setEnabled(false);
+
+ if(gDisconnected)
+ {
+ return;
+ }
+
+ mBtnStartAuction->setVisible(gAgent.isGodlike());
+ bool region_owner = false;
+ LLViewerRegion* regionp = LLViewerParcelMgr::getInstance()->getSelectionRegion();
+ if(regionp && (regionp->getOwner() == gAgent.getID()))
+ {
+ region_owner = true;
+ mBtnReleaseLand->setVisible(false);
+ mBtnReclaimLand->setVisible(true);
+ }
+ else
+ {
+ mBtnReleaseLand->setVisible(true);
+ mBtnReclaimLand->setVisible(false);
+ }
+ LLParcel *parcel = mParcel->getParcel();
+ if (parcel)
+ {
+ // something selected, hooray!
+ bool is_leased = (LLParcel::OS_LEASED == parcel->getOwnershipStatus());
+ bool region_xfer = false;
+ if(regionp
+ && !(regionp->getRegionFlag(REGION_FLAGS_BLOCK_LAND_RESELL)))
+ {
+ region_xfer = true;
+ }
+
+ if (regionp)
+ {
+ insert_maturity_into_textbox(mContentRating, gFloaterView->getParentFloater(this), MATURITY);
+ mLandType->setText(regionp->getLocalizedSimProductName());
+ }
+
+ // estate owner/manager cannot edit other parts of the parcel
+ bool estate_manager_sellable = !parcel->getAuctionID()
+ && gAgent.canManageEstate()
+ // estate manager/owner can only sell parcels owned by estate owner
+ && regionp
+ && (parcel->getOwnerID() == regionp->getOwner());
+ bool owner_sellable = region_xfer && !parcel->getAuctionID()
+ && LLViewerParcelMgr::isParcelModifiableByAgent(
+ parcel, GP_LAND_SET_SALE_INFO);
+ bool can_be_sold = owner_sellable || estate_manager_sellable;
+
+ const LLUUID &owner_id = parcel->getOwnerID();
+ bool is_public = parcel->isPublic();
+
+ // Is it owned?
+ if (is_public)
+ {
+ mTextSalePending->setText(LLStringUtil::null);
+ mTextSalePending->setEnabled(false);
+ mTextOwner->setText(getString("public_text"));
+ mTextOwner->setEnabled(false);
+ mBtnProfile->setEnabled(false);
+ mTextClaimDate->setText(LLStringUtil::null);
+ mTextClaimDate->setEnabled(false);
+ mTextGroup->setText(getString("none_text"));
+ mTextGroup->setEnabled(false);
+ mBtnStartAuction->setEnabled(false);
+ }
+ else
+ {
+ if(!is_leased && (owner_id == gAgent.getID()))
+ {
+ mTextSalePending->setText(getString("need_tier_to_modify"));
+ mTextSalePending->setEnabled(true);
+ }
+ else if(parcel->getAuctionID())
+ {
+ mTextSalePending->setText(getString("auction_id_text"));
+ mTextSalePending->setTextArg("[ID]", llformat("%u", parcel->getAuctionID()));
+ mTextSalePending->setEnabled(true);
+ }
+ else
+ {
+ // not the owner, or it is leased
+ mTextSalePending->setText(LLStringUtil::null);
+ mTextSalePending->setEnabled(false);
+ }
+ //refreshNames();
+ mTextOwner->setEnabled(true);
+
+ // We support both group and personal profiles
+ mBtnProfile->setEnabled(true);
+
+ if (parcel->getGroupID().isNull())
+ {
+ // Not group owned, so "Profile"
+ mBtnProfile->setLabel(getString("profile_text"));
+
+ mTextGroup->setText(getString("none_text"));
+ mTextGroup->setEnabled(false);
+ }
+ else
+ {
+ // Group owned, so "Info"
+ mBtnProfile->setLabel(getString("info_text"));
+
+ //mTextGroup->setText("HIPPOS!");//parcel->getGroupName());
+ mTextGroup->setEnabled(true);
+ }
+
+ // Display claim date
+ time_t claim_date = parcel->getClaimDate();
+ std::string claim_date_str = getString("time_stamp_template");
+ LLSD substitution;
+ substitution["datetime"] = (S32) claim_date;
+ LLStringUtil::format (claim_date_str, substitution);
+ mTextClaimDate->setText(claim_date_str);
+ mTextClaimDate->setEnabled(is_leased);
+
+ bool enable_auction = (gAgent.getGodLevel() >= GOD_LIAISON)
+ && (owner_id == GOVERNOR_LINDEN_ID)
+ && (parcel->getAuctionID() == 0);
+ mBtnStartAuction->setEnabled(enable_auction);
+ }
+
+ // Display options
+ bool can_edit_identity = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_CHANGE_IDENTITY);
+ mEditName->setEnabled(can_edit_identity);
+ mEditDesc->setEnabled(can_edit_identity);
+ mEditDesc->setParseURLs(!can_edit_identity);
+
+ bool can_edit_agent_only = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_NO_POWERS);
+ mBtnSetGroup->setEnabled(can_edit_agent_only && !parcel->getIsGroupOwned());
+
+ const LLUUID& group_id = parcel->getGroupID();
+
+ // Can only allow deeding if you own it and it's got a group.
+ bool enable_deed = (owner_id == gAgent.getID()
+ && group_id.notNull()
+ && gAgent.isInGroup(group_id));
+ // You don't need special powers to allow your object to
+ // be deeded to the group.
+ mCheckDeedToGroup->setEnabled(enable_deed);
+ mCheckDeedToGroup->set( parcel->getAllowDeedToGroup() );
+ mCheckContributeWithDeed->setEnabled(enable_deed && parcel->getAllowDeedToGroup());
+ mCheckContributeWithDeed->set(parcel->getContributeWithDeed());
+
+ // Actually doing the deeding requires you to have GP_LAND_DEED
+ // powers in the group.
+ bool can_deed = gAgent.hasPowerInGroup(group_id, GP_LAND_DEED);
+ mBtnDeedToGroup->setEnabled( parcel->getAllowDeedToGroup()
+ && group_id.notNull()
+ && can_deed
+ && !parcel->getIsGroupOwned()
+ );
+
+ mEditName->setText( parcel->getName() );
+ mEditDesc->setText( parcel->getDesc() );
+
+ bool for_sale = parcel->getForSale();
+
+ mBtnSellLand->setVisible(false);
+ mBtnStopSellLand->setVisible(false);
+
+ // show pricing information
+ S32 area;
+ S32 claim_price;
+ S32 rent_price;
+ F32 dwell = DWELL_NAN;
+ LLViewerParcelMgr::getInstance()->getDisplayInfo(&area,
+ &claim_price,
+ &rent_price,
+ &for_sale,
+ &dwell);
+ // Area
+ LLUIString price = getString("area_size_text");
+ price.setArg("[AREA]", llformat("%d",area));
+ mTextPriceLabel->setText(getString("area_text"));
+ mTextPrice->setText(price.getString());
+
+ if (dwell == DWELL_NAN)
+ {
+ mTextDwell->setText(LLTrans::getString("LoadingData"));
+ }
+ else
+ {
+ mTextDwell->setText(llformat("%.0f", dwell));
+ }
+
+ if (for_sale)
+ {
+ mSaleInfoForSale1->setVisible(true);
+ mSaleInfoForSale2->setVisible(true);
+ if (parcel->getSellWithObjects())
+ {
+ mSaleInfoForSaleObjects->setVisible(true);
+ mSaleInfoForSaleNoObjects->setVisible(false);
+ }
+ else
+ {
+ mSaleInfoForSaleObjects->setVisible(false);
+ mSaleInfoForSaleNoObjects->setVisible(true);
+ }
+ mSaleInfoNotForSale->setVisible(false);
+
+ F32 cost_per_sqm = 0.0f;
+ if (area > 0)
+ {
+ cost_per_sqm = (F32)parcel->getSalePrice() / (F32)area;
+ }
+
+ S32 price = parcel->getSalePrice();
+ mSaleInfoForSale1->setTextArg("[PRICE]", LLResMgr::getInstance()->getMonetaryString(price));
+ mSaleInfoForSale1->setTextArg("[PRICE_PER_SQM]", llformat("%.1f", cost_per_sqm));
+ if (can_be_sold)
+ {
+ mBtnStopSellLand->setVisible(true);
+ }
+ }
+ else
+ {
+ mSaleInfoForSale1->setVisible(false);
+ mSaleInfoForSale2->setVisible(false);
+ mSaleInfoForSaleObjects->setVisible(false);
+ mSaleInfoForSaleNoObjects->setVisible(false);
+ mSaleInfoNotForSale->setVisible(true);
+ if (can_be_sold)
+ {
+ mBtnSellLand->setVisible(true);
+ }
+ }
+
+ refreshNames();
+
+ mBtnBuyLand->setEnabled(
+ LLViewerParcelMgr::getInstance()->canAgentBuyParcel(parcel, false));
+ mBtnScriptLimits->setEnabled(true);
+// LLViewerParcelMgr::getInstance()->canAgentBuyParcel(parcel, false));
+ mBtnBuyGroupLand->setEnabled(
+ LLViewerParcelMgr::getInstance()->canAgentBuyParcel(parcel, true));
+
+ if(region_owner)
+ {
+ mBtnReclaimLand->setEnabled(
+ !is_public && (parcel->getOwnerID() != gAgent.getID()));
+ }
+ else
+ {
+ bool is_owner_release = LLViewerParcelMgr::isParcelOwnedByAgent(parcel, GP_LAND_RELEASE);
+ bool is_manager_release = (gAgent.canManageEstate() &&
+ regionp &&
+ (parcel->getOwnerID() != regionp->getOwner()));
+ bool can_release = is_owner_release || is_manager_release;
+ mBtnReleaseLand->setEnabled( can_release );
+ }
+
+ bool use_pass = parcel->getOwnerID()!= gAgent.getID() && parcel->getParcelFlag(PF_USE_PASS_LIST) && !LLViewerParcelMgr::getInstance()->isCollisionBanned();;
+ mBtnBuyPass->setEnabled(use_pass);
+
+ }
+}
+
+// public
+void LLPanelLandGeneral::refreshNames()
+{
+ LLParcel *parcel = mParcel->getParcel();
+ if (!parcel)
+ {
+ mTextOwner->setText(LLStringUtil::null);
+ mTextGroup->setText(LLStringUtil::null);
+ return;
+ }
+
+ std::string owner;
+ if (parcel->getIsGroupOwned())
+ {
+ owner = getString("group_owned_text");
+ }
+ else
+ {
+ // Figure out the owner's name
+ owner = LLSLURL("agent", parcel->getOwnerID(), "inspect").getSLURLString();
+ }
+
+ if(LLParcel::OS_LEASE_PENDING == parcel->getOwnershipStatus())
+ {
+ owner += getString("sale_pending_text");
+ }
+ mTextOwner->setText(owner);
+
+ std::string group;
+ if (!parcel->getGroupID().isNull())
+ {
+ group = LLSLURL("group", parcel->getGroupID(), "inspect").getSLURLString();
+ }
+ mTextGroup->setText(group);
+
+ if (parcel->getForSale())
+ {
+ const LLUUID& auth_buyer_id = parcel->getAuthorizedBuyerID();
+ if(auth_buyer_id.notNull())
+ {
+ std::string name;
+ name = LLSLURL("agent", auth_buyer_id, "inspect").getSLURLString();
+ mSaleInfoForSale2->setTextArg("[BUYER]", name);
+ }
+ else
+ {
+ mSaleInfoForSale2->setTextArg("[BUYER]", getString("anyone"));
+ }
+ }
+}
+
+
+// virtual
+void LLPanelLandGeneral::draw()
+{
+ LLPanel::draw();
+}
+
+void LLPanelLandGeneral::onClickSetGroup()
+{
+ LLFloater* parent_floater = gFloaterView->getParentFloater(this);
+
+ LLFloaterGroupPicker* fg = LLFloaterReg::showTypedInstance<LLFloaterGroupPicker>("group_picker", LLSD(gAgent.getID()));
+ if (fg)
+ {
+ fg->setSelectGroupCallback( boost::bind(&LLPanelLandGeneral::setGroup, this, _1 ));
+ if (parent_floater)
+ {
+ LLRect new_rect = gFloaterView->findNeighboringPosition(parent_floater, fg);
+ fg->setOrigin(new_rect.mLeft, new_rect.mBottom);
+ parent_floater->addDependentFloater(fg);
+ }
+ }
+}
+
+void LLPanelLandGeneral::onClickProfile()
+{
+ LLParcel* parcel = mParcel->getParcel();
+ if (!parcel) return;
+
+ if (parcel->getIsGroupOwned())
+ {
+ const LLUUID& group_id = parcel->getGroupID();
+ LLGroupActions::show(group_id);
+ }
+ else
+ {
+ const LLUUID& avatar_id = parcel->getOwnerID();
+ LLAvatarActions::showProfile(avatar_id);
+ }
+}
+
+// public
+void LLPanelLandGeneral::setGroup(const LLUUID& group_id)
+{
+ LLParcel* parcel = mParcel->getParcel();
+ if (!parcel) return;
+
+ // Set parcel properties and send message
+ parcel->setGroupID(group_id);
+ //parcel->setGroupName(group_name);
+ //mTextGroup->setText(group_name);
+
+ // Send update
+ LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate(parcel);
+
+ // Update UI
+ refresh();
+}
+
+// static
+void LLPanelLandGeneral::onClickBuyLand(void* data)
+{
+ bool* for_group = (bool*)data;
+ LLViewerParcelMgr::getInstance()->startBuyLand(*for_group);
+}
+
+// static
+void LLPanelLandGeneral::onClickScriptLimits(void* data)
+{
+ LLPanelLandGeneral* panelp = (LLPanelLandGeneral*)data;
+ LLParcel* parcel = panelp->mParcel->getParcel();
+ if(parcel != NULL)
+ {
+ LLFloaterReg::showInstance("script_limits");
+ }
+}
+
+// static
+void LLPanelLandGeneral::onClickDeed(void*)
+{
+ //LLParcel* parcel = mParcel->getParcel();
+ //if (parcel)
+ //{
+ LLViewerParcelMgr::getInstance()->startDeedLandToGroup();
+ //}
+}
+
+// static
+void LLPanelLandGeneral::onClickRelease(void*)
+{
+ LLViewerParcelMgr::getInstance()->startReleaseLand();
+}
+
+// static
+void LLPanelLandGeneral::onClickReclaim(void*)
+{
+ LL_DEBUGS() << "LLPanelLandGeneral::onClickReclaim()" << LL_ENDL;
+ LLViewerParcelMgr::getInstance()->reclaimParcel();
+}
+
+// static
+bool LLPanelLandGeneral::enableBuyPass(void* data)
+{
+ LLPanelLandGeneral* panelp = (LLPanelLandGeneral*)data;
+ LLParcel* parcel = panelp != NULL ? panelp->mParcel->getParcel() : LLViewerParcelMgr::getInstance()->getParcelSelection()->getParcel();
+ return (parcel != NULL) && (parcel->getParcelFlag(PF_USE_PASS_LIST) && !LLViewerParcelMgr::getInstance()->isCollisionBanned());
+}
+
+
+// static
+void LLPanelLandGeneral::onClickBuyPass(void* data)
+{
+ LLPanelLandGeneral* panelp = (LLPanelLandGeneral*)data;
+ LLParcel* parcel = panelp != NULL ? panelp->mParcel->getParcel() : LLViewerParcelMgr::getInstance()->getParcelSelection()->getParcel();
+
+ if (!parcel) return;
+
+ S32 pass_price = parcel->getPassPrice();
+ std::string parcel_name = parcel->getName();
+ F32 pass_hours = parcel->getPassHours();
+
+ std::string cost, time;
+ cost = llformat("%d", pass_price);
+ time = llformat("%.2f", pass_hours);
+
+ LLSD args;
+ args["COST"] = cost;
+ args["PARCEL_NAME"] = parcel_name;
+ args["TIME"] = time;
+
+ // creating pointer on selection to avoid deselection of parcel until we are done with buying pass (EXT-6464)
+ sSelectionForBuyPass = LLViewerParcelMgr::getInstance()->getParcelSelection();
+ LLNotificationsUtil::add("LandBuyPass", args, LLSD(), cbBuyPass);
+}
+
+// static
+void LLPanelLandGeneral::onClickStartAuction(void* data)
+{
+ LLPanelLandGeneral* panelp = (LLPanelLandGeneral*)data;
+ LLParcel* parcelp = panelp->mParcel->getParcel();
+ if(parcelp)
+ {
+ if(parcelp->getForSale())
+ {
+ LLNotificationsUtil::add("CannotStartAuctionAlreadyForSale");
+ }
+ else
+ {
+ //LLFloaterAuction::showInstance();
+ LLFloaterReg::showInstance("auction");
+ }
+ }
+}
+
+// static
+bool LLPanelLandGeneral::cbBuyPass(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (0 == option)
+ {
+ // User clicked OK
+ LLViewerParcelMgr::getInstance()->buyPass();
+ }
+ // we are done with buying pass, additional selection is no longer needed
+ sSelectionForBuyPass = NULL;
+ return false;
+}
+
+// static
+void LLPanelLandGeneral::onCommitAny(LLUICtrl *ctrl, void *userdata)
+{
+ LLPanelLandGeneral *panelp = (LLPanelLandGeneral *)userdata;
+
+ LLParcel* parcel = panelp->mParcel->getParcel();
+ if (!parcel)
+ {
+ return;
+ }
+
+ // Extract data from UI
+ std::string name = panelp->mEditName->getText();
+ std::string desc = panelp->mEditDesc->getText();
+
+ // Valid data from UI
+
+ // Stuff data into selected parcel
+ parcel->setName(name);
+ parcel->setDesc(desc);
+
+ bool allow_deed_to_group= panelp->mCheckDeedToGroup->get();
+ bool contribute_with_deed = panelp->mCheckContributeWithDeed->get();
+
+ parcel->setParcelFlag(PF_ALLOW_DEED_TO_GROUP, allow_deed_to_group);
+ parcel->setContributeWithDeed(contribute_with_deed);
+
+ // Send update to server
+ LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate( parcel );
+
+ // Might have changed properties, so let's redraw!
+ panelp->refresh();
+}
+
+// static
+void LLPanelLandGeneral::onClickSellLand(void* data)
+{
+ LLViewerParcelMgr::getInstance()->startSellLand();
+ LLPanelLandGeneral *panelp = (LLPanelLandGeneral *)data;
+ panelp->refresh();
+}
+
+// static
+void LLPanelLandGeneral::onClickStopSellLand(void* data)
+{
+ LLPanelLandGeneral* panelp = (LLPanelLandGeneral*)data;
+ LLParcel* parcel = panelp->mParcel->getParcel();
+
+ parcel->setParcelFlag(PF_FOR_SALE, false);
+ parcel->setSalePrice(0);
+ parcel->setAuthorizedBuyerID(LLUUID::null);
+
+ LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate(parcel);
+}
+
+//---------------------------------------------------------------------------
+// LLPanelLandObjects
+//---------------------------------------------------------------------------
+LLPanelLandObjects::LLPanelLandObjects(LLParcelSelectionHandle& parcel)
+ : LLPanel(),
+
+ mParcel(parcel),
+ mParcelObjectBonus(NULL),
+ mSWTotalObjects(NULL),
+ mObjectContribution(NULL),
+ mTotalObjects(NULL),
+ mOwnerObjects(NULL),
+ mBtnShowOwnerObjects(NULL),
+ mBtnReturnOwnerObjects(NULL),
+ mGroupObjects(NULL),
+ mBtnShowGroupObjects(NULL),
+ mBtnReturnGroupObjects(NULL),
+ mOtherObjects(NULL),
+ mBtnShowOtherObjects(NULL),
+ mBtnReturnOtherObjects(NULL),
+ mSelectedObjects(NULL),
+ mCleanOtherObjectsTime(NULL),
+ mOtherTime(0),
+ mBtnRefresh(NULL),
+ mBtnReturnOwnerList(NULL),
+ mOwnerList(NULL),
+ mFirstReply(true),
+ mSelectedCount(0),
+ mSelectedIsGroup(false)
+{
+}
+
+
+
+bool LLPanelLandObjects::postBuild()
+{
+
+ mFirstReply = true;
+ mParcelObjectBonus = getChild<LLTextBox>("parcel_object_bonus");
+ mSWTotalObjects = getChild<LLTextBox>("objects_available");
+ mObjectContribution = getChild<LLTextBox>("object_contrib_text");
+ mTotalObjects = getChild<LLTextBox>("total_objects_text");
+ mOwnerObjects = getChild<LLTextBox>("owner_objects_text");
+
+ mBtnShowOwnerObjects = getChild<LLButton>("ShowOwner");
+ mBtnShowOwnerObjects->setClickedCallback(onClickShowOwnerObjects, this);
+
+ mBtnReturnOwnerObjects = getChild<LLButton>("ReturnOwner...");
+ mBtnReturnOwnerObjects->setClickedCallback(onClickReturnOwnerObjects, this);
+
+ mGroupObjects = getChild<LLTextBox>("group_objects_text");
+ mBtnShowGroupObjects = getChild<LLButton>("ShowGroup");
+ mBtnShowGroupObjects->setClickedCallback(onClickShowGroupObjects, this);
+
+ mBtnReturnGroupObjects = getChild<LLButton>("ReturnGroup...");
+ mBtnReturnGroupObjects->setClickedCallback(onClickReturnGroupObjects, this);
+
+ mOtherObjects = getChild<LLTextBox>("other_objects_text");
+ mBtnShowOtherObjects = getChild<LLButton>("ShowOther");
+ mBtnShowOtherObjects->setClickedCallback(onClickShowOtherObjects, this);
+
+ mBtnReturnOtherObjects = getChild<LLButton>("ReturnOther...");
+ mBtnReturnOtherObjects->setClickedCallback(onClickReturnOtherObjects, this);
+
+ mSelectedObjects = getChild<LLTextBox>("selected_objects_text");
+ mCleanOtherObjectsTime = getChild<LLLineEditor>("clean other time");
+
+ mCleanOtherObjectsTime->setFocusLostCallback(boost::bind(onLostFocus, _1, this));
+ mCleanOtherObjectsTime->setCommitCallback(onCommitClean, this);
+ getChild<LLLineEditor>("clean other time")->setPrevalidate(LLTextValidate::validateNonNegativeS32);
+
+ mBtnRefresh = getChild<LLButton>("Refresh List");
+ mBtnRefresh->setClickedCallback(onClickRefresh, this);
+
+ mBtnReturnOwnerList = getChild<LLButton>("Return objects...");
+ mBtnReturnOwnerList->setClickedCallback(onClickReturnOwnerList, this);
+
+ mIconAvatarOnline = LLUIImageList::getInstance()->getUIImage("icon_avatar_online.tga", 0);
+ mIconAvatarOffline = LLUIImageList::getInstance()->getUIImage("icon_avatar_offline.tga", 0);
+ mIconGroup = LLUIImageList::getInstance()->getUIImage("icon_group.tga", 0);
+
+ mOwnerList = getChild<LLNameListCtrl>("owner list");
+ mOwnerList->setIsFriendCallback(LLAvatarActions::isFriend);
+ mOwnerList->sortByColumnIndex(3, false);
+ childSetCommitCallback("owner list", onCommitList, this);
+ mOwnerList->setDoubleClickCallback(onDoubleClickOwner, this);
+ mOwnerList->setContextMenu(LLScrollListCtrl::MENU_AVATAR);
+
+ return true;
+}
+
+
+
+
+// virtual
+LLPanelLandObjects::~LLPanelLandObjects()
+{ }
+
+// static
+void LLPanelLandObjects::onDoubleClickOwner(void *userdata)
+{
+ LLPanelLandObjects *self = (LLPanelLandObjects *)userdata;
+
+ LLScrollListItem* item = self->mOwnerList->getFirstSelected();
+ if (item)
+ {
+ LLUUID owner_id = item->getUUID();
+ // Look up the selected name, for future dialog box use.
+ const LLScrollListCell* cell;
+ cell = item->getColumn(1);
+ if (!cell)
+ {
+ return;
+ }
+ // Is this a group?
+ bool is_group = cell->getValue().asString() == OWNER_GROUP;
+ if (is_group)
+ {
+ LLGroupActions::show(owner_id);
+ }
+ else
+ {
+ LLAvatarActions::showProfile(owner_id);
+ }
+ }
+}
+
+// public
+void LLPanelLandObjects::refresh()
+{
+ LLParcel *parcel = mParcel->getParcel();
+
+ mBtnShowOwnerObjects->setEnabled(false);
+ mBtnShowGroupObjects->setEnabled(false);
+ mBtnShowOtherObjects->setEnabled(false);
+ mBtnReturnOwnerObjects->setEnabled(false);
+ mBtnReturnGroupObjects->setEnabled(false);
+ mBtnReturnOtherObjects->setEnabled(false);
+ mCleanOtherObjectsTime->setEnabled(false);
+ mBtnRefresh-> setEnabled(false);
+ mBtnReturnOwnerList-> setEnabled(false);
+
+ mSelectedOwners.clear();
+ mOwnerList->deleteAllItems();
+ mOwnerList->setEnabled(false);
+
+ if (!parcel || gDisconnected)
+ {
+ mSWTotalObjects->setTextArg("[COUNT]", llformat("%d", 0));
+ mSWTotalObjects->setTextArg("[TOTAL]", llformat("%d", 0));
+ mSWTotalObjects->setTextArg("[AVAILABLE]", llformat("%d", 0));
+ mObjectContribution->setTextArg("[COUNT]", llformat("%d", 0));
+ mTotalObjects->setTextArg("[COUNT]", llformat("%d", 0));
+ mOwnerObjects->setTextArg("[COUNT]", llformat("%d", 0));
+ mGroupObjects->setTextArg("[COUNT]", llformat("%d", 0));
+ mOtherObjects->setTextArg("[COUNT]", llformat("%d", 0));
+ mSelectedObjects->setTextArg("[COUNT]", llformat("%d", 0));
+ }
+ else
+ {
+ S32 sw_max = parcel->getSimWideMaxPrimCapacity();
+ S32 sw_total = parcel->getSimWidePrimCount();
+ S32 max = ll_round(parcel->getMaxPrimCapacity() * parcel->getParcelPrimBonus());
+ S32 total = parcel->getPrimCount();
+ S32 owned = parcel->getOwnerPrimCount();
+ S32 group = parcel->getGroupPrimCount();
+ S32 other = parcel->getOtherPrimCount();
+ S32 selected = parcel->getSelectedPrimCount();
+ F32 parcel_object_bonus = parcel->getParcelPrimBonus();
+ mOtherTime = parcel->getCleanOtherTime();
+
+ // Can't have more than region max tasks, regardless of parcel
+ // object bonus factor.
+ LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
+ if (region)
+ {
+ S32 max_tasks_per_region = (S32)region->getMaxTasks();
+ sw_max = llmin(sw_max, max_tasks_per_region);
+ max = llmin(max, max_tasks_per_region);
+ }
+
+ if (parcel_object_bonus != 1.0f)
+ {
+ mParcelObjectBonus->setVisible(true);
+ mParcelObjectBonus->setTextArg("[BONUS]", llformat("%.2f", parcel_object_bonus));
+ }
+ else
+ {
+ mParcelObjectBonus->setVisible(false);
+ }
+
+ if (sw_total > sw_max)
+ {
+ mSWTotalObjects->setText(getString("objects_deleted_text"));
+ mSWTotalObjects->setTextArg("[DELETED]", llformat("%d", sw_total - sw_max));
+ }
+ else
+ {
+ mSWTotalObjects->setText(getString("objects_available_text"));
+ mSWTotalObjects->setTextArg("[AVAILABLE]", llformat("%d", sw_max - sw_total));
+ }
+ mSWTotalObjects->setTextArg("[COUNT]", llformat("%d", sw_total));
+ mSWTotalObjects->setTextArg("[MAX]", llformat("%d", sw_max));
+
+ mObjectContribution->setTextArg("[COUNT]", llformat("%d", max));
+ mTotalObjects->setTextArg("[COUNT]", llformat("%d", total));
+ mOwnerObjects->setTextArg("[COUNT]", llformat("%d", owned));
+ mGroupObjects->setTextArg("[COUNT]", llformat("%d", group));
+ mOtherObjects->setTextArg("[COUNT]", llformat("%d", other));
+ mSelectedObjects->setTextArg("[COUNT]", llformat("%d", selected));
+ mCleanOtherObjectsTime->setText(llformat("%d", mOtherTime));
+
+ bool can_return_owned = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_RETURN_GROUP_OWNED);
+ bool can_return_group_set = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_RETURN_GROUP_SET);
+ bool can_return_other = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_RETURN_NON_GROUP);
+
+ if (can_return_owned || can_return_group_set || can_return_other)
+ {
+ if (owned && can_return_owned)
+ {
+ mBtnShowOwnerObjects->setEnabled(true);
+ mBtnReturnOwnerObjects->setEnabled(true);
+ }
+ if (group && can_return_group_set)
+ {
+ mBtnShowGroupObjects->setEnabled(true);
+ mBtnReturnGroupObjects->setEnabled(true);
+ }
+ if (other && can_return_other)
+ {
+ mBtnShowOtherObjects->setEnabled(true);
+ mBtnReturnOtherObjects->setEnabled(true);
+ }
+
+ mCleanOtherObjectsTime->setEnabled(true);
+ mBtnRefresh->setEnabled(true);
+ }
+ }
+}
+
+// virtual
+void LLPanelLandObjects::draw()
+{
+ LLPanel::draw();
+}
+
+void send_other_clean_time_message(S32 parcel_local_id, S32 other_clean_time)
+{
+ LLMessageSystem *msg = gMessageSystem;
+
+ LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
+ if (!region) return;
+
+ msg->newMessageFast(_PREHASH_ParcelSetOtherCleanTime);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID());
+ msg->nextBlockFast(_PREHASH_ParcelData);
+ msg->addS32Fast(_PREHASH_LocalID, parcel_local_id);
+ msg->addS32Fast(_PREHASH_OtherCleanTime, other_clean_time);
+
+ msg->sendReliable(region->getHost());
+}
+
+void send_return_objects_message(S32 parcel_local_id, S32 return_type,
+ uuid_list_t* owner_ids = NULL)
+{
+ LLMessageSystem *msg = gMessageSystem;
+
+ LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
+ if (!region) return;
+
+ msg->newMessageFast(_PREHASH_ParcelReturnObjects);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID());
+ msg->nextBlockFast(_PREHASH_ParcelData);
+ msg->addS32Fast(_PREHASH_LocalID, parcel_local_id);
+ msg->addU32Fast(_PREHASH_ReturnType, (U32) return_type);
+
+ // Dummy task id, not used
+ msg->nextBlock("TaskIDs");
+ msg->addUUID("TaskID", LLUUID::null);
+
+ // Throw all return ids into the packet.
+ // TODO: Check for too many ids.
+ if (owner_ids)
+ {
+ uuid_list_t::iterator end = owner_ids->end();
+ for (uuid_list_t::iterator it = owner_ids->begin();
+ it != end;
+ ++it)
+ {
+ msg->nextBlockFast(_PREHASH_OwnerIDs);
+ msg->addUUIDFast(_PREHASH_OwnerID, (*it));
+ }
+ }
+ else
+ {
+ msg->nextBlockFast(_PREHASH_OwnerIDs);
+ msg->addUUIDFast(_PREHASH_OwnerID, LLUUID::null);
+ }
+
+ msg->sendReliable(region->getHost());
+}
+
+bool LLPanelLandObjects::callbackReturnOwnerObjects(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ LLParcel *parcel = mParcel->getParcel();
+ if (0 == option)
+ {
+ if (parcel)
+ {
+ LLUUID owner_id = parcel->getOwnerID();
+ LLSD args;
+ if (owner_id == gAgentID)
+ {
+ LLNotificationsUtil::add("OwnedObjectsReturned");
+ }
+ else
+ {
+ args["NAME"] = LLSLURL("agent", owner_id, "completename").getSLURLString();
+ LLNotificationsUtil::add("OtherObjectsReturned", args);
+ }
+ send_return_objects_message(parcel->getLocalID(), RT_OWNER);
+ }
+ }
+
+ LLSelectMgr::getInstance()->unhighlightAll();
+ LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate( parcel );
+ refresh();
+ return false;
+}
+
+bool LLPanelLandObjects::callbackReturnGroupObjects(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ LLParcel *parcel = mParcel->getParcel();
+ if (0 == option)
+ {
+ if (parcel)
+ {
+ std::string group_name;
+ gCacheName->getGroupName(parcel->getGroupID(), group_name);
+ LLSD args;
+ args["GROUPNAME"] = group_name;
+ LLNotificationsUtil::add("GroupObjectsReturned", args);
+ send_return_objects_message(parcel->getLocalID(), RT_GROUP);
+ }
+ }
+ LLSelectMgr::getInstance()->unhighlightAll();
+ LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate( parcel );
+ refresh();
+ return false;
+}
+
+bool LLPanelLandObjects::callbackReturnOtherObjects(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ LLParcel *parcel = mParcel->getParcel();
+ if (0 == option)
+ {
+ if (parcel)
+ {
+ LLNotificationsUtil::add("UnOwnedObjectsReturned");
+ send_return_objects_message(parcel->getLocalID(), RT_OTHER);
+ }
+ }
+ LLSelectMgr::getInstance()->unhighlightAll();
+ LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate( parcel );
+ refresh();
+ return false;
+}
+
+bool LLPanelLandObjects::callbackReturnOwnerList(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ LLParcel *parcel = mParcel->getParcel();
+ if (0 == option)
+ {
+ if (parcel)
+ {
+ // Make sure we have something selected.
+ uuid_list_t::iterator selected = mSelectedOwners.begin();
+ if (selected != mSelectedOwners.end())
+ {
+ LLSD args;
+ if (mSelectedIsGroup)
+ {
+ args["GROUPNAME"] = mSelectedName;
+ LLNotificationsUtil::add("GroupObjectsReturned", args);
+ }
+ else
+ {
+ args["NAME"] = mSelectedName;
+ LLNotificationsUtil::add("OtherObjectsReturned2", args);
+ }
+
+ send_return_objects_message(parcel->getLocalID(), RT_LIST, &(mSelectedOwners));
+ }
+ }
+ }
+ LLSelectMgr::getInstance()->unhighlightAll();
+ LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate( parcel );
+ refresh();
+ return false;
+}
+
+
+// static
+void LLPanelLandObjects::onClickReturnOwnerList(void* userdata)
+{
+ LLPanelLandObjects *self = (LLPanelLandObjects *)userdata;
+
+ LLParcel* parcelp = self->mParcel->getParcel();
+ if (!parcelp) return;
+
+ // Make sure we have something selected.
+ if (self->mSelectedOwners.empty())
+ {
+ return;
+ }
+ //uuid_list_t::iterator selected_itr = self->mSelectedOwners.begin();
+ //if (selected_itr == self->mSelectedOwners.end()) return;
+
+ send_parcel_select_objects(parcelp->getLocalID(), RT_LIST, &(self->mSelectedOwners));
+
+ LLSD args;
+ args["NAME"] = self->mSelectedName;
+ args["N"] = llformat("%d",self->mSelectedCount);
+ if (self->mSelectedIsGroup)
+ {
+ LLNotificationsUtil::add("ReturnObjectsDeededToGroup", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOwnerList, self, _1, _2));
+ }
+ else
+ {
+ LLNotificationsUtil::add("ReturnObjectsOwnedByUser", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOwnerList, self, _1, _2));
+ }
+}
+
+
+// static
+void LLPanelLandObjects::onClickRefresh(void* userdata)
+{
+ LLPanelLandObjects *self = (LLPanelLandObjects*)userdata;
+
+ LLMessageSystem *msg = gMessageSystem;
+
+ LLParcel* parcel = self->mParcel->getParcel();
+ if (!parcel) return;
+
+ LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
+ if (!region) return;
+
+ self->mBtnRefresh->setEnabled(false);
+
+ // ready the list for results
+ self->mOwnerList->deleteAllItems();
+ self->mOwnerList->setCommentText(LLTrans::getString("Searching"));
+ self->mOwnerList->setEnabled(false);
+ self->mFirstReply = true;
+
+ // send the message
+ msg->newMessageFast(_PREHASH_ParcelObjectOwnersRequest);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->nextBlockFast(_PREHASH_ParcelData);
+ msg->addS32Fast(_PREHASH_LocalID, parcel->getLocalID());
+
+ msg->sendReliable(region->getHost());
+}
+
+// static
+void LLPanelLandObjects::processParcelObjectOwnersReply(LLMessageSystem *msg, void **)
+{
+ LLPanelLandObjects* self = LLFloaterLand::getCurrentPanelLandObjects();
+
+ if (!self)
+ {
+ LL_WARNS() << "Received message for nonexistent LLPanelLandObject"
+ << LL_ENDL;
+ return;
+ }
+
+ const LLFontGL* FONT = LLFontGL::getFontSansSerif();
+
+ // Extract all of the owners.
+ S32 rows = msg->getNumberOfBlocksFast(_PREHASH_Data);
+ //uuid_list_t return_ids;
+ LLUUID owner_id;
+ bool is_group_owned;
+ S32 object_count;
+ U32 most_recent_time = 0;
+ bool is_online;
+ std::string object_count_str;
+ //bool b_need_refresh = false;
+
+ // If we were waiting for the first reply, clear the "Searching..." text.
+ if (self->mFirstReply)
+ {
+ self->mOwnerList->deleteAllItems();
+ self->mFirstReply = false;
+ }
+
+ for(S32 i = 0; i < rows; ++i)
+ {
+ msg->getUUIDFast(_PREHASH_Data, _PREHASH_OwnerID, owner_id, i);
+ msg->getBOOLFast(_PREHASH_Data, _PREHASH_IsGroupOwned, is_group_owned, i);
+ msg->getS32Fast (_PREHASH_Data, _PREHASH_Count, object_count, i);
+ msg->getBOOLFast(_PREHASH_Data, _PREHASH_OnlineStatus, is_online, i);
+ if(msg->has("DataExtended"))
+ {
+ msg->getU32("DataExtended", "TimeStamp", most_recent_time, i);
+ }
+
+ if (owner_id.isNull())
+ {
+ continue;
+ }
+
+ LLNameListCtrl::NameItem item_params;
+ item_params.value = owner_id;
+ item_params.target = is_group_owned ? LLNameListCtrl::GROUP : LLNameListCtrl::INDIVIDUAL;
+
+ if (is_group_owned)
+ {
+ item_params.columns.add().type("icon").value(self->mIconGroup->getName()).column("type");
+ item_params.columns.add().value(OWNER_GROUP).font(FONT).column("online_status");
+ }
+ else if (is_online)
+ {
+ item_params.columns.add().type("icon").value(self->mIconAvatarOnline->getName()).column("type");
+ item_params.columns.add().value(OWNER_ONLINE).font(FONT).column("online_status");
+ }
+ else // offline
+ {
+ item_params.columns.add().type("icon").value(self->mIconAvatarOffline->getName()).column("type");
+ item_params.columns.add().value(OWNER_OFFLINE).font(FONT).column("online_status");
+ }
+
+ // Placeholder for name.
+ LLAvatarName av_name;
+ LLAvatarNameCache::get(owner_id, &av_name);
+ item_params.columns.add().value(av_name.getCompleteName()).font(FONT).column("name");
+
+ object_count_str = llformat("%d", object_count);
+ item_params.columns.add().value(object_count_str).font(FONT).column("count");
+ item_params.columns.add().value(LLDate((time_t)most_recent_time)).font(FONT).column("mostrecent").type("date");
+
+ self->mOwnerList->addNameItemRow(item_params);
+ LL_DEBUGS() << "object owner " << owner_id << " (" << (is_group_owned ? "group" : "agent")
+ << ") owns " << object_count << " objects." << LL_ENDL;
+ }
+
+ // check for no results
+ if (0 == self->mOwnerList->getItemCount())
+ {
+ self->mOwnerList->setCommentText(LLTrans::getString("NoneFound"));
+ }
+ else
+ {
+ self->mOwnerList->setEnabled(true);
+ }
+
+ self->mBtnRefresh->setEnabled(true);
+}
+
+// static
+void LLPanelLandObjects::onCommitList(LLUICtrl* ctrl, void* data)
+{
+ LLPanelLandObjects* self = (LLPanelLandObjects*)data;
+
+ if (false == self->mOwnerList->getCanSelect())
+ {
+ return;
+ }
+ LLScrollListItem *item = self->mOwnerList->getFirstSelected();
+ if (item)
+ {
+ // Look up the selected name, for future dialog box use.
+ const LLScrollListCell* cell;
+ cell = item->getColumn(1);
+ if (!cell)
+ {
+ return;
+ }
+ // Is this a group?
+ self->mSelectedIsGroup = cell->getValue().asString() == OWNER_GROUP;
+ cell = item->getColumn(2);
+ self->mSelectedName = cell->getValue().asString();
+ cell = item->getColumn(3);
+ self->mSelectedCount = atoi(cell->getValue().asString().c_str());
+
+ // Set the selection, and enable the return button.
+ self->mSelectedOwners.clear();
+ self->mSelectedOwners.insert(item->getUUID());
+ self->mBtnReturnOwnerList->setEnabled(true);
+
+ // Highlight this user's objects
+ clickShowCore(self, RT_LIST, &(self->mSelectedOwners));
+ }
+}
+
+// static
+void LLPanelLandObjects::clickShowCore(LLPanelLandObjects* self, S32 return_type, uuid_list_t* list)
+{
+ LLParcel* parcel = self->mParcel->getParcel();
+ if (!parcel) return;
+
+ send_parcel_select_objects(parcel->getLocalID(), return_type, list);
+}
+
+// static
+void LLPanelLandObjects::onClickShowOwnerObjects(void* userdata)
+{
+ clickShowCore((LLPanelLandObjects*)userdata, RT_OWNER);
+}
+
+// static
+void LLPanelLandObjects::onClickShowGroupObjects(void* userdata)
+{
+ clickShowCore((LLPanelLandObjects*)userdata, (RT_GROUP));
+}
+
+// static
+void LLPanelLandObjects::onClickShowOtherObjects(void* userdata)
+{
+ clickShowCore((LLPanelLandObjects*)userdata, RT_OTHER);
+}
+
+// static
+void LLPanelLandObjects::onClickReturnOwnerObjects(void* userdata)
+{
+ S32 owned = 0;
+
+ LLPanelLandObjects* panelp = (LLPanelLandObjects*)userdata;
+ LLParcel* parcel = panelp->mParcel->getParcel();
+ if (!parcel) return;
+
+ owned = parcel->getOwnerPrimCount();
+
+ send_parcel_select_objects(parcel->getLocalID(), RT_OWNER);
+
+ LLUUID owner_id = parcel->getOwnerID();
+
+ LLSD args;
+ args["N"] = llformat("%d",owned);
+
+ if (owner_id == gAgent.getID())
+ {
+ LLNotificationsUtil::add("ReturnObjectsOwnedBySelf", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOwnerObjects, panelp, _1, _2));
+ }
+ else
+ {
+ args["NAME"] = LLSLURL("agent", owner_id, "completename").getSLURLString();
+ LLNotificationsUtil::add("ReturnObjectsOwnedByUser", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOwnerObjects, panelp, _1, _2));
+ }
+}
+
+// static
+void LLPanelLandObjects::onClickReturnGroupObjects(void* userdata)
+{
+ LLPanelLandObjects* panelp = (LLPanelLandObjects*)userdata;
+ LLParcel* parcel = panelp->mParcel->getParcel();
+ if (!parcel) return;
+
+ send_parcel_select_objects(parcel->getLocalID(), RT_GROUP);
+
+ std::string group_name;
+ gCacheName->getGroupName(parcel->getGroupID(), group_name);
+
+ LLSD args;
+ args["NAME"] = group_name;
+ args["N"] = llformat("%d", parcel->getGroupPrimCount());
+
+ // create and show confirmation textbox
+ LLNotificationsUtil::add("ReturnObjectsDeededToGroup", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnGroupObjects, panelp, _1, _2));
+}
+
+// static
+void LLPanelLandObjects::onClickReturnOtherObjects(void* userdata)
+{
+ S32 other = 0;
+
+ LLPanelLandObjects* panelp = (LLPanelLandObjects*)userdata;
+ LLParcel* parcel = panelp->mParcel->getParcel();
+ if (!parcel) return;
+
+ other = parcel->getOtherPrimCount();
+
+ send_parcel_select_objects(parcel->getLocalID(), RT_OTHER);
+
+ LLSD args;
+ args["N"] = llformat("%d", other);
+
+ if (parcel->getIsGroupOwned())
+ {
+ std::string group_name;
+ gCacheName->getGroupName(parcel->getGroupID(), group_name);
+ args["NAME"] = group_name;
+
+ LLNotificationsUtil::add("ReturnObjectsNotOwnedByGroup", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOtherObjects, panelp, _1, _2));
+ }
+ else
+ {
+ LLUUID owner_id = parcel->getOwnerID();
+
+ if (owner_id == gAgent.getID())
+ {
+ LLNotificationsUtil::add("ReturnObjectsNotOwnedBySelf", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOtherObjects, panelp, _1, _2));
+ }
+ else
+ {
+ args["NAME"] = LLSLURL("agent", owner_id, "completename").getSLURLString();
+ LLNotificationsUtil::add("ReturnObjectsNotOwnedByUser", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOtherObjects, panelp, _1, _2));
+ }
+ }
+}
+
+// static
+void LLPanelLandObjects::onLostFocus(LLFocusableElement* caller, void* user_data)
+{
+ onCommitClean((LLUICtrl*)caller, user_data);
+}
+
+// static
+void LLPanelLandObjects::onCommitClean(LLUICtrl *caller, void* user_data)
+{
+ LLPanelLandObjects *lop = (LLPanelLandObjects *)user_data;
+ LLParcel* parcel = lop->mParcel->getParcel();
+ if (parcel)
+ {
+ S32 return_time = atoi(lop->mCleanOtherObjectsTime->getText().c_str());
+ // Only send return time if it has changed
+ if (return_time != lop->mOtherTime)
+ {
+ lop->mOtherTime = return_time;
+
+ parcel->setCleanOtherTime(lop->mOtherTime);
+ send_other_clean_time_message(parcel->getLocalID(), lop->mOtherTime);
+ }
+}
+}
+
+
+//---------------------------------------------------------------------------
+// LLPanelLandOptions
+//---------------------------------------------------------------------------
+
+LLPanelLandOptions::LLPanelLandOptions(LLParcelSelectionHandle& parcel)
+: LLPanel(),
+ mCheckEditObjects(NULL),
+ mCheckEditGroupObjects(NULL),
+ mCheckAllObjectEntry(NULL),
+ mCheckGroupObjectEntry(NULL),
+ mCheckSafe(NULL),
+ mCheckFly(NULL),
+ mCheckGroupScripts(NULL),
+ mCheckOtherScripts(NULL),
+ mCheckShowDirectory(NULL),
+ mCategoryCombo(NULL),
+ mLandingTypeCombo(NULL),
+ mSnapshotCtrl(NULL),
+ mLocationText(NULL),
+ mSeeAvatarsText(NULL),
+ mSetBtn(NULL),
+ mClearBtn(NULL),
+ mMatureCtrl(NULL),
+ mPushRestrictionCtrl(NULL),
+ mSeeAvatarsCtrl(NULL),
+ mParcel(parcel)
+{
+}
+
+
+bool LLPanelLandOptions::postBuild()
+{
+ mCheckEditObjects = getChild<LLCheckBoxCtrl>( "edit objects check");
+ childSetCommitCallback("edit objects check", onCommitAny, this);
+
+ mCheckEditGroupObjects = getChild<LLCheckBoxCtrl>( "edit group objects check");
+ childSetCommitCallback("edit group objects check", onCommitAny, this);
+
+ mCheckAllObjectEntry = getChild<LLCheckBoxCtrl>( "all object entry check");
+ childSetCommitCallback("all object entry check", onCommitAny, this);
+
+ mCheckGroupObjectEntry = getChild<LLCheckBoxCtrl>( "group object entry check");
+ childSetCommitCallback("group object entry check", onCommitAny, this);
+
+ mCheckGroupScripts = getChild<LLCheckBoxCtrl>( "check group scripts");
+ childSetCommitCallback("check group scripts", onCommitAny, this);
+
+
+ mCheckFly = getChild<LLCheckBoxCtrl>( "check fly");
+ childSetCommitCallback("check fly", onCommitAny, this);
+
+
+ mCheckOtherScripts = getChild<LLCheckBoxCtrl>( "check other scripts");
+ childSetCommitCallback("check other scripts", onCommitAny, this);
+
+
+ mCheckSafe = getChild<LLCheckBoxCtrl>( "check safe");
+ childSetCommitCallback("check safe", onCommitAny, this);
+
+
+ mPushRestrictionCtrl = getChild<LLCheckBoxCtrl>( "PushRestrictCheck");
+ childSetCommitCallback("PushRestrictCheck", onCommitAny, this);
+
+ mSeeAvatarsCtrl = getChild<LLCheckBoxCtrl>( "SeeAvatarsCheck");
+ childSetCommitCallback("SeeAvatarsCheck", onCommitAny, this);
+
+ mSeeAvatarsText = getChild<LLTextBox>("allow_see_label");
+ if (mSeeAvatarsText)
+ {
+ mSeeAvatarsText->setShowCursorHand(false);
+ mSeeAvatarsText->setSoundFlags(LLView::MOUSE_UP);
+ mSeeAvatarsText->setClickedCallback(boost::bind(&toggleSeeAvatars, this));
+ }
+
+ mCheckShowDirectory = getChild<LLCheckBoxCtrl>( "ShowDirectoryCheck");
+ childSetCommitCallback("ShowDirectoryCheck", onCommitAny, this);
+
+
+ mCategoryCombo = getChild<LLComboBox>( "land category");
+ childSetCommitCallback("land category", onCommitAny, this);
+
+
+ mMatureCtrl = getChild<LLCheckBoxCtrl>( "MatureCheck");
+ childSetCommitCallback("MatureCheck", onCommitAny, this);
+
+ if (gAgent.wantsPGOnly())
+ {
+ // Disable these buttons if they are PG (Teen) users
+ mMatureCtrl->setVisible(false);
+ mMatureCtrl->setEnabled(false);
+ }
+
+
+ mSnapshotCtrl = getChild<LLTextureCtrl>("snapshot_ctrl");
+ if (mSnapshotCtrl)
+ {
+ mSnapshotCtrl->setCommitCallback( onCommitAny, this );
+ mSnapshotCtrl->setAllowNoTexture ( true );
+ mSnapshotCtrl->setImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER);
+ mSnapshotCtrl->setDnDFilterPermMask(PERM_COPY | PERM_TRANSFER);
+ }
+ else
+ {
+ LL_WARNS() << "LLUICtrlFactory::getTexturePickerByName() returned NULL for 'snapshot_ctrl'" << LL_ENDL;
+ }
+
+
+ mLocationText = getChild<LLTextBox>("landing_point");
+
+ mSetBtn = getChild<LLButton>("Set");
+ mSetBtn->setClickedCallback(onClickSet, this);
+
+
+ mClearBtn = getChild<LLButton>("Clear");
+ mClearBtn->setClickedCallback(onClickClear, this);
+
+
+ mLandingTypeCombo = getChild<LLComboBox>( "landing type");
+ childSetCommitCallback("landing type", onCommitAny, this);
+
+ return true;
+}
+
+
+// virtual
+LLPanelLandOptions::~LLPanelLandOptions()
+{ }
+
+
+// virtual
+void LLPanelLandOptions::refresh()
+{
+ refreshSearch();
+
+ LLParcel *parcel = mParcel->getParcel();
+ if (!parcel || gDisconnected)
+ {
+ mCheckEditObjects ->set(false);
+ mCheckEditObjects ->setEnabled(false);
+
+ mCheckEditGroupObjects ->set(false);
+ mCheckEditGroupObjects ->setEnabled(false);
+
+ mCheckAllObjectEntry ->set(false);
+ mCheckAllObjectEntry ->setEnabled(false);
+
+ mCheckGroupObjectEntry ->set(false);
+ mCheckGroupObjectEntry ->setEnabled(false);
+
+ mCheckSafe ->set(false);
+ mCheckSafe ->setEnabled(false);
+
+ mCheckFly ->set(false);
+ mCheckFly ->setEnabled(false);
+
+ mCheckGroupScripts ->set(false);
+ mCheckGroupScripts ->setEnabled(false);
+
+ mCheckOtherScripts ->set(false);
+ mCheckOtherScripts ->setEnabled(false);
+
+ mPushRestrictionCtrl->set(false);
+ mPushRestrictionCtrl->setEnabled(false);
+
+ mSeeAvatarsCtrl->set(true);
+ mSeeAvatarsCtrl->setEnabled(false);
+ mSeeAvatarsText->setEnabled(false);
+
+ mLandingTypeCombo->setCurrentByIndex(0);
+ mLandingTypeCombo->setEnabled(false);
+
+ mSnapshotCtrl->setImageAssetID(LLUUID::null);
+ mSnapshotCtrl->setEnabled(false);
+
+ mLocationText->setTextArg("[LANDING]", getString("landing_point_none"));
+ mSetBtn->setEnabled(false);
+ mClearBtn->setEnabled(false);
+
+ mMatureCtrl->setEnabled(false);
+ }
+ else
+ {
+ // something selected, hooray!
+
+ // Display options
+ bool can_change_options = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_OPTIONS);
+ mCheckEditObjects ->set( parcel->getAllowModify() );
+ mCheckEditObjects ->setEnabled( can_change_options );
+
+ mCheckEditGroupObjects ->set( parcel->getAllowGroupModify() || parcel->getAllowModify());
+ mCheckEditGroupObjects ->setEnabled( can_change_options && !parcel->getAllowModify() ); // If others edit is enabled, then this is explicitly enabled.
+
+ mCheckAllObjectEntry ->set( parcel->getAllowAllObjectEntry() );
+ mCheckAllObjectEntry ->setEnabled( can_change_options );
+
+ mCheckGroupObjectEntry ->set( parcel->getAllowGroupObjectEntry() || parcel->getAllowAllObjectEntry());
+ mCheckGroupObjectEntry ->setEnabled( can_change_options && !parcel->getAllowAllObjectEntry() );
+
+ mCheckSafe ->set( !parcel->getAllowDamage() );
+ mCheckSafe ->setEnabled( can_change_options );
+
+ mCheckFly ->set( parcel->getAllowFly() );
+ mCheckFly ->setEnabled( can_change_options );
+
+ mCheckGroupScripts ->set( parcel->getAllowGroupScripts() || parcel->getAllowOtherScripts());
+ mCheckGroupScripts ->setEnabled( can_change_options && !parcel->getAllowOtherScripts());
+
+ mCheckOtherScripts ->set( parcel->getAllowOtherScripts() );
+ mCheckOtherScripts ->setEnabled( can_change_options );
+
+ mPushRestrictionCtrl->set( parcel->getRestrictPushObject() );
+ if(parcel->getRegionPushOverride())
+ {
+ mPushRestrictionCtrl->setLabel(getString("push_restrict_region_text"));
+ mPushRestrictionCtrl->setEnabled(false);
+ mPushRestrictionCtrl->set(true);
+ }
+ else
+ {
+ mPushRestrictionCtrl->setLabel(getString("push_restrict_text"));
+ mPushRestrictionCtrl->setEnabled(can_change_options);
+ }
+
+ mSeeAvatarsCtrl->set(parcel->getSeeAVs());
+ mSeeAvatarsCtrl->setEnabled(can_change_options && parcel->getHaveNewParcelLimitData());
+ mSeeAvatarsText->setEnabled(can_change_options && parcel->getHaveNewParcelLimitData());
+
+ bool can_change_landing_point = LLViewerParcelMgr::isParcelModifiableByAgent(parcel,
+ GP_LAND_SET_LANDING_POINT);
+ mLandingTypeCombo->setCurrentByIndex((S32)parcel->getLandingType());
+ mLandingTypeCombo->setEnabled( can_change_landing_point );
+
+ bool can_change_identity =
+ LLViewerParcelMgr::isParcelModifiableByAgent(
+ parcel, GP_LAND_CHANGE_IDENTITY);
+ mSnapshotCtrl->setImageAssetID(parcel->getSnapshotID());
+ mSnapshotCtrl->setEnabled( can_change_identity );
+
+ // find out where we're looking and convert that to an angle in degrees on a regular compass (not the internal representation)
+ LLVector3 user_look_at = parcel->getUserLookAt();
+ U32 user_look_at_angle = ( (U32)( ( atan2(user_look_at[1], -user_look_at[0]) + F_PI * 2 ) * RAD_TO_DEG + 0.5) - 90) % 360;
+
+ LLVector3 pos = parcel->getUserLocation();
+ if (pos.isExactlyZero())
+ {
+ mLocationText->setTextArg("[LANDING]", getString("landing_point_none"));
+ }
+ else
+ {
+ mLocationText->setTextArg("[LANDING]",llformat("%d, %d, %d (%d\xC2\xB0)",
+ ll_round(pos.mV[VX]),
+ ll_round(pos.mV[VY]),
+ ll_round(pos.mV[VZ]),
+ user_look_at_angle));
+ }
+
+ mSetBtn->setEnabled( can_change_landing_point );
+ mClearBtn->setEnabled( can_change_landing_point );
+
+ if (gAgent.wantsPGOnly())
+ {
+ // Disable these buttons if they are PG (Teen) users
+ mMatureCtrl->setVisible(false);
+ mMatureCtrl->setEnabled(false);
+ }
+ else
+ {
+ // not teen so fill in the data for the maturity control
+ mMatureCtrl->setVisible(true);
+ LLStyle::Params style;
+ style.image(LLUI::getUIImage(gFloaterView->getParentFloater(this)->getString("maturity_icon_moderate")));
+ LLCheckBoxWithTBAcess* fullaccess_mature_ctrl = (LLCheckBoxWithTBAcess*)mMatureCtrl;
+ fullaccess_mature_ctrl->getTextBox()->setText(LLStringExplicit(""));
+ fullaccess_mature_ctrl->getTextBox()->appendImageSegment(style);
+ fullaccess_mature_ctrl->getTextBox()->appendText(getString("mature_check_mature"), false);
+ fullaccess_mature_ctrl->setToolTip(getString("mature_check_mature_tooltip"));
+ fullaccess_mature_ctrl->reshape(fullaccess_mature_ctrl->getRect().getWidth(), fullaccess_mature_ctrl->getRect().getHeight(), false);
+
+ // they can see the checkbox, but its disposition depends on the
+ // state of the region
+ LLViewerRegion* regionp = LLViewerParcelMgr::getInstance()->getSelectionRegion();
+ if (regionp)
+ {
+ if (regionp->getSimAccess() == SIM_ACCESS_PG)
+ {
+ mMatureCtrl->setEnabled(false);
+ mMatureCtrl->set(false);
+ }
+ else if (regionp->getSimAccess() == SIM_ACCESS_MATURE)
+ {
+ mMatureCtrl->setEnabled(can_change_identity);
+ mMatureCtrl->set(parcel->getMaturePublish());
+ }
+ else if (regionp->getSimAccess() == SIM_ACCESS_ADULT)
+ {
+ mMatureCtrl->setEnabled(false);
+ mMatureCtrl->set(true);
+ mMatureCtrl->setLabel(getString("mature_check_adult"));
+ mMatureCtrl->setToolTip(getString("mature_check_adult_tooltip"));
+ }
+ }
+ }
+ }
+}
+
+// virtual
+void LLPanelLandOptions::draw()
+{
+ LLPanel::draw();
+}
+
+
+// private
+void LLPanelLandOptions::refreshSearch()
+{
+ LLParcel *parcel = mParcel->getParcel();
+ if (!parcel || gDisconnected)
+ {
+ mCheckShowDirectory->set(false);
+ mCheckShowDirectory->setEnabled(false);
+
+ const std::string& none_string = LLParcel::getCategoryString(LLParcel::C_NONE);
+ mCategoryCombo->setValue(none_string);
+ mCategoryCombo->setEnabled(false);
+ return;
+ }
+
+ LLViewerRegion* region =
+ LLViewerParcelMgr::getInstance()->getSelectionRegion();
+
+ bool can_change =
+ LLViewerParcelMgr::isParcelModifiableByAgent(
+ parcel, GP_LAND_FIND_PLACES)
+ && region
+ && !(region->getRegionFlag(REGION_FLAGS_BLOCK_PARCEL_SEARCH));
+
+ bool show_directory = parcel->getParcelFlag(PF_SHOW_DIRECTORY);
+ mCheckShowDirectory->set(show_directory);
+
+ // Set by string in case the order in UI doesn't match the order by index.
+ LLParcel::ECategory cat = parcel->getCategory();
+ const std::string& category_string = LLParcel::getCategoryString(cat);
+ mCategoryCombo->setValue(category_string);
+
+ std::string tooltip;
+ bool enable_show_directory = false;
+ // Parcels <= 128 square meters cannot be listed in search, in an
+ // effort to reduce search spam from small parcels. See also
+ // the search crawler "grid-crawl.py" in secondlife.com/doc/app/search/ JC
+ const S32 MIN_PARCEL_AREA_FOR_SEARCH = 128;
+ bool large_enough = parcel->getArea() >= MIN_PARCEL_AREA_FOR_SEARCH;
+ if (large_enough)
+ {
+ if (can_change)
+ {
+ tooltip = getString("search_enabled_tooltip");
+ enable_show_directory = true;
+ }
+ else
+ {
+ tooltip = getString("search_disabled_permissions_tooltip");
+ enable_show_directory = false;
+ }
+ }
+ else
+ {
+ // not large enough to include in search
+ if (can_change)
+ {
+ if (show_directory)
+ {
+ // parcels that are too small, but are still in search for
+ // legacy reasons, need to have the check box enabled so
+ // the owner can delist the parcel. JC
+ tooltip = getString("search_enabled_tooltip");
+ enable_show_directory = true;
+ }
+ else
+ {
+ tooltip = getString("search_disabled_small_tooltip");
+ enable_show_directory = false;
+ }
+ }
+ else
+ {
+ // both too small and don't have permission, so just
+ // show the permissions as the reason (which is probably
+ // the more common case) JC
+ tooltip = getString("search_disabled_permissions_tooltip");
+ enable_show_directory = false;
+ }
+ }
+ mCheckShowDirectory->setToolTip(tooltip);
+ mCategoryCombo->setToolTip(tooltip);
+ mCheckShowDirectory->setEnabled(enable_show_directory);
+ mCategoryCombo->setEnabled(enable_show_directory);
+}
+
+
+// static
+void LLPanelLandOptions::onCommitAny(LLUICtrl *ctrl, void *userdata)
+{
+ LLPanelLandOptions *self = (LLPanelLandOptions *)userdata;
+
+ LLParcel* parcel = self->mParcel->getParcel();
+ if (!parcel)
+ {
+ return;
+ }
+
+ // Extract data from UI
+ bool create_objects = self->mCheckEditObjects->get();
+ bool create_group_objects = self->mCheckEditGroupObjects->get() || self->mCheckEditObjects->get();
+ bool all_object_entry = self->mCheckAllObjectEntry->get();
+ bool group_object_entry = self->mCheckGroupObjectEntry->get() || self->mCheckAllObjectEntry->get();
+ bool allow_terraform = false; // removed from UI so always off now - self->mCheckEditLand->get();
+ bool allow_damage = !self->mCheckSafe->get();
+ bool allow_fly = self->mCheckFly->get();
+ bool allow_landmark = true; // cannot restrict landmark creation
+ bool allow_other_scripts = self->mCheckOtherScripts->get();
+ bool allow_group_scripts = self->mCheckGroupScripts->get() || allow_other_scripts;
+ bool allow_publish = false;
+ bool mature_publish = self->mMatureCtrl->get();
+ bool push_restriction = self->mPushRestrictionCtrl->get();
+ bool see_avs = self->mSeeAvatarsCtrl->get();
+ bool show_directory = self->mCheckShowDirectory->get();
+ // we have to get the index from a lookup, not from the position in the dropdown!
+ S32 category_index = LLParcel::getCategoryFromString(self->mCategoryCombo->getSelectedValue());
+ S32 landing_type_index = self->mLandingTypeCombo->getCurrentIndex();
+ LLUUID snapshot_id = self->mSnapshotCtrl->getImageAssetID();
+ LLViewerRegion* region;
+ region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
+
+ if (region && region->getAllowDamage())
+ { // Damage is allowed on the region - server will always allow scripts
+ if ( (!allow_other_scripts && parcel->getParcelFlag(PF_ALLOW_OTHER_SCRIPTS)) ||
+ (!allow_group_scripts && parcel->getParcelFlag(PF_ALLOW_GROUP_SCRIPTS)) )
+ { // Don't allow turning off "Run Scripts" if damage is allowed in the region
+ self->mCheckOtherScripts->set(parcel->getParcelFlag(PF_ALLOW_OTHER_SCRIPTS)); // Restore UI to actual settings
+ self->mCheckGroupScripts->set(parcel->getParcelFlag(PF_ALLOW_GROUP_SCRIPTS));
+ LLNotificationsUtil::add("UnableToDisableOutsideScripts");
+ return;
+ }
+ }
+
+ // Push data into current parcel
+ parcel->setParcelFlag(PF_CREATE_OBJECTS, create_objects);
+ parcel->setParcelFlag(PF_CREATE_GROUP_OBJECTS, create_group_objects);
+ parcel->setParcelFlag(PF_ALLOW_ALL_OBJECT_ENTRY, all_object_entry);
+ parcel->setParcelFlag(PF_ALLOW_GROUP_OBJECT_ENTRY, group_object_entry);
+ parcel->setParcelFlag(PF_ALLOW_TERRAFORM, allow_terraform);
+ parcel->setParcelFlag(PF_ALLOW_DAMAGE, allow_damage);
+ parcel->setParcelFlag(PF_ALLOW_FLY, allow_fly);
+ parcel->setParcelFlag(PF_ALLOW_LANDMARK, allow_landmark);
+ parcel->setParcelFlag(PF_ALLOW_GROUP_SCRIPTS, allow_group_scripts);
+ parcel->setParcelFlag(PF_ALLOW_OTHER_SCRIPTS, allow_other_scripts);
+ parcel->setParcelFlag(PF_SHOW_DIRECTORY, show_directory);
+ parcel->setParcelFlag(PF_ALLOW_PUBLISH, allow_publish);
+ parcel->setParcelFlag(PF_MATURE_PUBLISH, mature_publish);
+ parcel->setParcelFlag(PF_RESTRICT_PUSHOBJECT, push_restriction);
+ parcel->setCategory((LLParcel::ECategory)category_index);
+ parcel->setLandingType((LLParcel::ELandingType)landing_type_index);
+ parcel->setSnapshotID(snapshot_id);
+ parcel->setSeeAVs(see_avs);
+
+ // Send current parcel data upstream to server
+ LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate( parcel );
+
+ // Might have changed properties, so let's redraw!
+ self->refresh();
+}
+
+
+// static
+void LLPanelLandOptions::onClickSet(void* userdata)
+{
+ LLPanelLandOptions* self = (LLPanelLandOptions*)userdata;
+
+ LLParcel* selected_parcel = self->mParcel->getParcel();
+ if (!selected_parcel) return;
+
+ LLParcel* agent_parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
+ if (!agent_parcel) return;
+
+ if (agent_parcel->getLocalID() != selected_parcel->getLocalID())
+ {
+ LLNotificationsUtil::add("MustBeInParcel");
+ return;
+ }
+
+ LLVector3 pos_region = gAgent.getPositionAgent();
+ selected_parcel->setUserLocation(pos_region);
+ selected_parcel->setUserLookAt(gAgent.getFrameAgent().getAtAxis());
+
+ LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate(selected_parcel);
+
+ self->refresh();
+}
+
+void LLPanelLandOptions::onClickClear(void* userdata)
+{
+ LLPanelLandOptions* self = (LLPanelLandOptions*)userdata;
+
+ LLParcel* selected_parcel = self->mParcel->getParcel();
+ if (!selected_parcel) return;
+
+ // yes, this magic number of 0,0,0 means that it is clear
+ LLVector3 zero_vec(0.f, 0.f, 0.f);
+ selected_parcel->setUserLocation(zero_vec);
+ selected_parcel->setUserLookAt(zero_vec);
+
+ LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate(selected_parcel);
+
+ self->refresh();
+}
+
+void LLPanelLandOptions::toggleSeeAvatars(void* userdata)
+{
+ LLPanelLandOptions* self = (LLPanelLandOptions*)userdata;
+ if (self)
+ {
+ self->getChild<LLCheckBoxCtrl>("SeeAvatarsCheck")->toggle();
+ self->getChild<LLCheckBoxCtrl>("SeeAvatarsCheck")->setBtnFocus();
+ self->onCommitAny(NULL, userdata);
+ }
+}
+//---------------------------------------------------------------------------
+// LLPanelLandAccess
+//---------------------------------------------------------------------------
+
+LLPanelLandAccess::LLPanelLandAccess(LLParcelSelectionHandle& parcel)
+ : LLPanel(),
+ mParcel(parcel)
+{
+}
+
+
+bool LLPanelLandAccess::postBuild()
+{
+ childSetCommitCallback("public_access", onCommitPublicAccess, this);
+ childSetCommitCallback("limit_payment", onCommitAny, this);
+ childSetCommitCallback("limit_age_verified", onCommitAny, this);
+ childSetCommitCallback("GroupCheck", onCommitGroupCheck, this);
+ childSetCommitCallback("PassCheck", onCommitAny, this);
+ childSetCommitCallback("pass_combo", onCommitAny, this);
+ childSetCommitCallback("PriceSpin", onCommitAny, this);
+ childSetCommitCallback("HoursSpin", onCommitAny, this);
+
+ childSetAction("add_allowed", boost::bind(&LLPanelLandAccess::onClickAddAccess, this));
+ childSetAction("remove_allowed", onClickRemoveAccess, this);
+ childSetAction("add_banned", boost::bind(&LLPanelLandAccess::onClickAddBanned, this));
+ childSetAction("remove_banned", onClickRemoveBanned, this);
+
+ mListAccess = getChild<LLNameListCtrl>("AccessList");
+ if (mListAccess)
+ {
+ mListAccess->sortByColumnIndex(0, true); // ascending
+ mListAccess->setContextMenu(LLScrollListCtrl::MENU_AVATAR);
+ }
+
+ mListBanned = getChild<LLNameListCtrl>("BannedList");
+ if (mListBanned)
+ {
+ mListBanned->sortByColumnIndex(0, true); // ascending
+ mListBanned->setContextMenu(LLScrollListCtrl::MENU_AVATAR);
+ mListBanned->setAlternateSort();
+ }
+
+ return true;
+}
+
+
+LLPanelLandAccess::~LLPanelLandAccess()
+{
+}
+
+void LLPanelLandAccess::refresh()
+{
+ LLFloater* parent_floater = gFloaterView->getParentFloater(this);
+ LLParcel *parcel = mParcel->getParcel();
+
+ // Display options
+ if (parcel && !gDisconnected)
+ {
+ bool use_access_list = parcel->getParcelFlag(PF_USE_ACCESS_LIST);
+ bool use_group = parcel->getParcelFlag(PF_USE_ACCESS_GROUP);
+ bool public_access = !use_access_list;
+
+ if (parcel->getRegionAllowAccessOverride())
+ {
+ getChild<LLUICtrl>("public_access")->setValue(public_access);
+ getChild<LLUICtrl>("GroupCheck")->setValue(use_group);
+ }
+ else
+ {
+ getChild<LLUICtrl>("public_access")->setValue(true);
+ getChild<LLUICtrl>("GroupCheck")->setValue(false);
+ }
+ std::string group_name;
+ gCacheName->getGroupName(parcel->getGroupID(), group_name);
+ getChild<LLUICtrl>("GroupCheck")->setLabelArg("[GROUP]", group_name );
+
+ // Allow list
+ if (mListAccess)
+ {
+ // Clear the sort order so we don't re-sort on every add.
+ mListAccess->clearSortOrder();
+ mListAccess->deleteAllItems();
+ S32 count = parcel->mAccessList.size();
+ getChild<LLUICtrl>("AllowedText")->setTextArg("[COUNT]", llformat("%d",count));
+ getChild<LLUICtrl>("AllowedText")->setTextArg("[MAX]", llformat("%d",PARCEL_MAX_ACCESS_LIST));
+
+ getChild<LLUICtrl>("AccessList")->setToolTipArg(LLStringExplicit("[LISTED]"), llformat("%d",count));
+ getChild<LLUICtrl>("AccessList")->setToolTipArg(LLStringExplicit("[MAX]"), llformat("%d",PARCEL_MAX_ACCESS_LIST));
+
+ for (LLAccessEntry::map::const_iterator cit = parcel->mAccessList.begin();
+ cit != parcel->mAccessList.end(); ++cit)
+ {
+ const LLAccessEntry& entry = (*cit).second;
+ std::string prefix;
+ if (entry.mTime != 0)
+ {
+ LLStringUtil::format_map_t args;
+ S32 now = time(NULL);
+ S32 seconds = entry.mTime - now;
+ if (seconds < 0) seconds = 0;
+ prefix.assign(" (");
+ if (seconds >= 120)
+ {
+ args["[MINUTES]"] = llformat("%d", (seconds/60));
+ std::string buf = parent_floater->getString ("Minutes", args);
+ prefix.append(buf);
+ }
+ else if (seconds >= 60)
+ {
+ prefix.append("1 " + parent_floater->getString("Minute"));
+ }
+ else
+ {
+ args["[SECONDS]"] = llformat("%d", seconds);
+ std::string buf = parent_floater->getString ("Seconds", args);
+ prefix.append(buf);
+ }
+ prefix.append(" " + parent_floater->getString("Remaining") + ") ");
+ }
+ mListAccess->addNameItem(entry.mID, ADD_DEFAULT, true, "", prefix);
+ }
+ mListAccess->sortByName(true);
+ }
+
+ // Ban List
+ if(mListBanned)
+ {
+ // Clear the sort order so we don't re-sort on every add.
+ mListBanned->clearSortOrder();
+ mListBanned->deleteAllItems();
+ S32 count = parcel->mBanList.size();
+ getChild<LLUICtrl>("BanCheck")->setTextArg("[COUNT]", llformat("%d",count));
+ getChild<LLUICtrl>("BanCheck")->setTextArg("[MAX]", llformat("%d",PARCEL_MAX_ACCESS_LIST));
+
+ getChild<LLUICtrl>("BannedList")->setToolTipArg(LLStringExplicit("[LISTED]"), llformat("%d",count));
+ getChild<LLUICtrl>("BannedList")->setToolTipArg(LLStringExplicit("[MAX]"), llformat("%d",PARCEL_MAX_ACCESS_LIST));
+
+ for (LLAccessEntry::map::const_iterator cit = parcel->mBanList.begin();
+ cit != parcel->mBanList.end(); ++cit)
+ {
+ const LLAccessEntry& entry = (*cit).second;
+ std::string duration;
+ S32 seconds = -1;
+ if (entry.mTime != 0)
+ {
+ LLStringUtil::format_map_t args;
+ S32 now = time(NULL);
+ seconds = entry.mTime - now;
+ if (seconds < 0) seconds = 0;
+
+ if (seconds >= 7200)
+ {
+ args["[HOURS]"] = llformat("%d", (seconds / 3600));
+ duration = parent_floater->getString("Hours", args);
+ }
+ else if (seconds >= 3600)
+ {
+ duration = "1 " + parent_floater->getString("Hour");
+ }
+ else if (seconds >= 120)
+ {
+ args["[MINUTES]"] = llformat("%d", (seconds / 60));
+ duration = parent_floater->getString("Minutes", args);
+ }
+ else if (seconds >= 60)
+ {
+ duration = "1 " + parent_floater->getString("Minute");
+ }
+ else
+ {
+ args["[SECONDS]"] = llformat("%d", seconds);
+ duration = parent_floater->getString("Seconds", args);
+ }
+ }
+ else
+ {
+ duration = parent_floater->getString("Always");
+ }
+ LLSD item;
+ item["id"] = entry.mID;
+ LLSD& columns = item["columns"];
+ columns[0]["column"] = "name"; // to be populated later
+ columns[1]["column"] = "duration";
+ columns[1]["value"] = duration;
+ columns[1]["alt_value"] = entry.mTime != 0 ? std::to_string(seconds) : "Always";
+ mListBanned->addElement(item);
+ }
+ mListBanned->sortByName(true);
+ }
+
+ if(parcel->getRegionDenyAnonymousOverride())
+ {
+ getChild<LLUICtrl>("limit_payment")->setValue(true);
+ getChild<LLUICtrl>("limit_payment")->setLabelArg("[ESTATE_PAYMENT_LIMIT]", getString("access_estate_defined") );
+ }
+ else
+ {
+ getChild<LLUICtrl>("limit_payment")->setValue((parcel->getParcelFlag(PF_DENY_ANONYMOUS)));
+ getChild<LLUICtrl>("limit_payment")->setLabelArg("[ESTATE_PAYMENT_LIMIT]", std::string() );
+ }
+ if(parcel->getRegionDenyAgeUnverifiedOverride())
+ {
+ getChild<LLUICtrl>("limit_age_verified")->setValue(true);
+ getChild<LLUICtrl>("limit_age_verified")->setLabelArg("[ESTATE_AGE_LIMIT]", getString("access_estate_defined") );
+ }
+ else
+ {
+ getChild<LLUICtrl>("limit_age_verified")->setValue((parcel->getParcelFlag(PF_DENY_AGEUNVERIFIED)));
+ getChild<LLUICtrl>("limit_age_verified")->setLabelArg("[ESTATE_AGE_LIMIT]", std::string() );
+ }
+
+ bool use_pass = parcel->getParcelFlag(PF_USE_PASS_LIST);
+ getChild<LLUICtrl>("PassCheck")->setValue(use_pass);
+ LLCtrlSelectionInterface* passcombo = childGetSelectionInterface("pass_combo");
+ if (passcombo)
+ {
+ if (public_access || !use_pass)
+ {
+ passcombo->selectByValue("anyone");
+ }
+ }
+
+ S32 pass_price = parcel->getPassPrice();
+ getChild<LLUICtrl>("PriceSpin")->setValue((F32)pass_price );
+
+ F32 pass_hours = parcel->getPassHours();
+ getChild<LLUICtrl>("HoursSpin")->setValue(pass_hours );
+ }
+ else
+ {
+ getChild<LLUICtrl>("public_access")->setValue(false);
+ getChild<LLUICtrl>("limit_payment")->setValue(false);
+ getChild<LLUICtrl>("limit_age_verified")->setValue(false);
+ getChild<LLUICtrl>("GroupCheck")->setValue(false);
+ getChild<LLUICtrl>("GroupCheck")->setLabelArg("[GROUP]", LLStringUtil::null );
+ getChild<LLUICtrl>("PassCheck")->setValue(false);
+ getChild<LLUICtrl>("PriceSpin")->setValue((F32)PARCEL_PASS_PRICE_DEFAULT);
+ getChild<LLUICtrl>("HoursSpin")->setValue(PARCEL_PASS_HOURS_DEFAULT );
+ getChild<LLUICtrl>("AccessList")->setToolTipArg(LLStringExplicit("[LISTED]"), llformat("%d",0));
+ getChild<LLUICtrl>("AccessList")->setToolTipArg(LLStringExplicit("[MAX]"), llformat("%d",0));
+ getChild<LLUICtrl>("BannedList")->setToolTipArg(LLStringExplicit("[LISTED]"), llformat("%d",0));
+ getChild<LLUICtrl>("BannedList")->setToolTipArg(LLStringExplicit("[MAX]"), llformat("%d",0));
+ }
+}
+
+void LLPanelLandAccess::refresh_ui()
+{
+ getChildView("public_access")->setEnabled(false);
+ getChildView("limit_payment")->setEnabled(false);
+ getChildView("limit_age_verified")->setEnabled(false);
+ getChildView("GroupCheck")->setEnabled(false);
+ getChildView("PassCheck")->setEnabled(false);
+ getChildView("pass_combo")->setEnabled(false);
+ getChildView("PriceSpin")->setEnabled(false);
+ getChildView("HoursSpin")->setEnabled(false);
+ getChildView("AccessList")->setEnabled(false);
+ getChildView("BannedList")->setEnabled(false);
+ getChildView("add_allowed")->setEnabled(false);
+ getChildView("remove_allowed")->setEnabled(false);
+ getChildView("add_banned")->setEnabled(false);
+ getChildView("remove_banned")->setEnabled(false);
+
+ LLParcel *parcel = mParcel->getParcel();
+ if (parcel && !gDisconnected)
+ {
+ bool can_manage_allowed = false;
+ bool can_manage_banned = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_MANAGE_BANNED);
+
+ if (parcel->getRegionAllowAccessOverride())
+ { // Estate owner may have disabled allowing the parcel owner from managing access.
+ can_manage_allowed = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_MANAGE_ALLOWED);
+ }
+
+ getChildView("public_access")->setEnabled(can_manage_allowed);
+ bool public_access = getChild<LLUICtrl>("public_access")->getValue().asBoolean();
+ if (public_access)
+ {
+ bool override = false;
+ if(parcel->getRegionDenyAnonymousOverride())
+ {
+ override = true;
+ getChildView("limit_payment")->setEnabled(false);
+ }
+ else
+ {
+ getChildView("limit_payment")->setEnabled(can_manage_allowed);
+ }
+ if(parcel->getRegionDenyAgeUnverifiedOverride())
+ {
+ override = true;
+ getChildView("limit_age_verified")->setEnabled(false);
+ }
+ else
+ {
+ getChildView("limit_age_verified")->setEnabled(can_manage_allowed);
+ }
+ if (override)
+ {
+ getChildView("Only Allow")->setToolTip(getString("estate_override"));
+ }
+ else
+ {
+ getChildView("Only Allow")->setToolTip(std::string());
+ }
+ getChildView("PassCheck")->setEnabled(false);
+ getChildView("pass_combo")->setEnabled(false);
+ getChildView("AccessList")->setEnabled(false);
+ }
+ else
+ {
+ getChildView("limit_payment")->setEnabled(false);
+ getChildView("limit_age_verified")->setEnabled(false);
+
+
+ bool sell_passes = getChild<LLUICtrl>("PassCheck")->getValue().asBoolean();
+ getChildView("PassCheck")->setEnabled(can_manage_allowed);
+ if (sell_passes)
+ {
+ getChildView("pass_combo")->setEnabled(can_manage_allowed);
+ getChildView("PriceSpin")->setEnabled(can_manage_allowed);
+ getChildView("HoursSpin")->setEnabled(can_manage_allowed);
+ }
+ }
+ std::string group_name;
+ if (gCacheName->getGroupName(parcel->getGroupID(), group_name))
+ {
+ bool can_allow_groups = !public_access || (public_access && (getChild<LLUICtrl>("limit_payment")->getValue().asBoolean() ^ getChild<LLUICtrl>("limit_age_verified")->getValue().asBoolean()));
+ getChildView("GroupCheck")->setEnabled(can_manage_allowed && can_allow_groups);
+ }
+ getChildView("AccessList")->setEnabled(can_manage_allowed);
+ S32 allowed_list_count = parcel->mAccessList.size();
+ getChildView("add_allowed")->setEnabled(can_manage_allowed && allowed_list_count < PARCEL_MAX_ACCESS_LIST);
+ bool has_selected = (mListAccess && mListAccess->getSelectionInterface()->getFirstSelectedIndex() >= 0);
+ getChildView("remove_allowed")->setEnabled(can_manage_allowed && has_selected);
+
+ getChildView("BannedList")->setEnabled(can_manage_banned);
+ S32 banned_list_count = parcel->mBanList.size();
+ getChildView("add_banned")->setEnabled(can_manage_banned && banned_list_count < PARCEL_MAX_ACCESS_LIST);
+ has_selected = (mListBanned && mListBanned->getSelectionInterface()->getFirstSelectedIndex() >= 0);
+ getChildView("remove_banned")->setEnabled(can_manage_banned && has_selected);
+ }
+}
+
+
+// public
+void LLPanelLandAccess::refreshNames()
+{
+ LLParcel* parcel = mParcel->getParcel();
+ std::string group_name;
+ if(parcel)
+ {
+ gCacheName->getGroupName(parcel->getGroupID(), group_name);
+ }
+ getChild<LLUICtrl>("GroupCheck")->setLabelArg("[GROUP]", group_name);
+}
+
+
+// virtual
+void LLPanelLandAccess::draw()
+{
+ refresh_ui();
+ refreshNames();
+ LLPanel::draw();
+}
+
+// static
+void LLPanelLandAccess::onCommitPublicAccess(LLUICtrl *ctrl, void *userdata)
+{
+ LLPanelLandAccess *self = (LLPanelLandAccess *)userdata;
+ LLParcel* parcel = self->mParcel->getParcel();
+ if (!parcel)
+ {
+ return;
+ }
+
+ onCommitAny(ctrl, userdata);
+}
+
+void LLPanelLandAccess::onCommitGroupCheck(LLUICtrl *ctrl, void *userdata)
+{
+ LLPanelLandAccess *self = (LLPanelLandAccess *)userdata;
+ LLParcel* parcel = self->mParcel->getParcel();
+ if (!parcel)
+ {
+ return;
+ }
+
+ bool use_pass_list = !self->getChild<LLUICtrl>("public_access")->getValue().asBoolean();
+ bool use_access_group = self->getChild<LLUICtrl>("GroupCheck")->getValue().asBoolean();
+ LLCtrlSelectionInterface* passcombo = self->childGetSelectionInterface("pass_combo");
+ if (passcombo)
+ {
+ if (use_access_group && use_pass_list)
+ {
+ if (passcombo->getSelectedValue().asString() == "group")
+ {
+ passcombo->selectByValue("anyone");
+ }
+ }
+ }
+
+ onCommitAny(ctrl, userdata);
+}
+
+// static
+void LLPanelLandAccess::onCommitAny(LLUICtrl *ctrl, void *userdata)
+{
+ LLPanelLandAccess *self = (LLPanelLandAccess *)userdata;
+
+ LLParcel* parcel = self->mParcel->getParcel();
+ if (!parcel)
+ {
+ return;
+ }
+
+ // Extract data from UI
+ bool public_access = self->getChild<LLUICtrl>("public_access")->getValue().asBoolean();
+ bool use_access_group = self->getChild<LLUICtrl>("GroupCheck")->getValue().asBoolean();
+ if (use_access_group)
+ {
+ std::string group_name;
+ if (!gCacheName->getGroupName(parcel->getGroupID(), group_name))
+ {
+ use_access_group = false;
+ }
+ }
+
+ bool limit_payment = false, limit_age_verified = false;
+ bool use_access_list = false;
+ bool use_pass_list = false;
+
+ if (public_access)
+ {
+ use_access_list = false;
+ limit_payment = self->getChild<LLUICtrl>("limit_payment")->getValue().asBoolean();
+ limit_age_verified = self->getChild<LLUICtrl>("limit_age_verified")->getValue().asBoolean();
+ }
+ else
+ {
+ use_access_list = true;
+ use_pass_list = self->getChild<LLUICtrl>("PassCheck")->getValue().asBoolean();
+ LLCtrlSelectionInterface* passcombo = self->childGetSelectionInterface("pass_combo");
+ if (passcombo)
+ {
+ if (use_access_group && use_pass_list)
+ {
+ if (passcombo->getSelectedValue().asString() == "group")
+ {
+ use_access_group = false;
+ }
+ }
+ }
+ }
+
+ S32 pass_price = llfloor((F32)self->getChild<LLUICtrl>("PriceSpin")->getValue().asReal());
+ F32 pass_hours = (F32)self->getChild<LLUICtrl>("HoursSpin")->getValue().asReal();
+
+ // Push data into current parcel
+ parcel->setParcelFlag(PF_USE_ACCESS_GROUP, use_access_group);
+ parcel->setParcelFlag(PF_USE_ACCESS_LIST, use_access_list);
+ parcel->setParcelFlag(PF_USE_PASS_LIST, use_pass_list);
+ parcel->setParcelFlag(PF_USE_BAN_LIST, true);
+ parcel->setParcelFlag(PF_DENY_ANONYMOUS, limit_payment);
+ parcel->setParcelFlag(PF_DENY_AGEUNVERIFIED, limit_age_verified);
+
+ parcel->setPassPrice( pass_price );
+ parcel->setPassHours( pass_hours );
+
+ // Send current parcel data upstream to server
+ LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate( parcel );
+
+ // Might have changed properties, so let's redraw!
+ self->refresh();
+}
+
+void LLPanelLandAccess::onClickAddAccess()
+{
+ LLView * button = findChild<LLButton>("add_allowed");
+ LLFloater * root_floater = gFloaterView->getParentFloater(this);
+ LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(
+ boost::bind(&LLPanelLandAccess::callbackAvatarCBAccess, this, _1), false, false, false, root_floater->getName(), button);
+ if (picker)
+ {
+ root_floater->addDependentFloater(picker);
+ }
+}
+
+void LLPanelLandAccess::callbackAvatarCBAccess(const uuid_vec_t& ids)
+{
+ if (!ids.empty())
+ {
+ LLUUID id = ids[0];
+ LLParcel* parcel = mParcel->getParcel();
+ if (parcel && parcel->addToAccessList(id, 0))
+ {
+ U32 lists_to_update = AL_ACCESS;
+ // agent was successfully added to access list
+ // but we also need to check ban list to ensure that agent will not be in two lists simultaneously
+ if(parcel->removeFromBanList(id))
+ {
+ lists_to_update |= AL_BAN;
+ }
+ LLViewerParcelMgr::getInstance()->sendParcelAccessListUpdate(lists_to_update);
+ refresh();
+ }
+ }
+}
+
+// static
+void LLPanelLandAccess::onClickRemoveAccess(void* data)
+{
+ LLPanelLandAccess* panelp = (LLPanelLandAccess*)data;
+ if (panelp && panelp->mListAccess)
+ {
+ LLParcel* parcel = panelp->mParcel->getParcel();
+ if (parcel)
+ {
+ std::vector<LLScrollListItem*> names = panelp->mListAccess->getAllSelected();
+ for (std::vector<LLScrollListItem*>::iterator iter = names.begin();
+ iter != names.end(); )
+ {
+ LLScrollListItem* item = *iter++;
+ const LLUUID& agent_id = item->getUUID();
+ parcel->removeFromAccessList(agent_id);
+ }
+ LLViewerParcelMgr::getInstance()->sendParcelAccessListUpdate(AL_ACCESS);
+ panelp->refresh();
+ }
+ }
+}
+
+// static
+void LLPanelLandAccess::onClickAddBanned()
+{
+ LLView * button = findChild<LLButton>("add_banned");
+ LLFloater * root_floater = gFloaterView->getParentFloater(this);
+ LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(
+ boost::bind(&LLPanelLandAccess::callbackAvatarCBBanned, this, _1), true, false, false, root_floater->getName(), button);
+ if (picker)
+ {
+ root_floater->addDependentFloater(picker);
+ }
+}
+
+// static
+void LLPanelLandAccess::callbackAvatarCBBanned(const uuid_vec_t& ids)
+{
+ LLFloater * root_floater = gFloaterView->getParentFloater(this);
+ LLFloaterBanDuration* duration_floater = LLFloaterBanDuration::show(
+ boost::bind(&LLPanelLandAccess::callbackAvatarCBBanned2, this, _1, _2), ids);
+ if (duration_floater)
+ {
+ root_floater->addDependentFloater(duration_floater);
+ }
+}
+
+void LLPanelLandAccess::callbackAvatarCBBanned2(const uuid_vec_t& ids, S32 duration)
+{
+ LLParcel* parcel = mParcel->getParcel();
+ if (!parcel) return;
+
+ U32 lists_to_update = 0;
+
+ for (uuid_vec_t::const_iterator it = ids.begin(); it < ids.end(); it++)
+ {
+ LLUUID id = *it;
+ if (parcel->addToBanList(id, duration))
+ {
+ lists_to_update |= AL_BAN;
+ // agent was successfully added to ban list
+ // but we also need to check access list to ensure that agent will not be in two lists simultaneously
+ if (parcel->removeFromAccessList(id))
+ {
+ lists_to_update |= AL_ACCESS;
+ }
+ }
+ }
+ if (lists_to_update > 0)
+ {
+ LLViewerParcelMgr::getInstance()->sendParcelAccessListUpdate(lists_to_update);
+ refresh();
+ }
+}
+
+// static
+void LLPanelLandAccess::onClickRemoveBanned(void* data)
+{
+ LLPanelLandAccess* panelp = (LLPanelLandAccess*)data;
+ if (panelp && panelp->mListBanned)
+ {
+ LLParcel* parcel = panelp->mParcel->getParcel();
+ if (parcel)
+ {
+ std::vector<LLScrollListItem*> names = panelp->mListBanned->getAllSelected();
+ for (std::vector<LLScrollListItem*>::iterator iter = names.begin();
+ iter != names.end(); )
+ {
+ LLScrollListItem* item = *iter++;
+ const LLUUID& agent_id = item->getUUID();
+ parcel->removeFromBanList(agent_id);
+ }
+ LLViewerParcelMgr::getInstance()->sendParcelAccessListUpdate(AL_BAN);
+ panelp->refresh();
+ }
+ }
+}
+
+//---------------------------------------------------------------------------
+// LLPanelLandCovenant
+//---------------------------------------------------------------------------
+LLPanelLandCovenant::LLPanelLandCovenant(LLParcelSelectionHandle& parcel)
+ : LLPanel(),
+ mParcel(parcel),
+ mNextUpdateTime(0)
+{
+}
+
+LLPanelLandCovenant::~LLPanelLandCovenant()
+{
+}
+
+bool LLPanelLandCovenant::postBuild()
+{
+ mLastRegionID = LLUUID::null;
+ mNextUpdateTime = 0;
+ mTextEstateOwner = getChild<LLTextBox>("estate_owner_text");
+ mTextEstateOwner->setIsFriendCallback(LLAvatarActions::isFriend);
+ return true;
+}
+
+// virtual
+void LLPanelLandCovenant::refresh()
+{
+ LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
+ if(!region || gDisconnected) return;
+
+ LLTextBox* region_name = getChild<LLTextBox>("region_name_text");
+ if (region_name)
+ {
+ region_name->setText(region->getName());
+ }
+
+ LLTextBox* region_landtype = getChild<LLTextBox>("region_landtype_text");
+ region_landtype->setText(region->getLocalizedSimProductName());
+
+ LLTextBox* region_maturity = getChild<LLTextBox>("region_maturity_text");
+ if (region_maturity)
+ {
+ insert_maturity_into_textbox(region_maturity, gFloaterView->getParentFloater(this), MATURITY);
+ }
+
+ LLTextBox* resellable_clause = getChild<LLTextBox>("resellable_clause");
+ if (resellable_clause)
+ {
+ if (region->getRegionFlag(REGION_FLAGS_BLOCK_LAND_RESELL))
+ {
+ resellable_clause->setText(getString("can_not_resell"));
+ }
+ else
+ {
+ resellable_clause->setText(getString("can_resell"));
+ }
+ }
+
+ LLTextBox* changeable_clause = getChild<LLTextBox>("changeable_clause");
+ if (changeable_clause)
+ {
+ if (region->getRegionFlag(REGION_FLAGS_ALLOW_PARCEL_CHANGES))
+ {
+ changeable_clause->setText(getString("can_change"));
+ }
+ else
+ {
+ changeable_clause->setText(getString("can_not_change"));
+ }
+ }
+
+ if (mLastRegionID != region->getRegionID()
+ || mNextUpdateTime < LLTimer::getElapsedSeconds())
+ {
+ // Request Covenant Info
+ // Note: LLPanelLandCovenant doesn't change Covenant's content and any
+ // changes made by Estate floater should be requested by Estate floater
+ LLMessageSystem *msg = gMessageSystem;
+ msg->newMessage("EstateCovenantRequest");
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID());
+ msg->sendReliable(region->getHost());
+
+ mLastRegionID = region->getRegionID();
+ mNextUpdateTime = LLTimer::getElapsedSeconds() + COVENANT_REFRESH_TIME_SEC;
+ }
+}
+
+// static
+void LLPanelLandCovenant::updateCovenantText(const std::string &string)
+{
+ LLPanelLandCovenant* self = LLFloaterLand::getCurrentPanelLandCovenant();
+ if (self)
+ {
+ LLViewerTextEditor* editor = self->getChild<LLViewerTextEditor>("covenant_editor");
+ editor->setText(string);
+ }
+}
+
+// static
+void LLPanelLandCovenant::updateEstateName(const std::string& name)
+{
+ LLPanelLandCovenant* self = LLFloaterLand::getCurrentPanelLandCovenant();
+ if (self)
+ {
+ LLTextBox* editor = self->getChild<LLTextBox>("estate_name_text");
+ if (editor) editor->setText(name);
+ }
+}
+
+// static
+void LLPanelLandCovenant::updateLastModified(const std::string& text)
+{
+ LLPanelLandCovenant* self = LLFloaterLand::getCurrentPanelLandCovenant();
+ if (self)
+ {
+ LLTextBox* editor = self->getChild<LLTextBox>("covenant_timestamp_text");
+ if (editor) editor->setText(text);
+ }
+}
+
+// static
+void LLPanelLandCovenant::updateEstateOwnerName(const std::string& name)
+{
+ LLPanelLandCovenant* self = LLFloaterLand::getCurrentPanelLandCovenant();
+ if (self)
+ {
+ self->mTextEstateOwner->setText(name);
+ }
+}
+
+// inserts maturity info(icon and text) into target textbox
+// names_floater - pointer to floater which contains strings with maturity icons filenames
+// str_to_parse is string in format "txt1[MATURITY]txt2" where maturity icon and text will be inserted instead of [MATURITY]
+void insert_maturity_into_textbox(LLTextBox* target_textbox, LLFloater* names_floater, std::string str_to_parse)
+{
+ LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
+ if (!region)
+ return;
+
+ LLStyle::Params style;
+
+ U8 sim_access = region->getSimAccess();
+
+ switch(sim_access)
+ {
+ case SIM_ACCESS_PG:
+ style.image(LLUI::getUIImage(names_floater->getString("maturity_icon_general")));
+ break;
+
+ case SIM_ACCESS_ADULT:
+ style.image(LLUI::getUIImage(names_floater->getString("maturity_icon_adult")));
+ break;
+
+ case SIM_ACCESS_MATURE:
+ style.image(LLUI::getUIImage(names_floater->getString("maturity_icon_moderate")));
+ break;
+
+ default:
+ break;
+ }
+
+ size_t maturity_pos = str_to_parse.find(MATURITY);
+
+ if (maturity_pos == std::string::npos)
+ {
+ return;
+ }
+
+ std::string text_before_rating = str_to_parse.substr(0, maturity_pos);
+ std::string text_after_rating = str_to_parse.substr(maturity_pos + MATURITY.length());
+
+ target_textbox->setText(text_before_rating);
+
+ target_textbox->appendImageSegment(style);
+
+ target_textbox->appendText(LLViewerParcelMgr::getInstance()->getSelectionRegion()->getSimAccessString(), false);
+ target_textbox->appendText(text_after_rating, false);
+}
+
+LLPanelLandExperiences::LLPanelLandExperiences( LLSafeHandle<LLParcelSelection>& parcelp )
+ : mParcel(parcelp)
+{
+
+}
+
+
+bool LLPanelLandExperiences::postBuild()
+{
+ mAllowed = setupList("panel_allowed", EXPERIENCE_KEY_TYPE_ALLOWED, AL_ALLOW_EXPERIENCE);
+ mBlocked = setupList("panel_blocked", EXPERIENCE_KEY_TYPE_BLOCKED, AL_BLOCK_EXPERIENCE);
+
+ // only non-grid-wide experiences
+ mAllowed->addFilter(boost::bind(LLPanelExperiencePicker::FilterWithProperty, _1, LLExperienceCache::PROPERTY_GRID));
+
+ // no privileged ones
+ mBlocked->addFilter(boost::bind(LLPanelExperiencePicker::FilterWithoutProperties, _1, LLExperienceCache::PROPERTY_PRIVILEGED|LLExperienceCache::PROPERTY_GRID));
+
+ getChild<LLLayoutPanel>("trusted_layout_panel")->setVisible(false);
+ getChild<LLTextBox>("experiences_help_text")->setVisible(false);
+ getChild<LLTextBox>("allowed_text_help")->setText(getString("allowed_parcel_text"));
+ getChild<LLTextBox>("blocked_text_help")->setText(getString("blocked_parcel_text"));
+
+ return LLPanel::postBuild();
+}
+
+LLPanelExperienceListEditor* LLPanelLandExperiences::setupList( const char* control_name, U32 xp_type, U32 access_type )
+{
+ LLPanelExperienceListEditor* child = findChild<LLPanelExperienceListEditor>(control_name);
+ if(child)
+ {
+ child->getChild<LLTextBox>("text_name")->setText(child->getString(control_name));
+ child->setMaxExperienceIDs(PARCEL_MAX_EXPERIENCE_LIST);
+ child->setAddedCallback(boost::bind(&LLPanelLandExperiences::experienceAdded, this, _1, xp_type, access_type));
+ child->setRemovedCallback(boost::bind(&LLPanelLandExperiences::experienceRemoved, this, _1, access_type));
+ }
+
+ return child;
+}
+
+void LLPanelLandExperiences::experienceAdded( const LLUUID& id, U32 xp_type, U32 access_type )
+{
+ LLParcel* parcel = mParcel->getParcel();
+ if (parcel)
+ {
+ parcel->setExperienceKeyType(id, xp_type);
+ LLViewerParcelMgr::getInstance()->sendParcelAccessListUpdate(access_type);
+ refresh();
+ }
+}
+
+void LLPanelLandExperiences::experienceRemoved( const LLUUID& id, U32 access_type )
+{
+ LLParcel* parcel = mParcel->getParcel();
+ if (parcel)
+ {
+ parcel->setExperienceKeyType(id, EXPERIENCE_KEY_TYPE_NONE);
+ LLViewerParcelMgr::getInstance()->sendParcelAccessListUpdate(access_type);
+ refresh();
+ }
+}
+
+void LLPanelLandExperiences::refreshPanel(LLPanelExperienceListEditor* panel, U32 xp_type)
+{
+ LLParcel *parcel = mParcel->getParcel();
+
+ // Display options
+ if (panel == NULL)
+ {
+ return;
+ }
+ if (!parcel || gDisconnected)
+ {
+ // disable the panel
+ panel->setEnabled(false);
+ panel->setExperienceIds(LLSD::emptyArray());
+ }
+ else
+ {
+ // enable the panel
+ panel->setEnabled(true);
+ LLAccessEntry::map entries = parcel->getExperienceKeysByType(xp_type);
+ LLAccessEntry::map::iterator it = entries.begin();
+ LLSD ids = LLSD::emptyArray();
+ for (/**/; it != entries.end(); ++it)
+ {
+ ids.append(it->second.mID);
+ }
+ panel->setExperienceIds(ids);
+ panel->setReadonly(!LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_OPTIONS));
+ panel->refreshExperienceCounter();
+ }
+}
+
+void LLPanelLandExperiences::refresh()
+{
+ refreshPanel(mAllowed, EXPERIENCE_KEY_TYPE_ALLOWED);
+ refreshPanel(mBlocked, EXPERIENCE_KEY_TYPE_BLOCKED);
+}
+
+//=========================================================================
+
+LLPanelLandEnvironment::LLPanelLandEnvironment(LLParcelSelectionHandle& parcel) :
+ LLPanelEnvironmentInfo(),
+ mParcel(parcel),
+ mLastParcelId(INVALID_PARCEL_ID)
+{
+}
+
+bool LLPanelLandEnvironment::postBuild()
+{
+ if (!LLPanelEnvironmentInfo::postBuild())
+ return false;
+
+ getChild<LLUICtrl>(BTN_USEDEFAULT)->setLabelArg("[USEDEFAULT]", getString(STR_LABEL_USEREGION));
+ getChild<LLUICtrl>(CHK_ALLOWOVERRIDE)->setVisible(false);
+ getChild<LLUICtrl>(PNL_REGION_MSG)->setVisible(false);
+ getChild<LLUICtrl>(PNL_ENVIRONMENT_ALTITUDES)->setVisible(true);
+
+ return true;
+}
+
+void LLPanelLandEnvironment::refresh()
+{
+ if (gDisconnected)
+ return;
+
+ commitDayLenOffsetChanges(false); // commit unsaved changes if any
+
+ if (!isSameRegion())
+ {
+ setCrossRegion(true);
+ mCurrentEnvironment.reset();
+ mLastParcelId = INVALID_PARCEL_ID;
+ mCurEnvVersion = INVALID_PARCEL_ENVIRONMENT_VERSION;
+ setControlsEnabled(false);
+ return;
+ }
+
+ if (mLastParcelId != getParcelId())
+ {
+ mCurEnvVersion = INVALID_PARCEL_ENVIRONMENT_VERSION;
+ mCurrentEnvironment.reset();
+ }
+
+ if (!mCurrentEnvironment && mCurEnvVersion <= INVALID_PARCEL_ENVIRONMENT_VERSION)
+ {
+ refreshFromSource();
+ return;
+ }
+
+ LLPanelEnvironmentInfo::refresh();
+}
+
+void LLPanelLandEnvironment::refreshFromSource()
+{
+ LLParcel *parcel = getParcel();
+
+ if (!LLEnvironment::instance().isExtendedEnvironmentEnabled())
+ {
+ setNoEnvironmentSupport(true);
+ setControlsEnabled(false);
+ mCurEnvVersion = INVALID_PARCEL_ENVIRONMENT_VERSION;
+ return;
+ }
+ setNoEnvironmentSupport(false);
+
+ if (!parcel)
+ {
+ setNoSelection(true);
+ setControlsEnabled(false);
+ mCurEnvVersion = INVALID_PARCEL_ENVIRONMENT_VERSION;
+ return;
+ }
+
+ setNoSelection(false);
+ if (isSameRegion())
+ {
+ LL_DEBUGS("ENVIRONMENT") << "Requesting environment for parcel " << parcel->getLocalID() << ", known version " << mCurEnvVersion << LL_ENDL;
+ setCrossRegion(false);
+
+ LLHandle<LLPanel> that_h = getHandle();
+
+ if (mCurEnvVersion < UNSET_PARCEL_ENVIRONMENT_VERSION)
+ {
+ // to mark as requesting
+ mCurEnvVersion = parcel->getParcelEnvironmentVersion();
+ }
+ mLastParcelId = parcel->getLocalID();
+
+ LLEnvironment::instance().requestParcel(parcel->getLocalID(),
+ [that_h](S32 parcel_id, LLEnvironment::EnvironmentInfo::ptr_t envifo)
+ {
+ LLPanelLandEnvironment *that = (LLPanelLandEnvironment*)that_h.get();
+ if (!that) return;
+ that->mLastParcelId = parcel_id;
+ that->onEnvironmentReceived(parcel_id, envifo);
+ });
+ }
+ else
+ {
+ setCrossRegion(true);
+ mCurrentEnvironment.reset();
+ mLastParcelId = INVALID_PARCEL_ID;
+ mCurEnvVersion = INVALID_PARCEL_ENVIRONMENT_VERSION;
+ }
+ setControlsEnabled(false);
+}
+
+
+bool LLPanelLandEnvironment::isSameRegion()
+{
+ LLViewerRegion* regionp = LLViewerParcelMgr::instance().getSelectionRegion();
+
+ return (!regionp || (regionp->getRegionID() == gAgent.getRegion()->getRegionID()));
+}
+
+LLParcel *LLPanelLandEnvironment::getParcel()
+{
+ return mParcel->getParcel();
+}
+
+
+bool LLPanelLandEnvironment::canEdit()
+{
+ LLParcel *parcel = getParcel();
+ if (!parcel)
+ return false;
+
+ return LLEnvironment::instance().canAgentUpdateParcelEnvironment(parcel) && mAllowOverride;
+}
+
+S32 LLPanelLandEnvironment::getParcelId()
+{
+ LLParcel *parcel = getParcel();
+ if (!parcel)
+ return INVALID_PARCEL_ID;
+
+ return parcel->getLocalID();
+}
|
