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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llscrolllistctrl.h
  3.  * @brief A scrolling list of items.  This is the one you want to use
  4.  * in UI code.  LLScrollListCell, LLScrollListItem, etc. are utility
  5.  * classes.
  6.  *
  7.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  8.  * 
  9.  * Copyright (c) 2001-2010, Linden Research, Inc.
  10.  * 
  11.  * Second Life Viewer Source Code
  12.  * The source code in this file ("Source Code") is provided by Linden Lab
  13.  * to you under the terms of the GNU General Public License, version 2.0
  14.  * ("GPL"), unless you have obtained a separate licensing agreement
  15.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  16.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  17.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  18.  * 
  19.  * There are special exceptions to the terms and conditions of the GPL as
  20.  * it is applied to this Source Code. View the full text of the exception
  21.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  22.  * online at
  23.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  24.  * 
  25.  * By copying, modifying or distributing this software, you acknowledge
  26.  * that you have read and understood your obligations described above,
  27.  * and agree to abide by those obligations.
  28.  * 
  29.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  30.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  31.  * COMPLETENESS OR PERFORMANCE.
  32.  * $/LicenseInfo$
  33.  */
  34. #ifndef LL_SCROLLLISTCTRL_H
  35. #define LL_SCROLLLISTCTRL_H
  36. #include <vector>
  37. #include <deque>
  38. #include "lluictrl.h"
  39. #include "llctrlselectioninterface.h"
  40. //#include "lldarray.h"
  41. #include "llfontgl.h"
  42. #include "llui.h"
  43. #include "llstring.h" // LLWString
  44. #include "lleditmenuhandler.h"
  45. #include "llframetimer.h"
  46. #include "llscrollbar.h"
  47. #include "lldate.h"
  48. #include "llscrolllistitem.h"
  49. #include "llscrolllistcolumn.h"
  50. #include "llviewborder.h"
  51. class LLScrollListCell;
  52. class LLTextBox;
  53. class LLContextMenu;
  54. class LLScrollListCtrl : public LLUICtrl, public LLEditMenuHandler, 
  55. public LLCtrlListInterface, public LLCtrlScrollInterface
  56. {
  57. public:
  58. struct Contents : public LLInitParam::Block<Contents>
  59. {
  60. Multiple<LLScrollListColumn::Params> columns;
  61. Multiple<LLScrollListItem::Params> rows;
  62. //Multiple<Contents> groups;
  63. Contents();
  64. };
  65. // *TODO: Add callbacks to Params
  66. typedef boost::function<void (void)> callback_t;
  67. struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
  68. {
  69. // behavioral flags
  70. Optional<bool> multi_select,
  71. commit_on_keyboard_movement;
  72. // display flags
  73. Optional<bool> has_border,
  74. draw_heading,
  75. draw_stripes,
  76. background_visible,
  77. scroll_bar_bg_visible;
  78. // layout
  79. Optional<S32> column_padding,
  80. page_lines,
  81. heading_height;
  82. // sort and search behavior
  83. Optional<S32> search_column,
  84. sort_column;
  85. Optional<bool> sort_ascending;
  86. // colors
  87. Optional<LLUIColor> fg_unselected_color,
  88. fg_selected_color,
  89. bg_selected_color,
  90. fg_disable_color,
  91. bg_writeable_color,
  92. bg_readonly_color,
  93. bg_stripe_color,
  94. hovered_color,
  95. highlighted_color,
  96. scroll_bar_bg_color;
  97. Optional<Contents> contents;
  98. Optional<LLViewBorder::Params> border;
  99. Params();
  100. };
  101. protected:
  102. friend class LLUICtrlFactory;
  103. LLScrollListCtrl(const Params&);
  104. public:
  105. virtual ~LLScrollListCtrl();
  106. S32 isEmpty() const;
  107. void deleteAllItems() { clearRows(); }
  108. // Sets an array of column descriptors
  109. void      setColumnHeadings(const LLSD& headings);
  110. void    sortByColumnIndex(U32 column, BOOL ascending);
  111. // LLCtrlListInterface functions
  112. virtual S32  getItemCount() const;
  113. // Adds a single column descriptor: ["name" : string, "label" : string, "width" : integer, "relwidth" : integer ]
  114. virtual void addColumn(const LLScrollListColumn::Params& column, EAddPosition pos = ADD_BOTTOM);
  115. virtual void addColumn(const LLSD& column, EAddPosition pos = ADD_BOTTOM);
  116. virtual void clearColumns();
  117. virtual void setColumnLabel(const std::string& column, const std::string& label);
  118. virtual bool  preProcessChildNode(LLXMLNodePtr child);
  119. virtual LLScrollListColumn* getColumn(S32 index);
  120. virtual LLScrollListColumn* getColumn(const std::string& name);
  121. virtual S32 getNumColumns() const { return mColumnsIndexed.size(); }
  122. // Adds a single element, from an array of:
  123. // "columns" => [ "column" => column name, "value" => value, "type" => type, "font" => font, "font-style" => style ], "id" => uuid
  124. // Creates missing columns automatically.
  125. virtual LLScrollListItem* addElement(const LLSD& element, EAddPosition pos = ADD_BOTTOM, void* userdata = NULL);
  126. virtual LLScrollListItem* addRow(LLScrollListItem *new_item, const LLScrollListItem::Params& value, EAddPosition pos = ADD_BOTTOM);
  127. virtual LLScrollListItem* addRow(const LLScrollListItem::Params& value, EAddPosition pos = ADD_BOTTOM);
  128. // Simple add element. Takes a single array of:
  129. // [ "value" => value, "font" => font, "font-style" => style ]
  130. virtual void clearRows(); // clears all elements
  131. virtual void sortByColumn(const std::string& name, BOOL ascending);
  132. // These functions take and return an array of arrays of elements, as above
  133. virtual void setValue(const LLSD& value );
  134. virtual LLSD getValue() const;
  135. LLCtrlSelectionInterface* getSelectionInterface() { return (LLCtrlSelectionInterface*)this; }
  136. LLCtrlListInterface* getListInterface() { return (LLCtrlListInterface*)this; }
  137. LLCtrlScrollInterface* getScrollInterface() { return (LLCtrlScrollInterface*)this; }
  138. // DEPRECATED: Use setSelectedByValue() below.
  139. BOOL setCurrentByID( const LLUUID& id ) { return selectByID(id); }
  140. virtual LLUUID getCurrentID() const { return getStringUUIDSelectedItem(); }
  141. BOOL operateOnSelection(EOperation op);
  142. BOOL operateOnAll(EOperation op);
  143. // returns FALSE if unable to set the max count so low
  144. BOOL  setMaxItemCount(S32 max_count);
  145. BOOL selectByID( const LLUUID& id ); // FALSE if item not found
  146. // Match item by value.asString(), which should work for string, integer, uuid.
  147. // Returns FALSE if not found.
  148. BOOL setSelectedByValue(const LLSD& value, BOOL selected);
  149. BOOL isSorted() const { return mSorted; }
  150. virtual BOOL isSelected(const LLSD& value) const;
  151. BOOL handleClick(S32 x, S32 y, MASK mask);
  152. BOOL selectFirstItem();
  153. BOOL selectNthItem( S32 index );
  154. BOOL selectItemRange( S32 first, S32 last );
  155. BOOL selectItemAt(S32 x, S32 y, MASK mask);
  156. void deleteSingleItem( S32 index );
  157. void deleteItems(const LLSD& sd);
  158. void  deleteSelectedItems();
  159. void deselectAllItems(BOOL no_commit_on_change = FALSE); // by default, go ahead and commit on selection change
  160. void clearHighlightedItems();
  161. void mouseOverHighlightNthItem( S32 index );
  162. void setDoubleClickCallback( callback_t cb ) { mOnDoubleClickCallback = cb; }
  163. void setMaximumSelectCallback( callback_t cb) { mOnMaximumSelectCallback = cb; }
  164. void setSortChangedCallback( callback_t cb)  { mOnSortChangedCallback = cb; }
  165. // Convenience function; *TODO: replace with setter above + boost::bind() in calling code
  166. void setDoubleClickCallback( boost::function<void (void* userdata)> cb, void* userdata) { mOnDoubleClickCallback = boost::bind(cb, userdata); }
  167. void swapWithNext(S32 index);
  168. void swapWithPrevious(S32 index);
  169. void setCanSelect(BOOL can_select) { mCanSelect = can_select; }
  170. virtual BOOL getCanSelect() const { return mCanSelect; }
  171. S32 getItemIndex( LLScrollListItem* item ) const;
  172. S32 getItemIndex( const LLUUID& item_id ) const;
  173. void setCommentText( const std::string& comment_text);
  174. LLScrollListItem* addSeparator(EAddPosition pos);
  175. // "Simple" interface: use this when you're creating a list that contains only unique strings, only
  176. // one of which can be selected at a time.
  177. virtual LLScrollListItem* addSimpleElement(const std::string& value, EAddPosition pos = ADD_BOTTOM, const LLSD& id = LLSD());
  178. BOOL selectItemByLabel( const std::string& item, BOOL case_sensitive = TRUE ); // FALSE if item not found
  179. BOOL selectItemByPrefix(const std::string& target, BOOL case_sensitive = TRUE);
  180. BOOL selectItemByPrefix(const LLWString& target, BOOL case_sensitive = TRUE);
  181. LLScrollListItem*  getItemByLabel( const std::string& item, BOOL case_sensitive = TRUE, S32 column = 0 );
  182. const std::string getSelectedItemLabel(S32 column = 0) const;
  183. LLSD getSelectedValue();
  184. // DEPRECATED: Use LLSD versions of setCommentText() and getSelectedValue().
  185. // "StringUUID" interface: use this when you're creating a list that contains non-unique strings each of which
  186. // has an associated, unique UUID, and only one of which can be selected at a time.
  187. LLScrollListItem* addStringUUIDItem(const std::string& item_text, const LLUUID& id, EAddPosition pos = ADD_BOTTOM, BOOL enabled = TRUE);
  188. LLUUID getStringUUIDSelectedItem() const;
  189. LLScrollListItem* getFirstSelected() const;
  190. virtual S32 getFirstSelectedIndex() const;
  191. std::vector<LLScrollListItem*> getAllSelected() const;
  192. LLScrollListItem* getLastSelectedItem() const { return mLastSelected; }
  193. // iterate over all items
  194. LLScrollListItem* getFirstData() const;
  195. LLScrollListItem* getLastData() const;
  196. std::vector<LLScrollListItem*> getAllData() const;
  197. LLScrollListItem* getItem(const LLSD& sd) const;
  198. void setAllowMultipleSelection(BOOL mult ) { mAllowMultipleSelection = mult; }
  199. void setBgWriteableColor(const LLColor4 &c) { mBgWriteableColor = c; }
  200. void setReadOnlyBgColor(const LLColor4 &c) { mBgReadOnlyColor = c; }
  201. void setBgSelectedColor(const LLColor4 &c) { mBgSelectedColor = c; }
  202. void setBgStripeColor(const LLColor4& c) { mBgStripeColor = c; }
  203. void setFgSelectedColor(const LLColor4 &c) { mFgSelectedColor = c; }
  204. void setFgUnselectedColor(const LLColor4 &c){ mFgUnselectedColor = c; }
  205. void setHoveredColor(const LLColor4 &c) { mHoveredColor = c; }
  206. void setHighlightedColor(const LLColor4 &c) { mHighlightedColor = c; }
  207. void setFgDisableColor(const LLColor4 &c) { mFgDisabledColor = c; }
  208. void setBackgroundVisible(BOOL b) { mBackgroundVisible = b; }
  209. void setDrawStripes(BOOL b) { mDrawStripes = b; }
  210. void setColumnPadding(const S32 c)          { mColumnPadding = c; }
  211. S32  getColumnPadding() { return mColumnPadding; }
  212. void setCommitOnKeyboardMovement(BOOL b) { mCommitOnKeyboardMovement = b; }
  213. void setCommitOnSelectionChange(BOOL b) { mCommitOnSelectionChange = b; }
  214. void setAllowKeyboardMovement(BOOL b) { mAllowKeyboardMovement = b; }
  215. void setMaxSelectable(U32 max_selected) { mMaxSelectable = max_selected; }
  216. S32 getMaxSelectable() { return mMaxSelectable; }
  217. virtual S32 getScrollPos() const;
  218. virtual void setScrollPos( S32 pos );
  219. S32 getSearchColumn();
  220. void setSearchColumn(S32 column) { mSearchColumn = column; }
  221. S32 getColumnIndexFromOffset(S32 x);
  222. S32 getColumnOffsetFromIndex(S32 index);
  223. S32 getRowOffsetFromIndex(S32 index);
  224. void clearSearchString() { mSearchString.clear(); }
  225. // support right-click context menus for avatar/group lists
  226. enum ContextMenuType { MENU_NONE, MENU_AVATAR, MENU_GROUP };
  227. void setContextMenu(const ContextMenuType &menu) { mContextMenuType = menu; }
  228. // Overridden from LLView
  229. /*virtual*/ void    draw();
  230. /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
  231. /*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask);
  232. /*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
  233. /*virtual*/ BOOL handleDoubleClick(S32 x, S32 y, MASK mask);
  234. /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);
  235. /*virtual*/ BOOL handleKeyHere(KEY key, MASK mask);
  236. /*virtual*/ BOOL handleUnicodeCharHere(llwchar uni_char);
  237. /*virtual*/ BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);
  238. /*virtual*/ BOOL handleToolTip(S32 x, S32 y, MASK mask);
  239. /*virtual*/ void setEnabled(BOOL enabled);
  240. /*virtual*/ void setFocus( BOOL b );
  241. /*virtual*/ void onFocusReceived();
  242. /*virtual*/ void onFocusLost();
  243. /*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask);
  244. /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
  245. virtual BOOL isDirty() const;
  246. virtual void resetDirty(); // Clear dirty state
  247. virtual void updateLayout();
  248. virtual void fitContents(S32 max_width, S32 max_height);
  249. virtual LLRect getRequiredRect();
  250. static  BOOL    rowPreceeds(LLScrollListItem *new_row, LLScrollListItem *test_row);
  251. LLRect getItemListRect() { return mItemListRect; }
  252. /// Returns rect, in local coords, of a given row/column
  253. LLRect getCellRect(S32 row_index, S32 column_index);
  254. // Used "internally" by the scroll bar.
  255. void onScrollChange( S32 new_pos, LLScrollbar* src );
  256. static void onClickColumn(void *userdata);
  257. virtual void updateColumns();
  258. void calcColumnWidths();
  259. S32 getMaxContentWidth() { return mMaxContentWidth; }
  260. void setHeadingHeight(S32 heading_height);
  261. /**
  262.  * Sets  max visible  lines without scroolbar, if this value equals to 0,
  263.  * then display all items.
  264.  */
  265. void setPageLines(S32 page_lines );
  266. void setCollapseEmptyColumns(BOOL collapse);
  267. LLScrollListItem* hitItem(S32 x,S32 y);
  268. virtual void scrollToShowSelected();
  269. // LLEditMenuHandler functions
  270. virtual void copy();
  271. virtual BOOL canCopy() const;
  272. virtual void cut();
  273. virtual BOOL canCut() const;
  274. virtual void selectAll();
  275. virtual BOOL canSelectAll() const;
  276. virtual void deselect();
  277. virtual BOOL canDeselect() const;
  278. void setNumDynamicColumns(S32 num) { mNumDynamicWidthColumns = num; }
  279. void updateStaticColumnWidth(LLScrollListColumn* col, S32 new_width);
  280. S32 getTotalStaticColumnWidth() { return mTotalStaticColumnWidth; }
  281. std::string     getSortColumnName();
  282. BOOL getSortAscending() { return mSortColumns.empty() ? TRUE : mSortColumns.back().second; }
  283. BOOL hasSortOrder() const;
  284. S32 selectMultiple( std::vector<LLUUID> ids );
  285. // conceptually const, but mutates mItemList
  286. void updateSort() const;
  287. // sorts a list without affecting the permanent sort order (so further list insertions can be unsorted, for example)
  288. void sortOnce(S32 column, BOOL ascending);
  289. // manually call this whenever editing list items in place to flag need for resorting
  290. void setNeedsSort(bool val = true) { mSorted = !val; }
  291. void dirtyColumns(); // some operation has potentially affected column layout or ordering
  292. protected:
  293. // "Full" interface: use this when you're creating a list that has one or more of the following:
  294. // * contains icons
  295. // * contains multiple columns
  296. // * allows multiple selection
  297. // * has items that are not guarenteed to have unique names
  298. // * has additional per-item data (e.g. a UUID or void* userdata)
  299. //
  300. // To add items using this approach, create new LLScrollListItems and LLScrollListCells.  Add the
  301. // cells (column entries) to each item, and add the item to the LLScrollListCtrl.
  302. //
  303. // The LLScrollListCtrl owns its items and is responsible for deleting them
  304. // (except in the case that the addItem() call fails, in which case it is up
  305. // to the caller to delete the item)
  306. //
  307. // returns FALSE if item faile to be added to list, does NOT delete 'item'
  308. BOOL addItem( LLScrollListItem* item, EAddPosition pos = ADD_BOTTOM, BOOL requires_column = TRUE );
  309. typedef std::deque<LLScrollListItem *> item_list;
  310. item_list& getItemList() { return mItemList; }
  311. void updateLineHeight();
  312. private:
  313. void selectPrevItem(BOOL extend_selection);
  314. void selectNextItem(BOOL extend_selection);
  315. void drawItems();
  316. void            updateLineHeightInsert(LLScrollListItem* item);
  317. void reportInvalidInput();
  318. BOOL isRepeatedChars(const LLWString& string) const;
  319. void selectItem(LLScrollListItem* itemp, BOOL single_select = TRUE);
  320. void deselectItem(LLScrollListItem* itemp);
  321. void commitIfChanged();
  322. BOOL setSort(S32 column, BOOL ascending);
  323. S32 getLinesPerPage();
  324. static void showNameDetails(std::string id, bool is_group);
  325. static void copyNameToClipboard(std::string id, bool is_group);
  326. static void copySLURLToClipboard(std::string id, bool is_group);
  327. S32 mLineHeight; // the max height of a single line
  328. S32 mScrollLines; // how many lines we've scrolled down
  329. S32 mPageLines; // max number of lines is it possible to see on the screen given mRect and mLineHeight
  330. S32 mHeadingHeight; // the height of the column header buttons, if visible
  331. U32 mMaxSelectable; 
  332. LLScrollbar* mScrollbar;
  333. BOOL  mAllowMultipleSelection;
  334. BOOL mAllowKeyboardMovement;
  335. BOOL mCommitOnKeyboardMovement;
  336. BOOL mCommitOnSelectionChange;
  337. BOOL mSelectionChanged;
  338. BOOL mNeedsScroll;
  339. BOOL mCanSelect;
  340. const BOOL mDisplayColumnHeaders;
  341. BOOL mColumnsDirty;
  342. mutable item_list mItemList;
  343. LLScrollListItem *mLastSelected;
  344. S32 mMaxItemCount; 
  345. LLRect mItemListRect;
  346. S32 mMaxContentWidth;
  347. S32             mColumnPadding;
  348. BOOL mBackgroundVisible;
  349. BOOL mDrawStripes;
  350. LLUIColor mBgWriteableColor;
  351. LLUIColor mBgReadOnlyColor;
  352. LLUIColor mBgSelectedColor;
  353. LLUIColor mBgStripeColor;
  354. LLUIColor mFgSelectedColor;
  355. LLUIColor mFgUnselectedColor;
  356. LLUIColor mFgDisabledColor;
  357. LLUIColor mHoveredColor;
  358. LLUIColor mHighlightedColor;
  359. S32 mBorderThickness;
  360. callback_t mOnDoubleClickCallback;
  361. callback_t  mOnMaximumSelectCallback;
  362. callback_t  mOnSortChangedCallback;
  363. S32 mHighlightedItem;
  364. class LLViewBorder* mBorder;
  365. LLContextMenu *mPopupMenu;
  366. LLWString mSearchString;
  367. LLFrameTimer mSearchTimer;
  368. S32 mSearchColumn;
  369. S32 mNumDynamicWidthColumns;
  370. S32 mTotalStaticColumnWidth;
  371. S32 mTotalColumnPadding;
  372. mutable bool mSorted;
  373. typedef std::map<std::string, LLScrollListColumn> column_map_t;
  374. column_map_t mColumns;
  375. BOOL mDirty;
  376. S32 mOriginalSelection;
  377. ContextMenuType mContextMenuType;
  378. typedef std::vector<LLScrollListColumn*> ordered_columns_t;
  379. ordered_columns_t mColumnsIndexed;
  380. typedef std::pair<S32, BOOL> sort_column_t;
  381. std::vector<sort_column_t> mSortColumns;
  382. }; // end class LLScrollListCtrl
  383. #endif  // LL_SCROLLLISTCTRL_H