/** * @file llfloaterinventory.h * @brief LLFloaterInventory, LLInventoryFolder, and LLInventoryItem * class definition * * $LicenseInfo:firstyear=2001&license=viewergpl$ * * Copyright (c) 2001-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$ */ #ifndef LL_LLINVENTORYVIEW_H #define LL_LLINVENTORYVIEW_H #include "llassetstorage.h" #include "lldarray.h" #include "llfloater.h" #include "llinventory.h" #include "llinventoryfilter.h" #include "llfolderview.h" #include "llinventorymodel.h" #include "lluictrlfactory.h" #include //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Class LLFloaterInventory // // This is the agent inventory _floater_. // It deals with the buttons and views used to navigate as // well as controls the behavior of the overall object. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class LLFolderViewItem; class LLInventoryFilter; class LLInventoryModel; class LLInvFVBridge; class LLMenuBarGL; class LLCheckBoxCtrl; class LLSpinCtrl; class LLScrollContainer; class LLTextBox; class LLIconCtrl; class LLSaveFolderState; class LLFilterEditor; class LLTabContainer; class LLInventoryPanel : public LLPanel { public: static const std::string DEFAULT_SORT_ORDER; static const std::string RECENTITEMS_SORT_ORDER; static const std::string INHERIT_SORT_ORDER; struct Filter : public LLInitParam::Block { Optional sort_order; Optional types; Optional search_string; Filter() : sort_order("sort_order"), types("types", 0xffffffff), search_string("search_string") {} }; struct Params : public LLInitParam::Block { Optional sort_order_setting; Optional inventory; Optional allow_multi_select; Optional filter; Params() : sort_order_setting("sort_order_setting"), inventory("", &gInventory), allow_multi_select("allow_multi_select", true), filter("filter") {} }; protected: LLInventoryPanel(const Params&); friend class LLUICtrlFactory; public: ~LLInventoryPanel(); LLInventoryModel* getModel() { return mInventory; } BOOL postBuild(); // LLView methods void draw(); BOOL handleHover(S32 x, S32 y, MASK mask); BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type, void* cargo_data, EAcceptance* accept, std::string& tooltip_msg); // LLUICtrl methods /*virtual*/ void onFocusLost(); /*virtual*/ void onFocusReceived(); // Call this method to set the selection. void openAllFolders(); void openDefaultFolderForType(LLAssetType::EType); void setSelection(const LLUUID& obj_id, BOOL take_keyboard_focus); void setSelectCallback(const LLFolderView::signal_t::slot_type& cb) { if (mFolders) mFolders->setSelectCallback(cb); } void clearSelection(); LLInventoryFilter* getFilter() { return mFolders->getFilter(); } void setFilterTypes(U64 filter, BOOL filter_for_categories = FALSE); // if filter_for_categories is true, operate on folder preferred asset type U32 getFilterTypes() const { return mFolders->getFilterTypes(); } void setFilterPermMask(PermissionMask filter_perm_mask); U32 getFilterPermMask() const { return mFolders->getFilterPermissions(); } void setFilterSubString(const std::string& string); const std::string getFilterSubString() { return mFolders->getFilterSubString(); } void setSortOrder(U32 order); U32 getSortOrder() { return mFolders->getSortOrder(); } void setSinceLogoff(BOOL sl); void setHoursAgo(U32 hours); BOOL getSinceLogoff(); void setShowFolderState(LLInventoryFilter::EFolderShow show); LLInventoryFilter::EFolderShow getShowFolderState(); void setAllowMultiSelect(BOOL allow) { mFolders->setAllowMultiSelect(allow); } // This method is called when something has changed about the inventory. void modelChanged(U32 mask); LLFolderView* getRootFolder() { return mFolders; } LLScrollContainer* getScrollableContainer() { return mScroller; } void onSelectionChange(const std::deque &items, BOOL user_action); // Callbacks void doToSelected(const LLSD& userdata); void doCreate(const LLSD& userdata); bool beginIMSession(); bool attachObject(const LLSD& userdata); // DEBUG ONLY: static void dumpSelectionInformation(void* user_data); void openSelected(); void unSelectAll() { mFolders->setSelection(NULL, FALSE, FALSE); } protected: // Given the id and the parent, build all of the folder views. void rebuildViewsFor(const LLUUID& id, U32 mask); void buildNewViews(const LLUUID& id); protected: LLInventoryModel* mInventory; LLInventoryObserver* mInventoryObserver; LLFolderView* mFolders; LLScrollContainer* mScroller; BOOL mAllowMultiSelect; std::string mSortOrderSetting; }; class LLFloaterInventory; class LLFloaterInventoryFinder : public LLFloater { public: LLFloaterInventoryFinder( LLFloaterInventory* inventory_view); virtual void draw(); /*virtual*/ BOOL postBuild(); void changeFilter(LLInventoryFilter* filter); void updateElementsFromFilter(); BOOL getCheckShowEmpty(); BOOL getCheckSinceLogoff(); static void onTimeAgo(LLUICtrl*, void *); static void onCheckSinceLogoff(LLUICtrl*, void *); static void onCloseBtn(void* user_data); static void selectAllTypes(void* user_data); static void selectNoTypes(void* user_data); protected: LLFloaterInventory* mFloaterInventory; LLSpinCtrl* mSpinSinceDays; LLSpinCtrl* mSpinSinceHours; LLInventoryFilter* mFilter; }; class LLFloaterInventory : public LLFloater, LLInventoryObserver { friend class LLFloaterInventoryFinder; public: LLFloaterInventory(const LLSD& key); ~LLFloaterInventory(); /*virtual*/ void changed(U32 mask); BOOL postBuild(); // // Misc functions // void setFilterTextFromFilter() { mFilterText = mActivePanel->getFilter()->getFilterText(); } void startSearch(); // This method makes sure that an inventory view exists, is // visible, and has focus. The view chosen is returned. static LLFloaterInventory* showAgentInventory(); // Return the active inventory view if there is one. Active is // defined as the inventory that is the closest to the front, and // is visible. static LLFloaterInventory* getActiveInventory(); // This method calls showAgentInventory() if no views are visible, // or hides/destroyes them all if any are visible. static void toggleVisibility(); static void toggleVisibility(void*) { toggleVisibility(); } // Final cleanup, destroy all open inventory views. static void cleanup(); // LLView & LLFloater functionality virtual void onOpen(const LLSD& key); virtual void draw(); virtual BOOL handleKeyHere(KEY key, MASK mask); BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type, void* cargo_data, EAcceptance* accept, std::string& tooltip_msg); LLInventoryPanel* getPanel() { return mActivePanel; } LLInventoryPanel* getActivePanel() { return mActivePanel; } static BOOL filtersVisible(void* user_data); void onClearSearch(); static void onFoldersByName(void *user_data); static BOOL checkFoldersByName(void *user_data); void onFilterEdit(const std::string& search_string ); static BOOL incrementalFind(LLFolderViewItem* first_item, const char *find_text, BOOL backward); void onFilterSelected(); const std::string getFilterSubString() { return mActivePanel->getFilterSubString(); } void setFilterSubString(const std::string& string) { mActivePanel->setFilterSubString(string); } // menu callbacks void doToSelected(const LLSD& userdata); void closeAllFolders(); void doCreate(const LLSD& userdata); void resetFilters(); void setSortBy(const LLSD& userdata); // HACK: Until we can route this info through the instant message hierarchy static BOOL sWearNewClothing; static LLUUID sWearNewClothingTransactionID; // wear all clothing in this transaction void toggleFindOptions(); LLFloaterInventoryFinder* getFinder() { return (LLFloaterInventoryFinder*)mFinderHandle.get(); } protected: LLFilterEditor* mFilterEditor; LLTabContainer* mFilterTabs; LLHandle mFinderHandle; LLInventoryPanel* mActivePanel; LLSaveFolderState* mSavedFolderState; std::string mFilterText; private: void updateTitle(); }; class LLSelectFirstFilteredItem : public LLFolderViewFunctor { public: LLSelectFirstFilteredItem() : mItemSelected(FALSE) {} virtual ~LLSelectFirstFilteredItem() {} virtual void doFolder(LLFolderViewFolder* folder); virtual void doItem(LLFolderViewItem* item); BOOL wasItemSelected() { return mItemSelected; } protected: BOOL mItemSelected; }; class LLOpenFilteredFolders : public LLFolderViewFunctor { public: LLOpenFilteredFolders() {} virtual ~LLOpenFilteredFolders() {} virtual void doFolder(LLFolderViewFolder* folder); virtual void doItem(LLFolderViewItem* item); }; class LLSaveFolderState : public LLFolderViewFunctor { public: LLSaveFolderState() : mApply(FALSE) {} virtual ~LLSaveFolderState() {} virtual void doFolder(LLFolderViewFolder* folder); virtual void doItem(LLFolderViewItem* item) {} void setApply(BOOL apply); void clearOpenFolders() { mOpenFolders.clear(); } protected: std::set mOpenFolders; BOOL mApply; }; class LLOpenFoldersWithSelection : public LLFolderViewFunctor { public: LLOpenFoldersWithSelection() {} virtual ~LLOpenFoldersWithSelection() {} virtual void doFolder(LLFolderViewFolder* folder); virtual void doItem(LLFolderViewItem* item); }; ///---------------------------------------------------------------------------- /// Function declarations, constants, enums, and typedefs ///---------------------------------------------------------------------------- // useful functions with the inventory view class LLInventoryCategory; class LLInventoryItem; const std::string& get_item_icon_name(LLAssetType::EType asset_type, LLInventoryType::EType inventory_type, U32 attachment_point, BOOL item_is_multi ); LLUIImagePtr get_item_icon(LLAssetType::EType asset_type, LLInventoryType::EType inventory_type, U32 attachment_point, BOOL item_is_multi ); #endif // LL_LLINVENTORYVIEW_H