diff options
Diffstat (limited to 'indra/newview/llpanelland.cpp')
-rw-r--r-- | indra/newview/llpanelland.cpp | 236 |
1 files changed, 236 insertions, 0 deletions
diff --git a/indra/newview/llpanelland.cpp b/indra/newview/llpanelland.cpp new file mode 100644 index 0000000000..1a8885d05b --- /dev/null +++ b/indra/newview/llpanelland.cpp @@ -0,0 +1,236 @@ +/** + * @file llpanelland.cpp + * @brief Land information in the tool floater, NOT the "About Land" floater + * + * Copyright (c) 2002-$CurrentYear$, Linden Research, Inc. + * $License$ + */ + +#include "llviewerprecompiledheaders.h" + +#include <time.h> + +#include "llpanelland.h" + +#include "llparcel.h" + +#include "llagent.h" +#include "llbutton.h" +#include "llfloaterland.h" +#include "lltextbox.h" +#include "llviewerparcelmgr.h" +#include "llviewerregion.h" +#include "roles_constants.h" + +#include "llvieweruictrlfactory.h" + +LLPanelLandSelectObserver* LLPanelLandInfo::sObserver = NULL; +LLPanelLandInfo* LLPanelLandInfo::sInstance = NULL; + +class LLPanelLandSelectObserver : public LLParcelObserver +{ +public: + LLPanelLandSelectObserver() {} + virtual ~LLPanelLandSelectObserver() {} + virtual void changed() { LLPanelLandInfo::refreshAll(); } +}; + + +BOOL LLPanelLandInfo::postBuild() +{ + + childSetAction("button buy land",onClickClaim,this); + childSetAction("button abandon land",onClickRelease,this); + childSetAction("button subdivide land",onClickDivide,this); + childSetAction("button join land",onClickJoin,this); + childSetAction("button about land",onClickAbout,this); + + return TRUE; +} +// +// Methods +// +LLPanelLandInfo::LLPanelLandInfo(const std::string& name) +: LLPanel(name) +{ + if (!sInstance) + { + sInstance = this; + } + if (!sObserver) + { + sObserver = new LLPanelLandSelectObserver(); + gParcelMgr->addObserver( sObserver ); + } + +} + + +// virtual +LLPanelLandInfo::~LLPanelLandInfo() +{ + gParcelMgr->removeObserver( sObserver ); + delete sObserver; + sObserver = NULL; + + sInstance = NULL; +} + + +// static +void LLPanelLandInfo::refreshAll() +{ + if (sInstance) + { + sInstance->refresh(); + } +} + + +// public +void LLPanelLandInfo::refresh() +{ + LLParcel *parcel = gParcelMgr->getSelectedParcel(); + LLViewerRegion *regionp = gParcelMgr->getSelectionRegion(); + + if (!parcel || !regionp) + { + // nothing selected, disable panel + childSetVisible("label_area_price",false); + childSetVisible("label_area",false); + + //mTextPrice->setText(""); + childSetText("textbox price",""); + + childSetEnabled("button buy land",FALSE); + childSetEnabled("button abandon land",FALSE); + childSetEnabled("button subdivide land",FALSE); + childSetEnabled("button join land",FALSE); + childSetEnabled("button about land",FALSE); + } + else + { + // something selected, hooray! + const LLUUID& owner_id = parcel->getOwnerID(); + const LLUUID& auth_buyer_id = parcel->getAuthorizedBuyerID(); + + BOOL is_public = parcel->isPublic(); + BOOL is_for_sale = parcel->getForSale() + && ((parcel->getSalePrice() > 0) || (auth_buyer_id.notNull())); + BOOL can_buy = (is_for_sale + && (owner_id != gAgent.getID()) + && ((gAgent.getID() == auth_buyer_id) + || (auth_buyer_id.isNull()))); + + if (is_public) + { + childSetEnabled("button buy land",TRUE); + } + else + { + childSetEnabled("button buy land",can_buy); + } + + BOOL owner_release = LLViewerParcelMgr::isParcelOwnedByAgent(parcel, GP_LAND_RELEASE); + BOOL owner_divide = LLViewerParcelMgr::isParcelOwnedByAgent(parcel, GP_LAND_DIVIDE_JOIN); + + BOOL manager_releaseable = ( gAgent.canManageEstate() + && (parcel->getOwnerID() == regionp->getOwner()) ); + + BOOL manager_divideable = ( gAgent.canManageEstate() + && ((parcel->getOwnerID() == regionp->getOwner()) || owner_divide) ); + + childSetEnabled("button abandon land",owner_release || manager_releaseable || gAgent.isGodlike()); + + // only mainland sims are subdividable by owner + if (regionp->getRegionFlags() && REGION_FLAGS_ALLOW_PARCEL_CHANGES) + { + childSetEnabled("button subdivide land",owner_divide || manager_divideable || gAgent.isGodlike()); + } + else + { + childSetEnabled("button subdivide land",manager_divideable || gAgent.isGodlike()); + } + + // To join land, must have something selected, + // not just a single unit of land, + // you must own part of it, + // and it must not be a whole parcel. + if (gParcelMgr->getSelectedArea() > PARCEL_UNIT_AREA + //&& gParcelMgr->getSelfCount() > 1 + && !gParcelMgr->getWholeParcelSelected()) + { + childSetEnabled("button join land",TRUE); + } + else + { + lldebugs << "Invalid selection for joining land" << llendl; + childSetEnabled("button join land",FALSE); + } + + childSetEnabled("button about land",TRUE); + + // show pricing information + S32 area; + S32 claim_price; + S32 rent_price; + BOOL for_sale; + F32 dwell; + gParcelMgr->getDisplayInfo(&area, + &claim_price, + &rent_price, + &for_sale, + &dwell); + if(is_public || (is_for_sale && gParcelMgr->getWholeParcelSelected())) + { + childSetTextArg("label_area_price","[PRICE]", llformat("%d",claim_price)); + childSetTextArg("label_area_price","[AREA]", llformat("%d",area)); + childSetVisible("label_area_price",true); + childSetVisible("label_area",false); + } + else + { + childSetVisible("label_area_price",false); + childSetTextArg("label_area","[AREA]", llformat("%d",area)); + childSetVisible("label_area",true); + } + } +} + + +//static +void LLPanelLandInfo::onClickClaim(void*) +{ + gParcelMgr->startBuyLand(); +} + + +//static +void LLPanelLandInfo::onClickRelease(void*) +{ + gParcelMgr->startReleaseLand(); +} + +// static +void LLPanelLandInfo::onClickDivide(void*) +{ + gParcelMgr->startDivideLand(); +} + +// static +void LLPanelLandInfo::onClickJoin(void*) +{ + gParcelMgr->startJoinLand(); +} + +//static +void LLPanelLandInfo::onClickAbout(void*) +{ + // Promote the rectangle selection to a parcel selection + if (!gParcelMgr->getWholeParcelSelected()) + { + gParcelMgr->selectParcelInRectangle(); + } + + LLFloaterLand::show(); +} |