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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2. * @file llfolderviewitem.h
  3. * @brief Items and folders that can appear in a hierarchical folder view
  4. *
  5. * $LicenseInfo:firstyear=2001&license=viewergpl$
  6. * Copyright (c) 2001-2010, Linden Research, Inc.
  7. * Second Life Viewer Source Code
  8. * The source code in this file ("Source Code") is provided by Linden Lab
  9. * to you under the terms of the GNU General Public License, version 2.0
  10. * ("GPL"), unless you have obtained a separate licensing agreement
  11. * ("Other License"), formally executed by you and Linden Lab.  Terms of
  12. * the GPL can be found in doc/GPL-license.txt in this distribution, or
  13. * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  14. * There are special exceptions to the terms and conditions of the GPL as
  15. * it is applied to this Source Code. View the full text of the exception
  16. * in the file doc/FLOSS-exception.txt in this software distribution, or
  17. * online at
  18. * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  19. * By copying, modifying or distributing this software, you acknowledge
  20. * that you have read and understood your obligations described above,
  21. * and agree to abide by those obligations.
  22. * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  23. * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  24. * COMPLETENESS OR PERFORMANCE.
  25. * $/LicenseInfo$
  26. */
  27. #ifndef LLFOLDERVIEWITEM_H
  28. #define LLFOLDERVIEWITEM_H
  29. #include "llview.h"
  30. #include "lldarray.h"  // *TODO: Eliminate, forward declare
  31. class LLFontGL;
  32. class LLFolderView;
  33. class LLFolderViewEventListener;
  34. class LLFolderViewFolder;
  35. class LLFolderViewFunctor;
  36. class LLFolderViewItem;
  37. class LLFolderViewListenerFunctor;
  38. class LLInventoryFilter;
  39. class LLMenuGL;
  40. class LLUIImage;
  41. class LLViewerInventoryItem;
  42. // These are grouping of inventory types.
  43. // Order matters when sorting system folders to the top.
  44. enum EInventorySortGroup
  45. SG_SYSTEM_FOLDER, 
  46. SG_TRASH_FOLDER, 
  47. SG_NORMAL_FOLDER, 
  48. SG_ITEM 
  49. };
  50. // JAMESDEBUG *TODO: do we really need one sort object per folder?
  51. // can we just have one of these per LLFolderView ?
  52. class LLInventorySort
  53. {
  54. public:
  55. LLInventorySort() 
  56. : mSortOrder(0),
  57. mByDate(false),
  58. mSystemToTop(false),
  59. mFoldersByName(false) { }
  60. // Returns true if order has changed
  61. bool updateSort(U32 order);
  62. U32 getSort() { return mSortOrder; }
  63. bool operator()(const LLFolderViewItem* const& a, const LLFolderViewItem* const& b);
  64. private:
  65. U32  mSortOrder;
  66. bool mByDate;
  67. bool mSystemToTop;
  68. bool mFoldersByName;
  69. };
  70. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  71. // Class LLFolderViewItem
  72. //
  73. // An instance of this class represents a single item in a folder view
  74. // such as an inventory item or a file.
  75. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  76. class LLFolderViewItem : public LLView
  77. {
  78. public:
  79. static void initClass();
  80. static void cleanupClass();
  81. struct Params : public LLInitParam::Block<Params, LLView::Params>
  82. {
  83. Optional<LLUIImage*> icon;
  84. Optional<LLUIImage*> icon_open;  // used for folders
  85. Optional<LLFolderView*> root;
  86. Optional<LLFolderViewEventListener*> listener;
  87. Optional<LLUIImage*> folder_arrow_image;
  88. Optional<S32> folder_indentation; // pixels
  89. Optional<LLUIImage*> selection_image;
  90. Optional<S32> item_height; // pixels
  91. Optional<S32> item_top_pad; // pixels
  92. Optional<S32> creation_date; //UTC seconds
  93. Params();
  94. };
  95. // layout constants
  96. static const S32 LEFT_PAD = 5;
  97.     // LEFT_INDENTATION is set via folder_indentation above
  98. static const S32 ICON_PAD = 2;
  99. static const S32 ICON_WIDTH = 16;
  100. static const S32 TEXT_PAD = 1;
  101. static const S32 ARROW_SIZE = 12;
  102. static const S32 MAX_FOLDER_ITEM_OVERLAP = 2;
  103. // animation parameters
  104. static const F32 FOLDER_CLOSE_TIME_CONSTANT;
  105. static const F32 FOLDER_OPEN_TIME_CONSTANT;
  106. // Mostly for debugging printout purposes.
  107. const std::string& getSearchableLabel() { return mSearchableLabel; }
  108. protected:
  109. friend class LLUICtrlFactory;
  110. friend class LLFolderViewEventListener;
  111. LLFolderViewItem(const Params& p);
  112. std::string mLabel;
  113. std::string mSearchableLabel;
  114. S32 mLabelWidth;
  115. bool mLabelWidthDirty;
  116. time_t mCreationDate;
  117. LLFolderViewFolder* mParentFolder;
  118. LLFolderViewEventListener* mListener;
  119. BOOL mIsSelected;
  120. BOOL mIsCurSelection;
  121. BOOL mSelectPending;
  122. LLFontGL::StyleFlags mLabelStyle;
  123. std::string mLabelSuffix;
  124. LLUIImagePtr mIcon;
  125. std::string mStatusText;
  126. LLUIImagePtr mIconOpen;
  127. BOOL mHasVisibleChildren;
  128. S32 mIndentation;
  129. S32 mItemHeight;
  130. S32 mNumDescendantsSelected;
  131. BOOL mPassedFilter;
  132. S32 mLastFilterGeneration;
  133. std::string::size_type mStringMatchOffset;
  134. F32 mControlLabelRotation;
  135. LLFolderView* mRoot;
  136. BOOL mDragAndDropTarget;
  137. BOOL                        mIsLoading;
  138. LLTimer                     mTimeSinceRequestStart;
  139. bool mHidden;
  140. bool mShowLoadStatus;
  141. // helper function to change the selection from the root.
  142. void changeSelectionFromRoot(LLFolderViewItem* selection, BOOL selected);
  143. // helper function to change the selection from the root.
  144. void extendSelectionFromRoot(LLFolderViewItem* selection);
  145. // this is an internal method used for adding items to folders. A
  146. // no-op at this leve, but reimplemented in derived classes.
  147. virtual BOOL addItem(LLFolderViewItem*) { return FALSE; }
  148. virtual BOOL addFolder(LLFolderViewFolder*) { return FALSE; }
  149. static LLFontGL* getLabelFontForStyle(U8 style);
  150. public:
  151. // This function clears the currently selected item, and records
  152. // the specified selected item appropriately for display and use
  153. // in the UI. If open is TRUE, then folders are opened up along
  154. // the way to the selection.
  155. void setSelectionFromRoot(LLFolderViewItem* selection, BOOL openitem,
  156. BOOL take_keyboard_focus = TRUE);
  157. // This function is called when the folder view is dirty. It's
  158. // implemented here but called by derived classes when folding the
  159. // views.
  160. void arrangeFromRoot();
  161. void filterFromRoot( void );
  162. void arrangeAndSet(BOOL set_selection, BOOL take_keyboard_focus);
  163. virtual ~LLFolderViewItem( void );
  164. // addToFolder() returns TRUE if it succeeds. FALSE otherwise
  165. enum { ARRANGE = TRUE, DO_NOT_ARRANGE = FALSE };
  166. virtual BOOL addToFolder(LLFolderViewFolder* folder, LLFolderView* root);
  167. virtual EInventorySortGroup getSortGroup() const;
  168. // Finds width and height of this object and it's children.  Also
  169. // makes sure that this view and it's children are the right size.
  170. virtual S32 arrange( S32* width, S32* height, S32 filter_generation );
  171. virtual S32 getItemHeight();
  172. // Hide the folder from the UI, such as if you want to hide the root
  173. // folder in an inventory panel.
  174. void setHidden(bool hidden) { mHidden = hidden; }
  175. bool getHidden() const { return mHidden; }
  176. // applies filters to control visibility of inventory items
  177. virtual void filter( LLInventoryFilter& filter);
  178. // updates filter serial number and optionally propagated value up to root
  179. S32 getLastFilterGeneration() { return mLastFilterGeneration; }
  180. virtual void dirtyFilter();
  181. // If the selection is 'this' then note that otherwise
  182. // ignore. Returns TRUE if this object was affected. If open is
  183. // TRUE, then folders are opened up along the way to the
  184. // selection.
  185. virtual BOOL setSelection(LLFolderViewItem* selection, BOOL openitem,
  186. BOOL take_keyboard_focus);
  187. // This method is used to toggle the selection of an item. If
  188. // selection is 'this', then note selection, and return TRUE.
  189. virtual BOOL changeSelection(LLFolderViewItem* selection, BOOL selected);
  190. // this method is used to group select items
  191. virtual S32 extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray<LLFolderViewItem*>& items){ return FALSE; }
  192. // this method is used to group select items
  193. virtual void recursiveDeselect(BOOL deselect_self);
  194. // gets multiple-element selection
  195. virtual BOOL getSelectionList(std::set<LLUUID> &selection) const {return TRUE;}
  196. // Returns true is this object and all of its children can be removed (deleted by user)
  197. virtual BOOL isRemovable();
  198. // Returns true is this object and all of its children can be moved
  199. virtual BOOL isMovable();
  200. // destroys this item recursively
  201. virtual void destroyView();
  202. S32 getNumSelectedDescendants() { return mNumDescendantsSelected; }
  203. BOOL isSelected() { return mIsSelected; }
  204. void setIsCurSelection(BOOL select) { mIsCurSelection = select; }
  205. BOOL getIsCurSelection() { return mIsCurSelection; }
  206. BOOL hasVisibleChildren() { return mHasVisibleChildren; }
  207. void setShowLoadStatus(bool status) { mShowLoadStatus = status; }
  208. // Call through to the viewed object and return true if it can be
  209. // removed. Returns true if it's removed.
  210. //virtual BOOL removeRecursively(BOOL single_item);
  211. BOOL remove();
  212. // Build an appropriate context menu for the item. Flags unused.
  213. void buildContextMenu(LLMenuGL& menu, U32 flags);
  214. // This method returns the actual name of the thing being
  215. // viewed. This method will ask the viewed object itself.
  216. std::string getName( void ) const;
  217. const std::string& getSearchableLabel( void ) const;
  218. // This method returns the label displayed on the view. This
  219. // method was primarily added to allow sorting on the folder
  220. // contents possible before the entire view has been constructed.
  221. const std::string& getLabel() const { return mLabel; }
  222. // Used for sorting, like getLabel() above.
  223. virtual time_t getCreationDate() const { return mCreationDate; }
  224. LLFolderViewFolder* getParentFolder( void ) { return mParentFolder; }
  225. const LLFolderViewFolder* getParentFolder( void ) const { return mParentFolder; }
  226. LLFolderViewItem* getNextOpenNode( BOOL include_children = TRUE );
  227. LLFolderViewItem* getPreviousOpenNode( BOOL include_children = TRUE );
  228. const LLFolderViewEventListener* getListener( void ) const { return mListener; }
  229. LLFolderViewEventListener* getListener( void ) { return mListener; }
  230. // Gets the inventory item if it exists (null otherwise)
  231. LLViewerInventoryItem * getInventoryItem(void);
  232. // just rename the object.
  233. void rename(const std::string& new_name);
  234. // open
  235. virtual void openItem( void );
  236. virtual void preview(void);
  237. // Show children (unfortunate that this is called "open")
  238. virtual void setOpen(BOOL open = TRUE) {};
  239. virtual BOOL isOpen() const { return FALSE; }
  240. virtual LLFolderView* getRoot();
  241. BOOL isDescendantOf( const LLFolderViewFolder* potential_ancestor );
  242. S32 getIndentation() { return mIndentation; }
  243. virtual BOOL potentiallyVisible(); // do we know for a fact that this item has been filtered out?
  244. virtual BOOL getFiltered();
  245. virtual BOOL getFiltered(S32 filter_generation);
  246. virtual void setFiltered(BOOL filtered, S32 filter_generation);
  247. // change the icon
  248. void setIcon(LLUIImagePtr icon);
  249. // refresh information from the object being viewed.
  250. void refreshFromListener();
  251. virtual void refresh();
  252. virtual void applyListenerFunctorRecursively(LLFolderViewListenerFunctor& functor);
  253. // LLView functionality
  254. virtual BOOL handleRightMouseDown( S32 x, S32 y, MASK mask );
  255. virtual BOOL handleMouseDown( S32 x, S32 y, MASK mask );
  256. virtual BOOL handleHover( S32 x, S32 y, MASK mask );
  257. virtual BOOL handleMouseUp( S32 x, S32 y, MASK mask );
  258. virtual BOOL handleDoubleClick( S32 x, S32 y, MASK mask );
  259. // virtual void handleDropped();
  260. virtual void draw();
  261. virtual BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
  262. EDragAndDropType cargo_type,
  263. void* cargo_data,
  264. EAcceptance* accept,
  265. std::string& tooltip_msg);
  266. private:
  267. static std::map<U8, LLFontGL*> sFonts; // map of styles to fonts
  268. };
  269. // function used for sorting.
  270. typedef bool (*sort_order_f)(LLFolderViewItem* a, LLFolderViewItem* b);
  271. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  272. // Class LLFolderViewFolder
  273. //
  274. // An instance of an LLFolderViewFolder represents a collection of
  275. // more folders and items. This is used to build the hierarchy of
  276. // items found in the folder view.
  277. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  278. class LLFolderViewFolder : public LLFolderViewItem
  279. {
  280. protected:
  281. LLFolderViewFolder( const LLFolderViewItem::Params& );
  282. friend class LLUICtrlFactory;
  283. public:
  284. typedef enum e_trash
  285. {
  286. UNKNOWN, TRASH, NOT_TRASH
  287. } ETrash;
  288. protected:
  289. typedef std::list<LLFolderViewItem*> items_t;
  290. typedef std::list<LLFolderViewFolder*> folders_t;
  291. items_t mItems;
  292. folders_t mFolders;
  293. LLInventorySort mSortFunction;
  294. BOOL mIsOpen;
  295. BOOL mExpanderHighlighted;
  296. F32 mCurHeight;
  297. F32 mTargetHeight;
  298. F32 mAutoOpenCountdown;
  299. time_t mSubtreeCreationDate;
  300. mutable ETrash mAmTrash;
  301. S32 mLastArrangeGeneration;
  302. S32 mLastCalculatedWidth;
  303. S32 mCompletedFilterGeneration;
  304. S32 mMostFilteredDescendantGeneration;
  305. bool mNeedsSort;
  306. public:
  307. typedef enum e_recurse_type
  308. {
  309. RECURSE_NO,
  310. RECURSE_UP,
  311. RECURSE_DOWN,
  312. RECURSE_UP_DOWN
  313. } ERecurseType;
  314. virtual ~LLFolderViewFolder( void );
  315. virtual BOOL potentiallyVisible();
  316. LLFolderViewItem* getNextFromChild( LLFolderViewItem*, BOOL include_children = TRUE );
  317. LLFolderViewItem* getPreviousFromChild( LLFolderViewItem*, BOOL include_children = TRUE  );
  318. // addToFolder() returns TRUE if it succeeds. FALSE otherwise
  319. virtual BOOL addToFolder(LLFolderViewFolder* folder, LLFolderView* root);
  320. // Finds width and height of this object and it's children.  Also
  321. // makes sure that this view and it's children are the right size.
  322. virtual S32 arrange( S32* width, S32* height, S32 filter_generation );
  323. BOOL needsArrange();
  324. void requestSort();
  325. // Returns the sort group (system, trash, folder) for this folder.
  326. virtual EInventorySortGroup getSortGroup() const;
  327. virtual void setCompletedFilterGeneration(S32 generation, BOOL recurse_up);
  328. virtual S32 getCompletedFilterGeneration() { return mCompletedFilterGeneration; }
  329. BOOL hasFilteredDescendants(S32 filter_generation) { return mMostFilteredDescendantGeneration >= filter_generation; }
  330. BOOL hasFilteredDescendants();
  331. // applies filters to control visibility of inventory items
  332. virtual void filter( LLInventoryFilter& filter);
  333. virtual void setFiltered(BOOL filtered, S32 filter_generation);
  334. virtual void dirtyFilter();
  335. // Passes selection information on to children and record
  336. // selection information if necessary. Returns TRUE if this object
  337. // (or a child) was affected.
  338. virtual BOOL setSelection(LLFolderViewItem* selection, BOOL openitem,
  339. BOOL take_keyboard_focus);
  340. // This method is used to change the selection of an item. If
  341. // selection is 'this', then note selection as true. Returns TRUE
  342. // if this or a child is now selected.
  343. virtual BOOL changeSelection(LLFolderViewItem* selection, BOOL selected);
  344. // this method is used to group select items
  345. virtual S32 extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray<LLFolderViewItem*>& items);
  346. virtual void recursiveDeselect(BOOL deselect_self);
  347. // Returns true is this object and all of its children can be removed.
  348. virtual BOOL isRemovable();
  349. // Returns true is this object and all of its children can be moved
  350. virtual BOOL isMovable();
  351. // destroys this folder, and all children
  352. virtual void destroyView();
  353. // If this folder can be removed, remove all children that can be
  354. // removed, return TRUE if this is empty after the operation and
  355. // it's viewed folder object can be removed.
  356. //virtual BOOL removeRecursively(BOOL single_item);
  357. //virtual BOOL remove();
  358. // remove the specified item (and any children) if
  359. // possible. Return TRUE if the item was deleted.
  360. BOOL removeItem(LLFolderViewItem* item);
  361. // simply remove the view (and any children) Don't bother telling
  362. // the listeners.
  363. void removeView(LLFolderViewItem* item);
  364. // extractItem() removes the specified item from the folder, but
  365. // doesn't delete it.
  366. void extractItem( LLFolderViewItem* item );
  367. // This function is called by a child that needs to be resorted.
  368. void resort(LLFolderViewItem* item);
  369. void setItemSortOrder(U32 ordering);
  370. void sortBy(U32);
  371. //BOOL (*func)(LLFolderViewItem* a, LLFolderViewItem* b));
  372. void setAutoOpenCountdown(F32 countdown) { mAutoOpenCountdown = countdown; }
  373. // folders can be opened. This will usually be called by internal
  374. // methods.
  375. virtual void toggleOpen();
  376. // Force a folder open or closed
  377. virtual void setOpen(BOOL openitem = TRUE);
  378. // Called when a child is refreshed.
  379. // don't rearrange child folder contents unless explicitly requested
  380. virtual void requestArrange(BOOL include_descendants = FALSE);
  381. // internal method which doesn't update the entire view. This
  382. // method was written because the list iterators destroy the state
  383. // of other iterations, thus, we can't arrange while iterating
  384. // through the children (such as when setting which is selected.
  385. virtual void setOpenArrangeRecursively(BOOL openitem, ERecurseType recurse = RECURSE_NO);
  386. // Get the current state of the folder.
  387. virtual BOOL isOpen() const { return mIsOpen; }
  388. // special case if an object is dropped on the child.
  389. BOOL handleDragAndDropFromChild(MASK mask,
  390. BOOL drop,
  391. EDragAndDropType cargo_type,
  392. void* cargo_data,
  393. EAcceptance* accept,
  394. std::string& tooltip_msg);
  395. void applyFunctorRecursively(LLFolderViewFunctor& functor);
  396. virtual void applyListenerFunctorRecursively(LLFolderViewListenerFunctor& functor);
  397. // Just apply this functor to the folder's immediate children.
  398. void applyFunctorToChildren(LLFolderViewFunctor& functor);
  399. virtual void openItem( void );
  400. virtual BOOL addItem(LLFolderViewItem* item);
  401. virtual BOOL addFolder( LLFolderViewFolder* folder);
  402. // LLView functionality
  403. virtual BOOL handleHover(S32 x, S32 y, MASK mask);
  404. virtual BOOL handleRightMouseDown( S32 x, S32 y, MASK mask );
  405. virtual BOOL handleMouseDown( S32 x, S32 y, MASK mask );
  406. virtual BOOL handleDoubleClick( S32 x, S32 y, MASK mask );
  407. virtual BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
  408. EDragAndDropType cargo_type,
  409. void* cargo_data,
  410. EAcceptance* accept,
  411. std::string& tooltip_msg);
  412. virtual void draw();
  413. time_t getCreationDate() const;
  414. bool isTrash() const;
  415. };
  416. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  417. // Class LLFolderViewListenerFunctor
  418. //
  419. // This simple abstract base class can be used to applied to all
  420. // listeners in a hierarchy.
  421. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  422. class LLFolderViewListenerFunctor
  423. {
  424. public:
  425. virtual ~LLFolderViewListenerFunctor() {}
  426. virtual void operator()(LLFolderViewEventListener* listener) = 0;
  427. };
  428. #endif  // LLFOLDERVIEWITEM_H