summaryrefslogtreecommitdiff
path: root/indra/newview/llpanelland.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llpanelland.cpp')
-rw-r--r--indra/newview/llpanelland.cpp236
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();
+}