/** * @file llfloaterbuycurrency.cpp * @brief LLFloaterBuyCurrency class implementation * * $LicenseInfo:firstyear=2005&license=viewergpl$ * * Copyright (c) 2005-2009, Linden Research, Inc. * * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement * ("Other License"), formally executed by you and Linden Lab. Terms of * the GPL can be found in doc/GPL-license.txt in this distribution, or * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 * * There are special exceptions to the terms and conditions of the GPL as * it is applied to this Source Code. View the full text of the exception * in the file doc/FLOSS-exception.txt in this software distribution, or * online at * http://secondlifegrid.net/programs/open_source/licensing/flossexception * * By copying, modifying or distributing this software, you acknowledge * that you have read and understood your obligations described above, * and agree to abide by those obligations. * * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, * COMPLETENESS OR PERFORMANCE. * $/LicenseInfo$ */ #include "llviewerprecompiledheaders.h" #include "llfloaterbuycurrency.h" // viewer includes #include "llcurrencyuimanager.h" #include "llfloater.h" #include "llfloaterreg.h" #include "llnotificationsutil.h" #include "llstatusbar.h" #include "lltextbox.h" #include "llviewchildren.h" #include "llviewerwindow.h" #include "lluictrlfactory.h" #include "llweb.h" #include "llwindow.h" #include "llappviewer.h" static const S32 STANDARD_BUY_AMOUNT = 2000; static const S32 MINIMUM_BALANCE_AMOUNT = 0; class LLFloaterBuyCurrencyUI : public LLFloater { public: LLFloaterBuyCurrencyUI(const LLSD& key); virtual ~LLFloaterBuyCurrencyUI(); public: LLViewChildren mChildren; LLCurrencyUIManager mManager; bool mHasTarget; std::string mTargetName; S32 mTargetPrice; public: void noTarget(); void target(const std::string& name, S32 price); virtual BOOL postBuild(); void updateUI(); virtual void draw(); virtual BOOL canClose(); void onClickBuy(); void onClickCancel(); void onClickErrorWeb(); }; LLFloater* LLFloaterBuyCurrency::buildFloater(const LLSD& key) { LLFloaterBuyCurrencyUI* floater = new LLFloaterBuyCurrencyUI(key); return floater; } #if LL_WINDOWS // passing 'this' during construction generates a warning. The callee // only uses the pointer to hold a reference to 'this' which is // already valid, so this call does the correct thing. Disable the // warning so that we can compile without generating a warning. #pragma warning(disable : 4355) #endif LLFloaterBuyCurrencyUI::LLFloaterBuyCurrencyUI(const LLSD& key) : LLFloater(key), mChildren(*this), mManager(*this) { } LLFloaterBuyCurrencyUI::~LLFloaterBuyCurrencyUI() { } void LLFloaterBuyCurrencyUI::noTarget() { mHasTarget = false; mManager.setAmount(STANDARD_BUY_AMOUNT); } void LLFloaterBuyCurrencyUI::target(const std::string& name, S32 price) { mHasTarget = true; mTargetName = name; mTargetPrice = price; S32 balance = gStatusBar->getBalance(); S32 need = price - balance; if (need < 0) { need = 0; } mManager.setAmount(need + MINIMUM_BALANCE_AMOUNT); } // virtual BOOL LLFloaterBuyCurrencyUI::postBuild() { mManager.prepare(); getChild("buy_btn")->setCommitCallback( boost::bind(&LLFloaterBuyCurrencyUI::onClickBuy, this)); getChild("cancel_btn")->setCommitCallback( boost::bind(&LLFloaterBuyCurrencyUI::onClickCancel, this)); getChild("error_web")->setCommitCallback( boost::bind(&LLFloaterBuyCurrencyUI::onClickErrorWeb, this)); center(); updateUI(); return TRUE; } void LLFloaterBuyCurrencyUI::draw() { if (mManager.process()) { if (mManager.bought()) { LLNotificationsUtil::add("BuyLindenDollarSuccess"); closeFloater(); return; } updateUI(); } // disable the Buy button when we are not able to buy getChildView("buy_btn")->setEnabled(mManager.canBuy()); LLFloater::draw(); } BOOL LLFloaterBuyCurrencyUI::canClose() { return mManager.canCancel(); } void LLFloaterBuyCurrencyUI::updateUI() { bool hasError = mManager.hasError(); mManager.updateUI(!hasError && !mManager.buying()); // hide most widgets - we'll turn them on as needed next getChildView("info_buying")->setVisible(FALSE); getChildView("info_cannot_buy")->setVisible(FALSE); getChildView("info_need_more")->setVisible(FALSE); getChildView("purchase_warning_repurchase")->setVisible(FALSE); getChildView("purchase_warning_notenough")->setVisible(FALSE); getChildView("contacting")->setVisible(FALSE); getChildView("buy_action")->setVisible(FALSE); if (hasError) { // display an error from the server getChildView("normal_background")->setVisible(FALSE); getChildView("error_background")->setVisible(TRUE); getChildView("info_cannot_buy")->setVisible(TRUE); getChildView("cannot_buy_message")->setVisible(TRUE); getChildView("balance_label")->setVisible(FALSE); getChildView("balance_amount")->setVisible(FALSE); getChildView("buying_label")->setVisible(FALSE); getChildView("buying_amount")->setVisible(FALSE); getChildView("total_label")->setVisible(FALSE); getChildView("total_amount")->setVisible(FALSE); LLTextBox* message = getChild("cannot_buy_message"); if (message) { message->setText(mManager.errorMessage()); } getChildView("error_web")->setVisible( !mManager.errorURI().empty()); } else { // display the main Buy L$ interface getChildView("normal_background")->setVisible(TRUE); getChildView("error_background")->setVisible(FALSE); getChildView("cannot_buy_message")->setVisible(FALSE); getChildView("error_web")->setVisible(FALSE); if (mHasTarget) { getChildView("info_need_more")->setVisible(TRUE); } else { getChildView("info_buying")->setVisible(TRUE); } if (mManager.buying()) { getChildView("contacting")->setVisible( true); } else { if (mHasTarget) { getChildView("buy_action")->setVisible( true); getChild("buy_action")->setTextArg("[ACTION]", mTargetName); } } S32 balance = gStatusBar->getBalance(); getChildView("balance_label")->setVisible(TRUE); getChildView("balance_amount")->setVisible(TRUE); getChild("balance_amount")->setTextArg("[AMT]", llformat("%d", balance)); S32 buying = mManager.getAmount(); getChildView("buying_label")->setVisible(TRUE); getChildView("buying_amount")->setVisible(TRUE); getChild("buying_amount")->setTextArg("[AMT]", llformat("%d", buying)); S32 total = balance + buying; getChildView("total_label")->setVisible(TRUE); getChildView("total_amount")->setVisible(TRUE); getChild("total_amount")->setTextArg("[AMT]", llformat("%d", total)); if (mHasTarget) { if (total >= mTargetPrice) { getChildView("purchase_warning_repurchase")->setVisible( true); } else { getChildView("purchase_warning_notenough")->setVisible( true); } } } getChildView("getting_data")->setVisible( !mManager.canBuy() && !hasError); } void LLFloaterBuyCurrencyUI::onClickBuy() { mManager.buy(getString("buy_currency")); updateUI(); } void LLFloaterBuyCurrencyUI::onClickCancel() { closeFloater(); } void LLFloaterBuyCurrencyUI::onClickErrorWeb() { LLWeb::loadURLExternal(mManager.errorURI()); closeFloater(); } // static void LLFloaterBuyCurrency::buyCurrency() { LLFloaterBuyCurrencyUI* ui = LLFloaterReg::showTypedInstance("buy_currency"); ui->noTarget(); ui->updateUI(); } // static void LLFloaterBuyCurrency::buyCurrency(const std::string& name, S32 price) { LLFloaterBuyCurrencyUI* ui = LLFloaterReg::showTypedInstance("buy_currency"); ui->target(name, price); ui->updateUI(); }