summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
authorMerov Linden <merov@lindenlab.com>2014-03-25 13:41:40 -0700
committerMerov Linden <merov@lindenlab.com>2014-03-25 13:41:40 -0700
commita65ea2f5a00762f7c2748acf315c7396c3da088f (patch)
tree83ab309b66ab9b4d5a667a0b02fe1511b4bc6cff /indra
parent54bba824228162724a1d46d9c7900e9aa7a077a3 (diff)
DD-40 : WIP : Refactor marketplace listings UI classes in their own cpp / h files
Diffstat (limited to 'indra')
-rwxr-xr-xindra/newview/CMakeLists.txt2
-rwxr-xr-xindra/newview/llfloatermarketplacelistings.cpp567
-rwxr-xr-xindra/newview/llfloatermarketplacelistings.h110
-rwxr-xr-xindra/newview/llfloateroutbox.cpp522
-rwxr-xr-xindra/newview/llfloateroutbox.h69
-rwxr-xr-xindra/newview/llviewerfloaterreg.cpp1
6 files changed, 682 insertions, 589 deletions
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 17e340d136..0365b1a847 100755
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -245,6 +245,7 @@ set(viewer_SOURCE_FILES
llfloaterlagmeter.cpp
llfloaterland.cpp
llfloaterlandholdings.cpp
+ llfloatermarketplacelistings.cpp
llfloatermap.cpp
llfloatermediasettings.cpp
llfloatermemleak.cpp
@@ -835,6 +836,7 @@ set(viewer_HEADER_FILES
llfloaterland.h
llfloaterlandholdings.h
llfloatermap.h
+ llfloatermarketplacelistings.h
llfloatermediasettings.h
llfloatermemleak.h
llfloatermodelpreview.h
diff --git a/indra/newview/llfloatermarketplacelistings.cpp b/indra/newview/llfloatermarketplacelistings.cpp
new file mode 100755
index 0000000000..64f95c4a1a
--- /dev/null
+++ b/indra/newview/llfloatermarketplacelistings.cpp
@@ -0,0 +1,567 @@
+/**
+ * @file llfloatermarketplacelistings.cpp
+ * @brief Implementation of the marketplace listings floater and panels
+ *
+ * *TODO : Eventually, take out all the merchant outbox stuff and rename that file to llfloatermarketplacelistings
+ *
+ * $LicenseInfo:firstyear=2001&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 "llfloatermarketplacelistings.h"
+
+#include "llfloaterreg.h"
+#include "llfolderview.h"
+#include "llinventorybridge.h"
+#include "llinventorymodelbackgroundfetch.h"
+#include "llinventoryobserver.h"
+#include "llinventorypanel.h"
+#include "llmarketplacefunctions.h"
+#include "llnotificationhandler.h"
+#include "llnotificationmanager.h"
+#include "llnotificationsutil.h"
+#include "lltextbox.h"
+#include "lltransientfloatermgr.h"
+#include "lltrans.h"
+#include "llviewernetwork.h"
+#include "llwindowshade.h"
+
+///----------------------------------------------------------------------------
+/// LLMarketplaceListingsAddedObserver helper class
+///----------------------------------------------------------------------------
+
+class LLMarketplaceListingsAddedObserver : public LLInventoryCategoryAddedObserver
+{
+public:
+ LLMarketplaceListingsAddedObserver(LLFloaterMarketplaceListings * marketplace_listings_floater)
+ : LLInventoryCategoryAddedObserver()
+ , mMarketplaceListingsFloater(marketplace_listings_floater)
+ {
+ }
+
+ void done()
+ {
+ for (cat_vec_t::iterator it = mAddedCategories.begin(); it != mAddedCategories.end(); ++it)
+ {
+ LLViewerInventoryCategory* added_category = *it;
+
+ LLFolderType::EType added_category_type = added_category->getPreferredType();
+
+ if (added_category_type == LLFolderType::FT_MARKETPLACE_LISTINGS)
+ {
+ mMarketplaceListingsFloater->initializeMarketPlace();
+ }
+ }
+ }
+
+private:
+ LLFloaterMarketplaceListings * mMarketplaceListingsFloater;
+};
+
+///----------------------------------------------------------------------------
+/// LLFloaterMarketplaceListings
+///----------------------------------------------------------------------------
+
+LLFloaterMarketplaceListings::LLFloaterMarketplaceListings(const LLSD& key)
+: LLFloater(key)
+, mCategoriesObserver(NULL)
+, mCategoryAddedObserver(NULL)
+, mRootFolderId(LLUUID::null)
+, mInventoryStatus(NULL)
+, mInventoryInitializationInProgress(NULL)
+, mInventoryPlaceholder(NULL)
+, mInventoryText(NULL)
+, mInventoryTitle(NULL)
+, mSortOrder(LLInventoryFilter::SO_FOLDERS_BY_NAME)
+, mFilterType(LLInventoryFilter::FILTERTYPE_NONE)
+{
+ mCommitCallbackRegistrar.add("Marketplace.ViewSort.Action", boost::bind(&LLFloaterMarketplaceListings::onViewSortMenuItemClicked, this, _2));
+ mEnableCallbackRegistrar.add("Marketplace.ViewSort.CheckItem", boost::bind(&LLFloaterMarketplaceListings::onViewSortMenuItemCheck, this, _2));
+}
+
+LLFloaterMarketplaceListings::~LLFloaterMarketplaceListings()
+{
+ if (mCategoriesObserver && gInventory.containsObserver(mCategoriesObserver))
+ {
+ gInventory.removeObserver(mCategoriesObserver);
+ }
+ delete mCategoriesObserver;
+
+ if (mCategoryAddedObserver && gInventory.containsObserver(mCategoryAddedObserver))
+ {
+ gInventory.removeObserver(mCategoryAddedObserver);
+ }
+ delete mCategoryAddedObserver;
+}
+
+BOOL LLFloaterMarketplaceListings::postBuild()
+{
+ mInventoryStatus = getChild<LLTextBox>("marketplace_status");
+ mInventoryInitializationInProgress = getChild<LLView>("initialization_progress_indicator");
+ mInventoryPlaceholder = getChild<LLView>("marketplace_listings_inventory_placeholder_panel");
+ mInventoryText = mInventoryPlaceholder->getChild<LLTextBox>("marketplace_listings_inventory_placeholder_text");
+ mInventoryTitle = mInventoryPlaceholder->getChild<LLTextBox>("marketplace_listings_inventory_placeholder_title");
+
+ LLFocusableElement::setFocusReceivedCallback(boost::bind(&LLFloaterMarketplaceListings::onFocusReceived, this));
+
+ // Observe category creation to catch marketplace listings creation (moot if already existing)
+ mCategoryAddedObserver = new LLMarketplaceListingsAddedObserver(this);
+ gInventory.addObserver(mCategoryAddedObserver);
+
+ // Merov : Debug : fetch aggressively so we can create test data right onOpen()
+ llinfos << "Merov : postBuild, do fetchContent() ahead of time" << llendl;
+ fetchContents();
+
+ return TRUE;
+}
+
+void LLFloaterMarketplaceListings::clean()
+{
+ // Note: we cannot delete the mOutboxInventoryPanel as that point
+ // as this is called through callback observers of the panel itself.
+ // Doing so would crash rapidly.
+
+ // Invalidate the outbox data
+ mRootFolderId.setNull();
+}
+
+void LLFloaterMarketplaceListings::onClose(bool app_quitting)
+{
+}
+
+void LLFloaterMarketplaceListings::onOpen(const LLSD& key)
+{
+ //
+ // Initialize the Market Place or go update the outbox
+ //
+ if (LLMarketplaceInventoryImporter::getInstance()->getMarketPlaceStatus() == MarketplaceStatusCodes::MARKET_PLACE_NOT_INITIALIZED)
+ {
+ initializeMarketPlace();
+ }
+ else
+ {
+ setup();
+ }
+
+ // Merov : Debug : Create fake Marketplace data if none is present
+ if (LLMarketplaceData::instance().isEmpty() && (getFolderCount() > 0))
+ {
+ LLInventoryModel::cat_array_t* cats;
+ LLInventoryModel::item_array_t* items;
+ gInventory.getDirectDescendentsOf(mRootFolderId, cats, items);
+
+ int index = 0;
+ for (LLInventoryModel::cat_array_t::iterator iter = cats->begin(); iter != cats->end(); iter++, index++)
+ {
+ LLViewerInventoryCategory* category = *iter;
+ if (index%3)
+ {
+ LLMarketplaceData::instance().addTestItem(category->getUUID());
+ if (index%3 == 1)
+ {
+ LLMarketplaceData::instance().setListingID(category->getUUID(),"TestingID1234");
+ }
+ LLMarketplaceData::instance().setActivation(category->getUUID(),(index%2));
+ }
+ }
+ }
+
+ //
+ // Update the floater view
+ //
+ updateView();
+
+ //
+ // Trigger fetch of the contents
+ //
+ fetchContents();
+}
+
+void LLFloaterMarketplaceListings::onFocusReceived()
+{
+ fetchContents();
+}
+
+
+void LLFloaterMarketplaceListings::onViewSortMenuItemClicked(const LLSD& userdata)
+{
+ std::string chosen_item = userdata.asString();
+
+ LLInventoryPanel* panel = mInventoryPanel.get();
+
+ llinfos << "Merov : MenuItemClicked, item = " << chosen_item << ", panel on = " << panel->hasFocus() << llendl;
+
+ // Sort options
+ if (chosen_item == "sort_by_stock_amount")
+ {
+ mSortOrder = (mSortOrder == LLInventoryFilter::SO_FOLDERS_BY_NAME ? LLInventoryFilter::SO_FOLDERS_BY_WEIGHT : LLInventoryFilter::SO_FOLDERS_BY_NAME);
+ panel->getFolderViewModel()->setSorter(mSortOrder);
+ }
+ // View/filter options
+ else if (chosen_item == "show_all")
+ {
+ mFilterType = LLInventoryFilter::FILTERTYPE_NONE;
+ panel->getFilter().resetDefault();
+ }
+ else if (chosen_item == "show_non_associated_listings")
+ {
+ mFilterType = LLInventoryFilter::FILTERTYPE_MARKETPLACE_UNASSOCIATED;
+ panel->getFilter().setFilterMarketplaceUnassociatedFolders();
+ }
+ else if (chosen_item == "show_active")
+ {
+ mFilterType = LLInventoryFilter::FILTERTYPE_MARKETPLACE_ACTIVE;
+ panel->getFilter().setFilterMarketplaceActiveFolders();
+ }
+ else if (chosen_item == "show_inactive_listings")
+ {
+ mFilterType = LLInventoryFilter::FILTERTYPE_MARKETPLACE_INACTIVE;
+ panel->getFilter().setFilterMarketplaceInactiveFolders();
+ }
+}
+
+bool LLFloaterMarketplaceListings::onViewSortMenuItemCheck(const LLSD& userdata)
+{
+ std::string chosen_item = userdata.asString();
+
+ LLInventoryPanel* panel = mInventoryPanel.get();
+
+ llinfos << "Merov : MenuItemCheck, item = " << chosen_item << ", panel on = " << panel->hasFocus() << llendl;
+
+ if (!panel->hasFocus())
+ {
+ return false;
+ }
+
+ if (chosen_item == "sort_by_stock_amount")
+ return mSortOrder == LLInventoryFilter::SO_FOLDERS_BY_WEIGHT;
+ if (chosen_item == "show_all")
+ return mFilterType == LLInventoryFilter::FILTERTYPE_NONE;
+ if (chosen_item == "show_non_associated_listings")
+ return mFilterType == LLInventoryFilter::FILTERTYPE_MARKETPLACE_UNASSOCIATED;
+ if (chosen_item == "show_active")
+ return mFilterType == LLInventoryFilter::FILTERTYPE_MARKETPLACE_ACTIVE;
+ if (chosen_item == "show_inactive_listings")
+ return mFilterType == LLInventoryFilter::FILTERTYPE_MARKETPLACE_INACTIVE;
+ return false;
+}
+
+
+void LLFloaterMarketplaceListings::fetchContents()
+{
+ if (mRootFolderId.notNull())
+ {
+ LLInventoryModelBackgroundFetch::instance().start(mRootFolderId);
+ }
+}
+
+void LLFloaterMarketplaceListings::setup()
+{
+ if (LLMarketplaceInventoryImporter::getInstance()->getMarketPlaceStatus() != MarketplaceStatusCodes::MARKET_PLACE_MERCHANT)
+ {
+ // If we are *not* a merchant or we have no market place connection established yet, do nothing
+ return;
+ }
+
+ // We are a merchant. Get the Marketplace listings folder, create it if needs be.
+ LLUUID outbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, true);
+ if (outbox_id.isNull())
+ {
+ // We should never get there unless the inventory fails badly
+ llinfos << "Merov : Inventory problem: failure to create the marketplace listings folder for a merchant!" << llendl;
+ llerrs << "Inventory problem: failure to create the marketplace listings folder for a merchant!" << llendl;
+ return;
+ }
+
+ // Consolidate Marketplace listings
+ // We shouldn't have to do that but with a client/server system relying on a "well known folder" convention, things get messy and conventions get broken down eventually
+ gInventory.consolidateForType(outbox_id, LLFolderType::FT_MARKETPLACE_LISTINGS);
+
+ if (outbox_id == mRootFolderId)
+ {
+ llinfos << "Merov : Inventory warning: Marketplace listings folder already set" << llendl;
+ llwarns << "Inventory warning: Marketplace listings folder already set" << llendl;
+ return;
+ }
+ mRootFolderId = outbox_id;
+
+ // No longer need to observe new category creation
+ if (mCategoryAddedObserver && gInventory.containsObserver(mCategoryAddedObserver))
+ {
+ gInventory.removeObserver(mCategoryAddedObserver);
+ delete mCategoryAddedObserver;
+ mCategoryAddedObserver = NULL;
+ }
+ llassert(!mCategoryAddedObserver);
+
+ // Create observer for marketplace listings modifications : clear the old one and create a new one
+ if (mCategoriesObserver && gInventory.containsObserver(mCategoriesObserver))
+ {
+ gInventory.removeObserver(mCategoriesObserver);
+ delete mCategoriesObserver;
+ }
+ mCategoriesObserver = new LLInventoryCategoriesObserver();
+ gInventory.addObserver(mCategoriesObserver);
+ mCategoriesObserver->addCategory(mRootFolderId, boost::bind(&LLFloaterMarketplaceListings::onChanged, this));
+ llassert(mCategoriesObserver);
+
+ // Set up the marketplace listings inventory view
+ LLPanel* inventory_panel = LLUICtrlFactory::createFromFile<LLPanel>("panel_marketplace_listings.xml", mInventoryPlaceholder->getParent(), LLInventoryPanel::child_registry_t::instance());
+ LLInventoryPanel* items_panel = inventory_panel->getChild<LLInventoryPanel>("All Items");
+ mInventoryPanel = items_panel->getInventoryPanelHandle();
+ llassert(mInventoryPanel.get() != NULL);
+
+ // Reshape the inventory to the proper size
+ LLRect inventory_placeholder_rect = mInventoryPlaceholder->getRect();
+ inventory_panel->setShape(inventory_placeholder_rect);
+
+ // Set the sort order newest to oldest
+ items_panel->getFolderViewModel()->setSorter(LLInventoryFilter::SO_FOLDERS_BY_NAME);
+ items_panel->getFilter().markDefault();
+
+ // Set filters on the 3 prefiltered panels
+ items_panel = inventory_panel->getChild<LLInventoryPanel>("Active Items");
+ items_panel->getFolderViewModel()->setSorter(LLInventoryFilter::SO_FOLDERS_BY_NAME);
+ items_panel->getFilter().setFilterMarketplaceActiveFolders();
+ items_panel->getFilter().markDefault();
+ items_panel = inventory_panel->getChild<LLInventoryPanel>("Inactive Items");
+ items_panel->getFolderViewModel()->setSorter(LLInventoryFilter::SO_FOLDERS_BY_NAME);
+ items_panel->getFilter().setFilterMarketplaceInactiveFolders();
+ items_panel->getFilter().markDefault();
+ items_panel = inventory_panel->getChild<LLInventoryPanel>("Unassociated Items");
+ items_panel->getFolderViewModel()->setSorter(LLInventoryFilter::SO_FOLDERS_BY_NAME);
+ items_panel->getFilter().setFilterMarketplaceUnassociatedFolders();
+ items_panel->getFilter().markDefault();
+
+ // Get the content of the marketplace listings folder
+ fetchContents();
+}
+
+void LLFloaterMarketplaceListings::initializeMarketPlace()
+{
+ //
+ // Initialize the marketplace import API
+ //
+ LLMarketplaceInventoryImporter& importer = LLMarketplaceInventoryImporter::instance();
+
+ if (!importer.isInitialized())
+ {
+ importer.setInitializationErrorCallback(boost::bind(&LLFloaterMarketplaceListings::initializationReportError, this, _1, _2));
+ importer.setStatusChangedCallback(boost::bind(&LLFloaterMarketplaceListings::importStatusChanged, this, _1));
+ importer.setStatusReportCallback(boost::bind(&LLFloaterMarketplaceListings::importReportResults, this, _1, _2));
+ importer.initialize();
+ }
+}
+
+S32 LLFloaterMarketplaceListings::getFolderCount()
+{
+ if (mInventoryPanel.get() && mRootFolderId.notNull())
+ {
+ LLInventoryModel::cat_array_t * cats;
+ LLInventoryModel::item_array_t * items;
+ gInventory.getDirectDescendentsOf(mRootFolderId, cats, items);
+
+ return (cats->count() + items->count());
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+void LLFloaterMarketplaceListings::setStatusString(const std::string& statusString)
+{
+ mInventoryStatus->setText(statusString);
+}
+
+void LLFloaterMarketplaceListings::updateView()
+{
+ LLInventoryPanel* panel = mInventoryPanel.get();
+
+ if (getFolderCount() > 0)
+ {
+ panel->setVisible(TRUE);
+ mInventoryPlaceholder->setVisible(FALSE);
+ }
+ else
+ {
+ if (panel)
+ {
+ panel->setVisible(FALSE);
+ }
+
+ std::string text;
+ std::string title;
+ std::string tooltip;
+
+ const LLSD& subs = getMarketplaceStringSubstitutions();
+ U32 mkt_status = LLMarketplaceInventoryImporter::getInstance()->getMarketPlaceStatus();
+
+ // *TODO : check those messages and create better appropriate ones in strings.xml
+ if (mRootFolderId.notNull())
+ {
+ // Does the outbox needs recreation?
+ if ((panel == NULL) || !gInventory.getCategory(mRootFolderId))
+ {
+ setup();
+ }
+ // "Marketplace listings is empty!" message strings
+ text = LLTrans::getString("InventoryMarketplaceListingsNoItems", subs);
+ title = LLTrans::getString("InventoryMarketplaceListingsNoItemsTitle");
+ tooltip = LLTrans::getString("InventoryMarketplaceListingsNoItemsTooltip");
+ }
+ else if (mkt_status <= MarketplaceStatusCodes::MARKET_PLACE_INITIALIZING)
+ {
+ // "Initializing!" message strings
+ text = LLTrans::getString("InventoryOutboxInitializing", subs);
+ title = LLTrans::getString("InventoryOutboxInitializingTitle");
+ tooltip = LLTrans::getString("InventoryOutboxInitializingTooltip");
+ }
+ else if (mkt_status == MarketplaceStatusCodes::MARKET_PLACE_NOT_MERCHANT)
+ {
+ // "Not a merchant!" message strings
+ text = LLTrans::getString("InventoryOutboxNotMerchant", subs);
+ title = LLTrans::getString("InventoryOutboxNotMerchantTitle");
+ tooltip = LLTrans::getString("InventoryOutboxNotMerchantTooltip");
+ }
+ else
+ {
+ // "Errors!" message strings
+ text = LLTrans::getString("InventoryOutboxError", subs);
+ title = LLTrans::getString("InventoryOutboxErrorTitle");
+ tooltip = LLTrans::getString("InventoryOutboxErrorTooltip");
+ }
+
+ mInventoryText->setValue(text);
+ mInventoryTitle->setValue(title);
+ mInventoryPlaceholder->getParent()->setToolTip(tooltip);
+ }
+}
+
+bool LLFloaterMarketplaceListings::isAccepted(EAcceptance accept)
+{
+ // *TODO : Need a bit more test on what we accept: depends of what and where...
+ return (accept >= ACCEPT_YES_COPY_SINGLE);
+}
+
+
+BOOL LLFloaterMarketplaceListings::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ EAcceptance* accept,
+ std::string& tooltip_msg)
+{
+ if ((mInventoryPanel.get() == NULL) || mRootFolderId.isNull())
+ {
+ return FALSE;
+ }
+
+ LLView * handled_view = childrenHandleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
+ BOOL handled = (handled_view != NULL);
+
+ // Determine if the mouse is inside the inventory panel itself or just within the floater
+ bool pointInInventoryPanel = false;
+ bool pointInInventoryPanelChild = false;
+ LLInventoryPanel* panel = mInventoryPanel.get();
+ LLFolderView* root_folder = panel->getRootFolder();
+ if (panel->getVisible())
+ {
+ S32 inv_x, inv_y;
+ localPointToOtherView(x, y, &inv_x, &inv_y, panel);
+
+ pointInInventoryPanel = panel->getRect().pointInRect(inv_x, inv_y);
+
+ LLView * inventory_panel_child_at_point = panel->childFromPoint(inv_x, inv_y, true);
+ pointInInventoryPanelChild = (inventory_panel_child_at_point != root_folder);
+ }
+
+ // Pass all drag and drop for this floater to the outbox inventory control
+ if (!handled || !isAccepted(*accept))
+ {
+ // Handle the drag and drop directly to the root of the outbox if we're not in the inventory panel
+ // (otherwise the inventory panel itself will handle the drag and drop operation, without any override)
+ if (!pointInInventoryPanel)
+ {
+ handled = root_folder->handleDragAndDropToThisFolder(mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
+ }
+ }
+
+ return handled;
+}
+
+BOOL LLFloaterMarketplaceListings::handleHover(S32 x, S32 y, MASK mask)
+{
+ return LLFloater::handleHover(x, y, mask);
+}
+
+void LLFloaterMarketplaceListings::onMouseLeave(S32 x, S32 y, MASK mask)
+{
+ LLFloater::onMouseLeave(x, y, mask);
+}
+
+void LLFloaterMarketplaceListings::onChanged()
+{
+ LLViewerInventoryCategory* category = gInventory.getCategory(mRootFolderId);
+ if (mRootFolderId.notNull() && category)
+ {
+ fetchContents();
+ updateView();
+ }
+ else
+ {
+ clean();
+ }
+}
+
+void LLFloaterMarketplaceListings::initializationReportError(U32 status, const LLSD& content)
+{
+ updateView();
+}
+
+void LLFloaterMarketplaceListings::importStatusChanged(bool inProgress)
+{
+ if (mRootFolderId.isNull() && (LLMarketplaceInventoryImporter::getInstance()->getMarketPlaceStatus() == MarketplaceStatusCodes::MARKET_PLACE_MERCHANT))
+ {
+ setup();
+ }
+
+ if (inProgress)
+ {
+ setStatusString(getString("MarketplaceListingsInitializing"));
+ mInventoryInitializationInProgress->setVisible(true);
+ }
+ else
+ {
+ setStatusString("");
+ mInventoryInitializationInProgress->setVisible(false);
+ }
+
+ updateView();
+}
+
+void LLFloaterMarketplaceListings::importReportResults(U32 status, const LLSD& content)
+{
+ updateView();
+}
+
+
diff --git a/indra/newview/llfloatermarketplacelistings.h b/indra/newview/llfloatermarketplacelistings.h
new file mode 100755
index 0000000000..fab2040deb
--- /dev/null
+++ b/indra/newview/llfloatermarketplacelistings.h
@@ -0,0 +1,110 @@
+/**
+ * @file llfloatermarketplacelistings.h
+ * @brief Implementation of the marketplace listings floater and panels
+ *
+ * $LicenseInfo:firstyear=2001&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
+ * ABILITY 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$
+ */
+
+#ifndef LL_LLFLOATERMARKETPLACELISTINGS_H
+#define LL_LLFLOATERMARKETPLACELISTINGS_H
+
+#include "llfloater.h"
+#include "llfoldertype.h"
+#include "llinventoryfilter.h"
+#include "llnotificationptr.h"
+
+class LLButton;
+class LLInventoryCategoriesObserver;
+class LLInventoryCategoryAddedObserver;
+class LLInventoryPanel;
+class LLLoadingIndicator;
+class LLNotification;
+class LLTextBox;
+class LLView;
+class LLWindowShade;
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLFloaterMarketplaceListings
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class LLFloaterMarketplaceListings : public LLFloater
+{
+public:
+ LLFloaterMarketplaceListings(const LLSD& key);
+ ~LLFloaterMarketplaceListings();
+
+ void initializeMarketPlace();
+
+ // virtuals
+ BOOL postBuild();
+ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ EAcceptance* accept,
+ std::string& tooltip_msg);
+
+ void showNotification(const LLNotificationPtr& notification);
+
+ BOOL handleHover(S32 x, S32 y, MASK mask);
+ void onMouseLeave(S32 x, S32 y, MASK mask);
+
+protected:
+ void setup();
+ void clean();
+ void fetchContents();
+
+ void importReportResults(U32 status, const LLSD& content);
+ void importStatusChanged(bool inProgress);
+ void initializationReportError(U32 status, const LLSD& content);
+ void setStatusString(const std::string& statusString);
+
+ void onClose(bool app_quitting);
+ void onOpen(const LLSD& key);
+ void onFocusReceived();
+ void onChanged();
+
+ bool isAccepted(EAcceptance accept);
+
+ void updateView();
+
+private:
+ S32 getFolderCount();
+ // UI callbacks
+ void onViewSortMenuItemClicked(const LLSD& userdata);
+ bool onViewSortMenuItemCheck(const LLSD& userdata);
+
+ LLInventoryCategoriesObserver * mCategoriesObserver;
+ LLInventoryCategoryAddedObserver * mCategoryAddedObserver;
+
+ LLTextBox * mInventoryStatus;
+ LLView * mInventoryInitializationInProgress;
+ LLView * mInventoryPlaceholder;
+ LLTextBox * mInventoryText;
+ LLTextBox * mInventoryTitle;
+
+ LLUUID mRootFolderId;
+ LLHandle<LLInventoryPanel> mInventoryPanel;
+ LLInventoryFilter::ESortOrderType mSortOrder;
+ LLInventoryFilter::EFilterType mFilterType;
+};
+
+#endif // LL_LLFLOATERMARKETPLACELISTINGS_H
diff --git a/indra/newview/llfloateroutbox.cpp b/indra/newview/llfloateroutbox.cpp
index 9ea83e9621..f5ebd5cf51 100755
--- a/indra/newview/llfloateroutbox.cpp
+++ b/indra/newview/llfloateroutbox.cpp
@@ -1,8 +1,6 @@
/**
* @file llfloateroutbox.cpp
- * @brief Implementation of the merchant outbox window and of the marketplace listings window
- *
- * *TODO : Eventually, take out all the merchant outbox stuff and rename that file to llfloatermarketplacelistings
+ * @brief Implementation of the merchant outbox window
*
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
* Second Life Viewer Source Code
@@ -107,39 +105,6 @@ private:
};
///----------------------------------------------------------------------------
-/// LLMarketplaceListingsAddedObserver helper class
-///----------------------------------------------------------------------------
-
-class LLMarketplaceListingsAddedObserver : public LLInventoryCategoryAddedObserver
-{
-public:
- LLMarketplaceListingsAddedObserver(LLFloaterMarketplaceListings * marketplace_listings_floater)
- : LLInventoryCategoryAddedObserver()
- , mMarketplaceListingsFloater(marketplace_listings_floater)
- {
- }
-
- void done()
- {
- for (cat_vec_t::iterator it = mAddedCategories.begin(); it != mAddedCategories.end(); ++it)
- {
- LLViewerInventoryCategory* added_category = *it;
-
- LLFolderType::EType added_category_type = added_category->getPreferredType();
-
- if (added_category_type == LLFolderType::FT_MARKETPLACE_LISTINGS)
- {
- mMarketplaceListingsFloater->initializeMarketPlace();
- }
- }
- }
-
-private:
- LLFloaterMarketplaceListings * mMarketplaceListingsFloater;
-};
-
-
-///----------------------------------------------------------------------------
/// LLFloaterOutbox
///----------------------------------------------------------------------------
@@ -652,490 +617,5 @@ void LLFloaterOutbox::showNotification(const LLNotificationPtr& notification)
notification_handler->processNotification(notification);
}
-///----------------------------------------------------------------------------
-/// LLFloaterMarketplaceListings
-///----------------------------------------------------------------------------
-
-LLFloaterMarketplaceListings::LLFloaterMarketplaceListings(const LLSD& key)
-: LLFloater(key)
-, mCategoriesObserver(NULL)
-, mCategoryAddedObserver(NULL)
-, mRootFolderId(LLUUID::null)
-, mInventoryStatus(NULL)
-, mInventoryInitializationInProgress(NULL)
-, mInventoryPlaceholder(NULL)
-, mInventoryText(NULL)
-, mInventoryTitle(NULL)
-, mSortOrder(LLInventoryFilter::SO_FOLDERS_BY_NAME)
-, mFilterType(LLInventoryFilter::FILTERTYPE_NONE)
-{
- mCommitCallbackRegistrar.add("Marketplace.ViewSort.Action", boost::bind(&LLFloaterMarketplaceListings::onViewSortMenuItemClicked, this, _2));
- mEnableCallbackRegistrar.add("Marketplace.ViewSort.CheckItem", boost::bind(&LLFloaterMarketplaceListings::onViewSortMenuItemCheck, this, _2));
-}
-
-LLFloaterMarketplaceListings::~LLFloaterMarketplaceListings()
-{
- if (mCategoriesObserver && gInventory.containsObserver(mCategoriesObserver))
- {
- gInventory.removeObserver(mCategoriesObserver);
- }
- delete mCategoriesObserver;
-
- if (mCategoryAddedObserver && gInventory.containsObserver(mCategoryAddedObserver))
- {
- gInventory.removeObserver(mCategoryAddedObserver);
- }
- delete mCategoryAddedObserver;
-}
-
-BOOL LLFloaterMarketplaceListings::postBuild()
-{
- mInventoryStatus = getChild<LLTextBox>("marketplace_status");
- mInventoryInitializationInProgress = getChild<LLView>("initialization_progress_indicator");
- mInventoryPlaceholder = getChild<LLView>("marketplace_listings_inventory_placeholder_panel");
- mInventoryText = mInventoryPlaceholder->getChild<LLTextBox>("marketplace_listings_inventory_placeholder_text");
- mInventoryTitle = mInventoryPlaceholder->getChild<LLTextBox>("marketplace_listings_inventory_placeholder_title");
-
- LLFocusableElement::setFocusReceivedCallback(boost::bind(&LLFloaterMarketplaceListings::onFocusReceived, this));
-
- // Observe category creation to catch marketplace listings creation (moot if already existing)
- mCategoryAddedObserver = new LLMarketplaceListingsAddedObserver(this);
- gInventory.addObserver(mCategoryAddedObserver);
-
- // Merov : Debug : fetch aggressively so we can create test data right onOpen()
- llinfos << "Merov : postBuild, do fetchContent() ahead of time" << llendl;
- fetchContents();
-
- return TRUE;
-}
-
-void LLFloaterMarketplaceListings::clean()
-{
- // Note: we cannot delete the mOutboxInventoryPanel as that point
- // as this is called through callback observers of the panel itself.
- // Doing so would crash rapidly.
-
- // Invalidate the outbox data
- mRootFolderId.setNull();
-}
-
-void LLFloaterMarketplaceListings::onClose(bool app_quitting)
-{
-}
-
-void LLFloaterMarketplaceListings::onOpen(const LLSD& key)
-{
- //
- // Initialize the Market Place or go update the outbox
- //
- if (LLMarketplaceInventoryImporter::getInstance()->getMarketPlaceStatus() == MarketplaceStatusCodes::MARKET_PLACE_NOT_INITIALIZED)
- {
- initializeMarketPlace();
- }
- else
- {
- setup();
- }
-
- // Merov : Debug : Create fake Marketplace data if none is present
- if (LLMarketplaceData::instance().isEmpty() && (getFolderCount() > 0))
- {
- LLInventoryModel::cat_array_t* cats;
- LLInventoryModel::item_array_t* items;
- gInventory.getDirectDescendentsOf(mRootFolderId, cats, items);
-
- int index = 0;
- for (LLInventoryModel::cat_array_t::iterator iter = cats->begin(); iter != cats->end(); iter++, index++)
- {
- LLViewerInventoryCategory* category = *iter;
- if (index%3)
- {
- LLMarketplaceData::instance().addTestItem(category->getUUID());
- if (index%3 == 1)
- {
- LLMarketplaceData::instance().setListingID(category->getUUID(),"TestingID1234");
- }
- LLMarketplaceData::instance().setActivation(category->getUUID(),(index%2));
- }
- }
- }
-
- //
- // Update the floater view
- //
- updateView();
-
- //
- // Trigger fetch of the contents
- //
- fetchContents();
-}
-
-void LLFloaterMarketplaceListings::onFocusReceived()
-{
- fetchContents();
-}
-
-
-void LLFloaterMarketplaceListings::onViewSortMenuItemClicked(const LLSD& userdata)
-{
- std::string chosen_item = userdata.asString();
-
- LLInventoryPanel* panel = mInventoryPanel.get();
-
- llinfos << "Merov : MenuItemClicked, item = " << chosen_item << ", panel on = " << panel->hasFocus() << llendl;
-
- // Sort options
- if (chosen_item == "sort_by_stock_amount")
- {
- mSortOrder = (mSortOrder == LLInventoryFilter::SO_FOLDERS_BY_NAME ? LLInventoryFilter::SO_FOLDERS_BY_WEIGHT : LLInventoryFilter::SO_FOLDERS_BY_NAME);
- panel->getFolderViewModel()->setSorter(mSortOrder);
- }
- // View/filter options
- else if (chosen_item == "show_all")
- {
- mFilterType = LLInventoryFilter::FILTERTYPE_NONE;
- panel->getFilter().resetDefault();
- }
- else if (chosen_item == "show_non_associated_listings")
- {
- mFilterType = LLInventoryFilter::FILTERTYPE_MARKETPLACE_UNASSOCIATED;
- panel->getFilter().setFilterMarketplaceUnassociatedFolders();
- }
- else if (chosen_item == "show_active")
- {
- mFilterType = LLInventoryFilter::FILTERTYPE_MARKETPLACE_ACTIVE;
- panel->getFilter().setFilterMarketplaceActiveFolders();
- }
- else if (chosen_item == "show_inactive_listings")
- {
- mFilterType = LLInventoryFilter::FILTERTYPE_MARKETPLACE_INACTIVE;
- panel->getFilter().setFilterMarketplaceInactiveFolders();
- }
-}
-
-bool LLFloaterMarketplaceListings::onViewSortMenuItemCheck(const LLSD& userdata)
-{
- std::string chosen_item = userdata.asString();
-
- LLInventoryPanel* panel = mInventoryPanel.get();
-
- llinfos << "Merov : MenuItemCheck, item = " << chosen_item << ", panel on = " << panel->hasFocus() << llendl;
-
- if (!panel->hasFocus())
- {
- return false;
- }
-
- if (chosen_item == "sort_by_stock_amount")
- return mSortOrder == LLInventoryFilter::SO_FOLDERS_BY_WEIGHT;
- if (chosen_item == "show_all")
- return mFilterType == LLInventoryFilter::FILTERTYPE_NONE;
- if (chosen_item == "show_non_associated_listings")
- return mFilterType == LLInventoryFilter::FILTERTYPE_MARKETPLACE_UNASSOCIATED;
- if (chosen_item == "show_active")
- return mFilterType == LLInventoryFilter::FILTERTYPE_MARKETPLACE_ACTIVE;
- if (chosen_item == "show_inactive_listings")
- return mFilterType == LLInventoryFilter::FILTERTYPE_MARKETPLACE_INACTIVE;
- return false;
-}
-
-
-void LLFloaterMarketplaceListings::fetchContents()
-{
- if (mRootFolderId.notNull())
- {
- LLInventoryModelBackgroundFetch::instance().start(mRootFolderId);
- }
-}
-
-void LLFloaterMarketplaceListings::setup()
-{
- if (LLMarketplaceInventoryImporter::getInstance()->getMarketPlaceStatus() != MarketplaceStatusCodes::MARKET_PLACE_MERCHANT)
- {
- // If we are *not* a merchant or we have no market place connection established yet, do nothing
- return;
- }
-
- // We are a merchant. Get the Marketplace listings folder, create it if needs be.
- LLUUID outbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, true);
- if (outbox_id.isNull())
- {
- // We should never get there unless the inventory fails badly
- llinfos << "Merov : Inventory problem: failure to create the marketplace listings folder for a merchant!" << llendl;
- llerrs << "Inventory problem: failure to create the marketplace listings folder for a merchant!" << llendl;
- return;
- }
-
- // Consolidate Marketplace listings
- // We shouldn't have to do that but with a client/server system relying on a "well known folder" convention, things get messy and conventions get broken down eventually
- gInventory.consolidateForType(outbox_id, LLFolderType::FT_MARKETPLACE_LISTINGS);
-
- if (outbox_id == mRootFolderId)
- {
- llinfos << "Merov : Inventory warning: Marketplace listings folder already set" << llendl;
- llwarns << "Inventory warning: Marketplace listings folder already set" << llendl;
- return;
- }
- mRootFolderId = outbox_id;
-
- // No longer need to observe new category creation
- if (mCategoryAddedObserver && gInventory.containsObserver(mCategoryAddedObserver))
- {
- gInventory.removeObserver(mCategoryAddedObserver);
- delete mCategoryAddedObserver;
- mCategoryAddedObserver = NULL;
- }
- llassert(!mCategoryAddedObserver);
-
- // Create observer for marketplace listings modifications : clear the old one and create a new one
- if (mCategoriesObserver && gInventory.containsObserver(mCategoriesObserver))
- {
- gInventory.removeObserver(mCategoriesObserver);
- delete mCategoriesObserver;
- }
- mCategoriesObserver = new LLInventoryCategoriesObserver();
- gInventory.addObserver(mCategoriesObserver);
- mCategoriesObserver->addCategory(mRootFolderId, boost::bind(&LLFloaterMarketplaceListings::onChanged, this));
- llassert(mCategoriesObserver);
-
- // Set up the marketplace listings inventory view
- LLPanel* inventory_panel = LLUICtrlFactory::createFromFile<LLPanel>("panel_marketplace_listings.xml", mInventoryPlaceholder->getParent(), LLInventoryPanel::child_registry_t::instance());
- LLInventoryPanel* items_panel = inventory_panel->getChild<LLInventoryPanel>("All Items");
- mInventoryPanel = items_panel->getInventoryPanelHandle();
- llassert(mInventoryPanel.get() != NULL);
-
- // Reshape the inventory to the proper size
- LLRect inventory_placeholder_rect = mInventoryPlaceholder->getRect();
- inventory_panel->setShape(inventory_placeholder_rect);
-
- // Set the sort order newest to oldest
- items_panel->getFolderViewModel()->setSorter(LLInventoryFilter::SO_FOLDERS_BY_NAME);
- items_panel->getFilter().markDefault();
-
- // Set filters on the 3 prefiltered panels
- items_panel = inventory_panel->getChild<LLInventoryPanel>("Active Items");
- items_panel->getFolderViewModel()->setSorter(LLInventoryFilter::SO_FOLDERS_BY_NAME);
- items_panel->getFilter().setFilterMarketplaceActiveFolders();
- items_panel->getFilter().markDefault();
- items_panel = inventory_panel->getChild<LLInventoryPanel>("Inactive Items");
- items_panel->getFolderViewModel()->setSorter(LLInventoryFilter::SO_FOLDERS_BY_NAME);
- items_panel->getFilter().setFilterMarketplaceInactiveFolders();
- items_panel->getFilter().markDefault();
- items_panel = inventory_panel->getChild<LLInventoryPanel>("Unassociated Items");
- items_panel->getFolderViewModel()->setSorter(LLInventoryFilter::SO_FOLDERS_BY_NAME);
- items_panel->getFilter().setFilterMarketplaceUnassociatedFolders();
- items_panel->getFilter().markDefault();
-
- // Get the content of the marketplace listings folder
- fetchContents();
-}
-
-void LLFloaterMarketplaceListings::initializeMarketPlace()
-{
- //
- // Initialize the marketplace import API
- //
- LLMarketplaceInventoryImporter& importer = LLMarketplaceInventoryImporter::instance();
-
- if (!importer.isInitialized())
- {
- importer.setInitializationErrorCallback(boost::bind(&LLFloaterMarketplaceListings::initializationReportError, this, _1, _2));
- importer.setStatusChangedCallback(boost::bind(&LLFloaterMarketplaceListings::importStatusChanged, this, _1));
- importer.setStatusReportCallback(boost::bind(&LLFloaterMarketplaceListings::importReportResults, this, _1, _2));
- importer.initialize();
- }
-}
-
-S32 LLFloaterMarketplaceListings::getFolderCount()
-{
- if (mInventoryPanel.get() && mRootFolderId.notNull())
- {
- LLInventoryModel::cat_array_t * cats;
- LLInventoryModel::item_array_t * items;
- gInventory.getDirectDescendentsOf(mRootFolderId, cats, items);
-
- return (cats->count() + items->count());
- }
- else
- {
- return 0;
- }
-}
-
-void LLFloaterMarketplaceListings::setStatusString(const std::string& statusString)
-{
- mInventoryStatus->setText(statusString);
-}
-
-void LLFloaterMarketplaceListings::updateView()
-{
- LLInventoryPanel* panel = mInventoryPanel.get();
-
- if (getFolderCount() > 0)
- {
- panel->setVisible(TRUE);
- mInventoryPlaceholder->setVisible(FALSE);
- }
- else
- {
- if (panel)
- {
- panel->setVisible(FALSE);
- }
-
- std::string text;
- std::string title;
- std::string tooltip;
-
- const LLSD& subs = getMarketplaceStringSubstitutions();
- U32 mkt_status = LLMarketplaceInventoryImporter::getInstance()->getMarketPlaceStatus();
-
- // *TODO : check those messages and create better appropriate ones in strings.xml
- if (mRootFolderId.notNull())
- {
- // Does the outbox needs recreation?
- if ((panel == NULL) || !gInventory.getCategory(mRootFolderId))
- {
- setup();
- }
- // "Marketplace listings is empty!" message strings
- text = LLTrans::getString("InventoryMarketplaceListingsNoItems", subs);
- title = LLTrans::getString("InventoryMarketplaceListingsNoItemsTitle");
- tooltip = LLTrans::getString("InventoryMarketplaceListingsNoItemsTooltip");
- }
- else if (mkt_status <= MarketplaceStatusCodes::MARKET_PLACE_INITIALIZING)
- {
- // "Initializing!" message strings
- text = LLTrans::getString("InventoryOutboxInitializing", subs);
- title = LLTrans::getString("InventoryOutboxInitializingTitle");
- tooltip = LLTrans::getString("InventoryOutboxInitializingTooltip");
- }
- else if (mkt_status == MarketplaceStatusCodes::MARKET_PLACE_NOT_MERCHANT)
- {
- // "Not a merchant!" message strings
- text = LLTrans::getString("InventoryOutboxNotMerchant", subs);
- title = LLTrans::getString("InventoryOutboxNotMerchantTitle");
- tooltip = LLTrans::getString("InventoryOutboxNotMerchantTooltip");
- }
- else
- {
- // "Errors!" message strings
- text = LLTrans::getString("InventoryOutboxError", subs);
- title = LLTrans::getString("InventoryOutboxErrorTitle");
- tooltip = LLTrans::getString("InventoryOutboxErrorTooltip");
- }
-
- mInventoryText->setValue(text);
- mInventoryTitle->setValue(title);
- mInventoryPlaceholder->getParent()->setToolTip(tooltip);
- }
-}
-
-bool LLFloaterMarketplaceListings::isAccepted(EAcceptance accept)
-{
- // *TODO : Need a bit more test on what we accept: depends of what and where...
- return (accept >= ACCEPT_YES_COPY_SINGLE);
-}
-
-
-BOOL LLFloaterMarketplaceListings::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
- EDragAndDropType cargo_type,
- void* cargo_data,
- EAcceptance* accept,
- std::string& tooltip_msg)
-{
- if ((mInventoryPanel.get() == NULL) || mRootFolderId.isNull())
- {
- return FALSE;
- }
-
- LLView * handled_view = childrenHandleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
- BOOL handled = (handled_view != NULL);
-
- // Determine if the mouse is inside the inventory panel itself or just within the floater
- bool pointInInventoryPanel = false;
- bool pointInInventoryPanelChild = false;
- LLInventoryPanel* panel = mInventoryPanel.get();
- LLFolderView* root_folder = panel->getRootFolder();
- if (panel->getVisible())
- {
- S32 inv_x, inv_y;
- localPointToOtherView(x, y, &inv_x, &inv_y, panel);
-
- pointInInventoryPanel = panel->getRect().pointInRect(inv_x, inv_y);
-
- LLView * inventory_panel_child_at_point = panel->childFromPoint(inv_x, inv_y, true);
- pointInInventoryPanelChild = (inventory_panel_child_at_point != root_folder);
- }
-
- // Pass all drag and drop for this floater to the outbox inventory control
- if (!handled || !isAccepted(*accept))
- {
- // Handle the drag and drop directly to the root of the outbox if we're not in the inventory panel
- // (otherwise the inventory panel itself will handle the drag and drop operation, without any override)
- if (!pointInInventoryPanel)
- {
- handled = root_folder->handleDragAndDropToThisFolder(mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
- }
- }
-
- return handled;
-}
-
-BOOL LLFloaterMarketplaceListings::handleHover(S32 x, S32 y, MASK mask)
-{
- return LLFloater::handleHover(x, y, mask);
-}
-
-void LLFloaterMarketplaceListings::onMouseLeave(S32 x, S32 y, MASK mask)
-{
- LLFloater::onMouseLeave(x, y, mask);
-}
-
-void LLFloaterMarketplaceListings::onChanged()
-{
- LLViewerInventoryCategory* category = gInventory.getCategory(mRootFolderId);
- if (mRootFolderId.notNull() && category)
- {
- fetchContents();
- updateView();
- }
- else
- {
- clean();
- }
-}
-
-void LLFloaterMarketplaceListings::initializationReportError(U32 status, const LLSD& content)
-{
- updateView();
-}
-
-void LLFloaterMarketplaceListings::importStatusChanged(bool inProgress)
-{
- if (mRootFolderId.isNull() && (LLMarketplaceInventoryImporter::getInstance()->getMarketPlaceStatus() == MarketplaceStatusCodes::MARKET_PLACE_MERCHANT))
- {
- setup();
- }
-
- if (inProgress)
- {
- setStatusString(getString("MarketplaceListingsInitializing"));
- mInventoryInitializationInProgress->setVisible(true);
- }
- else
- {
- setStatusString("");
- mInventoryInitializationInProgress->setVisible(false);
- }
-
- updateView();
-}
-
-void LLFloaterMarketplaceListings::importReportResults(U32 status, const LLSD& content)
-{
- updateView();
-}
diff --git a/indra/newview/llfloateroutbox.h b/indra/newview/llfloateroutbox.h
index 4908e4342b..2cf69fc3cc 100755
--- a/indra/newview/llfloateroutbox.h
+++ b/indra/newview/llfloateroutbox.h
@@ -1,8 +1,6 @@
/**
* @file llfloateroutbox.h
- * @brief Implementation of the merchant outbox window and of the marketplace listings window
- *
- * *TODO : Eventually, take out all the merchant outbox stuff and rename that file to llfloatermarketplacelistings
+ * @brief Implementation of the merchant outbox window
*
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
* Second Life Viewer Source Code
@@ -115,69 +113,4 @@ private:
LLWindowShade * mWindowShade;
};
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLFloaterMarketplaceListings
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-class LLFloaterMarketplaceListings : public LLFloater
-{
-public:
- LLFloaterMarketplaceListings(const LLSD& key);
- ~LLFloaterMarketplaceListings();
-
- void initializeMarketPlace();
-
- // virtuals
- BOOL postBuild();
- BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
- EDragAndDropType cargo_type,
- void* cargo_data,
- EAcceptance* accept,
- std::string& tooltip_msg);
-
- void showNotification(const LLNotificationPtr& notification);
-
- BOOL handleHover(S32 x, S32 y, MASK mask);
- void onMouseLeave(S32 x, S32 y, MASK mask);
-
-protected:
- void setup();
- void clean();
- void fetchContents();
-
- void importReportResults(U32 status, const LLSD& content);
- void importStatusChanged(bool inProgress);
- void initializationReportError(U32 status, const LLSD& content);
- void setStatusString(const std::string& statusString);
-
- void onClose(bool app_quitting);
- void onOpen(const LLSD& key);
- void onFocusReceived();
- void onChanged();
-
- bool isAccepted(EAcceptance accept);
-
- void updateView();
-
-private:
- S32 getFolderCount();
- // UI callbacks
- void onViewSortMenuItemClicked(const LLSD& userdata);
- bool onViewSortMenuItemCheck(const LLSD& userdata);
-
- LLInventoryCategoriesObserver * mCategoriesObserver;
- LLInventoryCategoryAddedObserver * mCategoryAddedObserver;
-
- LLTextBox * mInventoryStatus;
- LLView * mInventoryInitializationInProgress;
- LLView * mInventoryPlaceholder;
- LLTextBox * mInventoryText;
- LLTextBox * mInventoryTitle;
-
- LLUUID mRootFolderId;
- LLHandle<LLInventoryPanel> mInventoryPanel;
- LLInventoryFilter::ESortOrderType mSortOrder;
- LLInventoryFilter::EFilterType mFilterType;
-};
-
#endif // LL_LLFLOATEROUTBOX_H
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index 853d98693b..9bb6153e56 100755
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -79,6 +79,7 @@
#include "llfloaterland.h"
#include "llfloaterlandholdings.h"
#include "llfloatermap.h"
+#include "llfloatermarketplacelistings.h"
#include "llfloatermemleak.h"
#include "llfloaternamedesc.h"
#include "llfloaternotificationsconsole.h"