llfolderview.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:12k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llfolderview.h
  3.  * @brief Definition of the folder view collection of classes.
  4.  *
  5.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2001-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. /**
  33.  *
  34.  * The folder view collection of classes provides an interface for
  35.  * making a 'folder view' similar to the way the a single pane file
  36.  * folder interface works.
  37.  *
  38.  */
  39. #ifndef LL_LLFOLDERVIEW_H
  40. #define LL_LLFOLDERVIEW_H
  41. #include "llfolderviewitem.h" // because LLFolderView is-a LLFolderViewFolder
  42. #include "lluictrl.h"
  43. #include "v4color.h"
  44. #include "lldarray.h"
  45. #include "stdenums.h"
  46. #include "lldepthstack.h"
  47. #include "lleditmenuhandler.h"
  48. #include "llfontgl.h"
  49. #include "lltooldraganddrop.h"
  50. #include "llviewertexture.h"
  51. class LLFolderViewEventListener;
  52. class LLFolderViewFolder;
  53. class LLFolderViewItem;
  54. class LLInventoryModel;
  55. class LLPanel;
  56. class LLLineEditor;
  57. class LLMenuGL;
  58. class LLScrollContainer;
  59. class LLUICtrl;
  60. class LLTextBox;
  61. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  62. // Class LLFolderViewFunctor
  63. //
  64. // Simple abstract base class for applying a functor to folders and
  65. // items in a folder view hierarchy. This is suboptimal for algorithms
  66. // that only work folders or only work on items, but I'll worry about
  67. // that later when it's determined to be too slow.
  68. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  69. class LLFolderViewFunctor
  70. {
  71. public:
  72. virtual ~LLFolderViewFunctor() {}
  73. virtual void doFolder(LLFolderViewFolder* folder) = 0;
  74. virtual void doItem(LLFolderViewItem* item) = 0;
  75. };
  76. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  77. // Class LLFolderView
  78. //
  79. // Th LLFolderView represents the root level folder view object. It
  80. // manages the screen region of the folder view.
  81. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  82. class LLFolderView : public LLFolderViewFolder, public LLEditMenuHandler
  83. {
  84. public:
  85. struct Params : public LLInitParam::Block<Params, LLFolderViewFolder::Params>
  86. {
  87. Mandatory<LLPanel*> parent_panel;
  88. Optional<LLUUID> task_id;
  89. };
  90. LLFolderView(const Params&);
  91. virtual ~LLFolderView( void );
  92. virtual BOOL canFocusChildren() const;
  93. virtual LLFolderView* getRoot() { return this; }
  94. // FolderViews default to sort by name.  This will change that,
  95. // and resort the items if necessary.
  96. void setSortOrder(U32 order);
  97. void checkTreeResortForModelChanged();
  98. void setFilterPermMask(PermissionMask filter_perm_mask);
  99. void setAllowMultiSelect(BOOL allow) { mAllowMultiSelect = allow; }
  100. typedef boost::signals2::signal<void (const std::deque<LLFolderViewItem*>& items, BOOL user_action)> signal_t;
  101. void setSelectCallback(const signal_t::slot_type& cb) { mSelectSignal.connect(cb); }
  102. void setReshapeCallback(const signal_t::slot_type& cb) { mReshapeSignal.connect(cb); }
  103. // filter is never null
  104. LLInventoryFilter* getFilter();
  105. const std::string getFilterSubString(BOOL trim = FALSE);
  106. U32 getFilterObjectTypes() const;
  107. PermissionMask getFilterPermissions() const;
  108. // JAMESDEBUG use getFilter()->getShowFolderState();
  109. //LLInventoryFilter::EFolderShow getShowFolderState();
  110. U32 getSortOrder() const;
  111. BOOL isFilterModified();
  112. BOOL getAllowMultiSelect();
  113. // Close all folders in the view
  114. void closeAllFolders();
  115. void openFolder(const std::string& foldername);
  116. void openTopLevelFolders();
  117. virtual void toggleOpen() {};
  118. virtual void setOpenArrangeRecursively(BOOL openitem, ERecurseType recurse);
  119. virtual BOOL addFolder( LLFolderViewFolder* folder);
  120. // Finds width and height of this object and it's children.  Also
  121. // makes sure that this view and it's children are the right size.
  122. virtual S32 arrange( S32* width, S32* height, S32 filter_generation );
  123. void arrangeAll() { mArrangeGeneration++; }
  124. S32 getArrangeGeneration() { return mArrangeGeneration; }
  125. // applies filters to control visibility of inventory items
  126. virtual void filter( LLInventoryFilter& filter);
  127. // get the last selected item
  128. virtual LLFolderViewItem* getCurSelectedItem( void );
  129. // Record the selected item and pass it down the hierachy.
  130. virtual BOOL setSelection(LLFolderViewItem* selection, BOOL openitem,
  131. BOOL take_keyboard_focus);
  132. // Used by menu callbacks
  133. void setSelectionByID(const LLUUID& obj_id, BOOL take_keyboard_focus);
  134. // Called once a frame to update the selection if mSelectThisID has been set
  135. void updateSelection();
  136. // This method is used to toggle the selection of an item. Walks
  137. // children, and keeps track of selected objects.
  138. virtual BOOL changeSelection(LLFolderViewItem* selection, BOOL selected);
  139. virtual S32 extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray<LLFolderViewItem*>& items);
  140. virtual BOOL getSelectionList(std::set<LLUUID> &selection) const;
  141. // make sure if ancestor is selected, descendents are not
  142. void sanitizeSelection();
  143. void clearSelection();
  144. void addToSelectionList(LLFolderViewItem* item);
  145. void removeFromSelectionList(LLFolderViewItem* item);
  146. BOOL startDrag(LLToolDragAndDrop::ESource source);
  147. void setDragAndDropThisFrame() { mDragAndDropThisFrame = TRUE; }
  148. void setDraggingOverItem(LLFolderViewItem* item) { mDraggingOverItem = item; }
  149. LLFolderViewItem* getDraggingOverItem() { return mDraggingOverItem; }
  150. // deletion functionality
  151.   void removeSelectedItems();
  152. // open the selected item.
  153. void openSelectedItems( void );
  154. void propertiesSelectedItems( void );
  155. // change the folder type
  156. void changeType(LLInventoryModel *model, LLFolderType::EType new_folder_type);
  157. void autoOpenItem(LLFolderViewFolder* item);
  158. void closeAutoOpenedFolders();
  159. BOOL autoOpenTest(LLFolderViewFolder* item);
  160. // copy & paste
  161. virtual void copy();
  162. virtual BOOL canCopy() const;
  163. virtual void cut();
  164. virtual BOOL canCut() const;
  165. virtual void paste();
  166. virtual BOOL canPaste() const;
  167. virtual void doDelete();
  168. virtual BOOL canDoDelete() const;
  169. // public rename functionality - can only start the process
  170. void startRenamingSelectedItem( void );
  171. // These functions were used when there was only one folderview,
  172. // and relied on that concept. This functionality is now handled
  173. // by the listeners and the lldraganddroptool.
  174. //LLFolderViewItem* getMovingItem() { return mMovingItem; }
  175. //void setMovingItem( LLFolderViewItem* item ) { mMovingItem = item; }
  176. //void dragItemIntoFolder( LLFolderViewItem* moving_item, LLFolderViewFolder* dst_folder, BOOL drop, BOOL* accept );
  177. //void dragFolderIntoFolder( LLFolderViewFolder* moving_folder, LLFolderViewFolder* dst_folder, BOOL drop, BOOL* accept );
  178. // LLView functionality
  179. ///*virtual*/ BOOL handleKey( KEY key, MASK mask, BOOL called_from_parent );
  180. /*virtual*/ BOOL handleKeyHere( KEY key, MASK mask );
  181. /*virtual*/ BOOL handleUnicodeCharHere(llwchar uni_char);
  182. /*virtual*/ BOOL handleMouseDown( S32 x, S32 y, MASK mask );
  183. /*virtual*/ BOOL handleDoubleClick( S32 x, S32 y, MASK mask );
  184. /*virtual*/ BOOL handleRightMouseDown( S32 x, S32 y, MASK mask );
  185. /*virtual*/ BOOL handleHover( S32 x, S32 y, MASK mask );
  186. /*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
  187.    EDragAndDropType cargo_type,
  188.    void* cargo_data,
  189.    EAcceptance* accept,
  190.    std::string& tooltip_msg);
  191. /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
  192. virtual void draw();
  193. virtual void deleteAllChildren();
  194. void scrollToShowSelection();
  195. void scrollToShowItem(LLFolderViewItem* item, const LLRect& constraint_rect);
  196. void setScrollContainer( LLScrollContainer* parent ) { mScrollContainer = parent; }
  197. LLRect getVisibleRect();
  198. BOOL search(LLFolderViewItem* first_item, const std::string &search_string, BOOL backward);
  199. void setShowSelectionContext(BOOL show) { mShowSelectionContext = show; }
  200. BOOL getShowSelectionContext();
  201. void setShowSingleSelection(BOOL show);
  202. BOOL getShowSingleSelection() { return mShowSingleSelection; }
  203. F32  getSelectionFadeElapsedTime() { return mMultiSelectionFadeTimer.getElapsedTimeF32(); }
  204. void setUseEllipses(bool use_ellipses) { mUseEllipses = use_ellipses; }
  205. bool getUseEllipses() { return mUseEllipses; }
  206. void addItemID(const LLUUID& id, LLFolderViewItem* itemp);
  207. void removeItemID(const LLUUID& id);
  208. LLFolderViewItem* getItemByID(const LLUUID& id);
  209. LLFolderViewFolder* getFolderByID(const LLUUID& id);
  210. bool doToSelected(LLInventoryModel* model, const LLSD& userdata);
  211. void doIdle(); // Real idle routine
  212. static void idle(void* user_data); // static glue to doIdle()
  213. BOOL needsAutoSelect() { return mNeedsAutoSelect && !mAutoSelectOverride; }
  214. BOOL needsAutoRename() { return mNeedsAutoRename; }
  215. void setNeedsAutoRename(BOOL val) { mNeedsAutoRename = val; }
  216. void setCallbackRegistrar(LLUICtrl::CommitCallbackRegistry::ScopedRegistrar* registrar) { mCallbackRegistrar = registrar; }
  217. BOOL getDebugFilters() { return mDebugFilters; }
  218. LLPanel* getParentPanel() { return mParentPanel; }
  219. // DEBUG only
  220. void dumpSelectionInformation();
  221. virtual S32 notify(const LLSD& info) ;
  222. private:
  223. void updateRenamerPosition();
  224. protected:
  225. LLScrollContainer* mScrollContainer;  // NULL if this is not a child of a scroll container.
  226. void commitRename( const LLSD& data );
  227. static void onRenamerLost( LLFocusableElement* renamer);
  228. void finishRenamingItem( void );
  229. void closeRenamer( void );
  230. bool selectFirstItem();
  231. bool selectLastItem();
  232. protected:
  233. LLHandle<LLView> mPopupMenuHandle;
  234. typedef std::deque<LLFolderViewItem*> selected_items_t;
  235. selected_items_t mSelectedItems;
  236. BOOL mKeyboardSelection;
  237. BOOL mAllowMultiSelect;
  238. BOOL mShowFolderHierarchy;
  239. LLUUID mSourceID;
  240. // Renaming variables and methods
  241. LLFolderViewItem* mRenameItem;  // The item currently being renamed
  242. LLLineEditor* mRenamer;
  243. BOOL mNeedsScroll;
  244. BOOL mPinningSelectedItem;
  245. LLRect mScrollConstraintRect;
  246. BOOL mNeedsAutoSelect;
  247. BOOL mAutoSelectOverride;
  248. BOOL mNeedsAutoRename;
  249. BOOL mDebugFilters;
  250. U32 mSortOrder;
  251. LLDepthStack<LLFolderViewFolder> mAutoOpenItems;
  252. LLFolderViewFolder* mAutoOpenCandidate;
  253. LLFrameTimer mAutoOpenTimer;
  254. LLFrameTimer mSearchTimer;
  255. std::string mSearchString;
  256. LLInventoryFilter* mFilter;
  257. BOOL mShowSelectionContext;
  258. BOOL mShowSingleSelection;
  259. LLFrameTimer mMultiSelectionFadeTimer;
  260. S32 mArrangeGeneration;
  261. signal_t mSelectSignal;
  262. signal_t mReshapeSignal;
  263. S32 mSignalSelectCallback;
  264. S32 mMinWidth;
  265. std::map<LLUUID, LLFolderViewItem*> mItemMap;
  266. BOOL mDragAndDropThisFrame;
  267. LLUUID mSelectThisID; // if non null, select this item
  268. LLPanel* mParentPanel;
  269. /**
  270.  * Is used to determine if we need to cut text In LLFolderViewItem to avoid horizontal scroll.
  271.  * NOTE: For now it uses only to cut LLFolderViewItem::mLabel text to be used for Landmarks in Places Panel.
  272.  */
  273. bool mUseEllipses; // See EXT-719
  274. /**
  275.  * Contains item under mouse pointer while dragging
  276.  */
  277. LLFolderViewItem* mDraggingOverItem; // See EXT-719
  278. LLUICtrl::CommitCallbackRegistry::ScopedRegistrar* mCallbackRegistrar;
  279. public:
  280. static F32 sAutoOpenTime;
  281. LLTextBox* mStatusTextBox;
  282. };
  283. bool sort_item_name(LLFolderViewItem* a, LLFolderViewItem* b);
  284. bool sort_item_date(LLFolderViewItem* a, LLFolderViewItem* b);
  285. // Flags for buildContextMenu()
  286. const U32 SUPPRESS_OPEN_ITEM = 0x1;
  287. const U32 FIRST_SELECTED_ITEM = 0x2;
  288. #endif // LL_LLFOLDERVIEW_H