diff --git a/indra/newview/llbuildnewviewsscheduler.cpp b/indra/newview/llbuildnewviewsscheduler.cpp
new file mode 100644
index 000000000..c7dbceb25
--- /dev/null
+++ b/indra/newview/llbuildnewviewsscheduler.cpp
@@ -0,0 +1,140 @@
+//
+#include "llviewerprecompiledheaders.h"
+#include "llbuildnewviewsscheduler.h"
+#include "llinventorybridge.h"
+#define BUILD_DELAY 0.1f
+#define BUILD_PER_DELAY 512
+std::list LLBuildNewViewsScheduler::sJobs;
+LLBuildNewViewsScheduler::LLBuildNewViewsScheduler() : LLEventTimer(BUILD_DELAY)
+{
+}
+void LLBuildNewViewsScheduler::addJob(LLInventoryPanel* inventory_panel, LLInventoryObject* inventory_object)
+{
+ LLBuildNewViewsScheduler::job j;
+ j.mInventoryPanel = inventory_panel;
+ j.mInventoryObject = inventory_object;
+ sJobs.push_back(j);
+}
+void LLBuildNewViewsScheduler::cancel(LLInventoryPanel* inventory_panel)
+{
+ for(std::list::iterator iter = sJobs.begin();
+ iter != sJobs.end(); )
+ {
+ LLInventoryPanel* job_panel = (*iter).mInventoryPanel;
+ if(job_panel == inventory_panel)
+ {
+ iter = sJobs.erase(iter);
+ }
+ else
+ {
+ ++iter;
+ }
+ }
+}
+BOOL LLBuildNewViewsScheduler::tick()
+{
+ U32 i = 0;
+ while(!sJobs.empty() && (i < BUILD_PER_DELAY))
+ {
+ LLBuildNewViewsScheduler::job j = sJobs.front();
+ buildNewViews(j.mInventoryPanel, j.mInventoryObject);
+ sJobs.pop_front();
+ ++i;
+ }
+ return FALSE;
+}
+void LLBuildNewViewsScheduler::buildNewViews(LLInventoryPanel* panelp, LLInventoryObject* objectp)
+{
+ LLFolderViewItem* itemp = NULL;
+
+ if (objectp)
+ {
+ if (objectp->getType() <= LLAssetType::AT_NONE ||
+ objectp->getType() >= LLAssetType::AT_COUNT)
+ {
+ llwarns << "called with objectp->mType == "
+ << ((S32) objectp->getType())
+ << " (shouldn't happen)" << llendl;
+ }
+ else if (objectp->getType() == LLAssetType::AT_CATEGORY) // build new view for category
+ {
+ LLInvFVBridge* new_listener = LLInvFVBridge::createBridge(objectp->getType(),
+ LLInventoryType::IT_CATEGORY,
+ panelp,
+ objectp->getUUID());
+
+ if (new_listener)
+ {
+ LLFolderViewFolder* folderp = new LLFolderViewFolder(new_listener->getDisplayName(),
+ new_listener->getIcon(),
+ panelp->getRootFolder(),
+ new_listener);
+
+ folderp->setItemSortOrder(panelp->getSortOrder());
+ itemp = folderp;
+ }
+ }
+ else // build new view for item
+ {
+ LLInventoryItem* item = (LLInventoryItem*)objectp;
+ LLInvFVBridge* new_listener = LLInvFVBridge::createBridge(
+ item->getType(),
+ item->getInventoryType(),
+ panelp,
+ item->getUUID(),
+ item->getFlags());
+ if (new_listener)
+ {
+ itemp = new LLFolderViewItem(new_listener->getDisplayName(),
+ new_listener->getIcon(),
+ new_listener->getCreationDate(),
+ panelp->getRootFolder(),
+ new_listener);
+ }
+ }
+
+ LLFolderViewFolder* parent_folder = (LLFolderViewFolder*)panelp->getRootFolder()->getItemByID(objectp->getParentUUID());
+
+ if (itemp)
+ {
+ itemp->mDelayedDelete = TRUE;
+ if (parent_folder)
+ {
+ itemp->addToFolder(parent_folder, panelp->getRootFolder());
+ }
+ else
+ {
+ llwarns << "Couldn't find parent folder for child " << itemp->getLabel() << llendl;
+ delete itemp;
+ }
+ }
+ }
+
+ if (!objectp || (objectp && (objectp->getType() == LLAssetType::AT_CATEGORY)))
+ {
+ LLViewerInventoryCategory::cat_array_t* categories;
+ LLViewerInventoryItem::item_array_t* items;
+
+ panelp->getModel()->lockDirectDescendentArrays((objectp != NULL) ? objectp->getUUID() : LLUUID::null, categories, items);
+ if(categories)
+ {
+ S32 count = categories->count();
+ for(S32 i = 0; i < count; ++i)
+ {
+ LLInventoryCategory* cat = categories->get(i);
+ addJob(panelp, cat);
+ }
+ }
+ if(items)
+ {
+ S32 count = items->count();
+ for(S32 i = 0; i < count; ++i)
+ {
+ LLInventoryItem* item = items->get(i);
+ addJob(panelp, item);
+ }
+ }
+ panelp->getModel()->unlockDirectDescendentArrays(objectp->getUUID());
+ }
+}
+//
diff --git a/indra/newview/llbuildnewviewsscheduler.h b/indra/newview/llbuildnewviewsscheduler.h
new file mode 100644
index 000000000..e6720f37c
--- /dev/null
+++ b/indra/newview/llbuildnewviewsscheduler.h
@@ -0,0 +1,21 @@
+//
+#include "llinventoryview.h"
+#include "llinventory.h"
+class LLBuildNewViewsScheduler : public LLEventTimer
+{
+ typedef struct
+ {
+ LLInventoryPanel* mInventoryPanel;
+ LLInventoryObject* mInventoryObject;
+ } job;
+public:
+ LLBuildNewViewsScheduler();
+ void addJob(LLInventoryPanel* inventory_panel, LLInventoryObject* inventory_object);
+ void cancel(LLInventoryPanel* inventory_panel);
+ BOOL tick();
+private:
+ static std::list sJobs;
+ void buildNewViews(LLInventoryPanel* panelp, LLInventoryObject* objectp);
+};
+static LLBuildNewViewsScheduler* gBuildNewViewsScheduler;
+//