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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llview.h
  3.  * @brief Container for other views, anything that draws.
  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. #ifndef LL_LLVIEW_H
  33. #define LL_LLVIEW_H
  34. // A view is an area in a window that can draw.  It might represent
  35. // the HUD or a dialog box or a button.  It can also contain sub-views
  36. // and child widgets
  37. #include "stdtypes.h"
  38. #include "llcoord.h"
  39. #include "llfontgl.h"
  40. #include "llmortician.h"
  41. #include "llmousehandler.h"
  42. #include "llstring.h"
  43. #include "llrect.h"
  44. #include "llui.h"
  45. #include "lluistring.h"
  46. #include "llviewquery.h"
  47. #include "stdenums.h"
  48. #include "lluistring.h"
  49. #include "llcursortypes.h"
  50. #include "lluictrlfactory.h"
  51. #include "lltreeiterators.h"
  52. #include "llfocusmgr.h"
  53. #include <list>
  54. class LLSD;
  55. const U32 FOLLOWS_NONE = 0x00;
  56. const U32 FOLLOWS_LEFT = 0x01;
  57. const U32 FOLLOWS_RIGHT = 0x02;
  58. const U32 FOLLOWS_TOP = 0x10;
  59. const U32 FOLLOWS_BOTTOM = 0x20;
  60. const U32 FOLLOWS_ALL = 0x33;
  61. const BOOL MOUSE_OPAQUE = TRUE;
  62. const BOOL NOT_MOUSE_OPAQUE = FALSE;
  63. const U32 GL_NAME_UI_RESERVED = 2;
  64. // maintains render state during traversal of UI tree
  65. class LLViewDrawContext
  66. {
  67. public:
  68. F32 mAlpha;
  69. LLViewDrawContext(F32 alpha = 1.f)
  70. : mAlpha(alpha)
  71. {
  72. if (!sDrawContextStack.empty())
  73. {
  74. LLViewDrawContext* context_top = sDrawContextStack.back();
  75. // merge with top of stack
  76. mAlpha *= context_top->mAlpha;
  77. }
  78. sDrawContextStack.push_back(this);
  79. }
  80. ~LLViewDrawContext()
  81. {
  82. sDrawContextStack.pop_back();
  83. }
  84. static const LLViewDrawContext& getCurrentContext();
  85. private:
  86. static std::vector<LLViewDrawContext*> sDrawContextStack;
  87. };
  88. class LLViewWidgetRegistry : public LLChildRegistry<LLViewWidgetRegistry>
  89. {};
  90. class LLView : public LLMouseHandler, public LLMortician, public LLFocusableElement
  91. {
  92. public:
  93. struct Follows : public LLInitParam::Choice<Follows>
  94. {
  95. Alternative<std::string> string;
  96. Alternative<U32> flags;
  97.         Follows();
  98. };
  99. struct Params : public LLInitParam::Block<Params>
  100. {
  101. Mandatory<std::string> name;
  102. Optional<bool> enabled,
  103. visible,
  104. mouse_opaque,
  105. use_bounding_rect,
  106. from_xui;
  107. Optional<S32> tab_group,
  108. default_tab_group;
  109. Optional<std::string> tool_tip;
  110. Optional<S32> sound_flags;
  111. Optional<Follows> follows;
  112. Optional<std::string> hover_cursor;
  113. Optional<std::string> layout;
  114. Optional<LLRect> rect;
  115. // Historical bottom-left layout used bottom_delta and left_delta
  116. // for relative positioning.  New layout "topleft" prefers specifying
  117. // based on top edge.
  118. Optional<S32> bottom_delta, // deprecated
  119. top_pad, // from last bottom to my top
  120. top_delta, // from last top to my top
  121. left_pad, // from last right to my left
  122. left_delta; // from last left to my left
  123. Optional<bool> center_horiz,
  124. center_vert;
  125. // these are nested attributes for LLLayoutPanel
  126. //FIXME: get parent context involved in parsing traversal
  127. Ignored user_resize,
  128. auto_resize,
  129. needs_translate,
  130. xmlns,
  131. xmlns_xsi,
  132. xsi_schemaLocation,
  133. xsi_type;
  134. Params();
  135. };
  136. typedef LLViewWidgetRegistry child_registry_t;
  137. void initFromParams(const LLView::Params&);
  138. protected:
  139. LLView(const LLView::Params&);
  140. friend class LLUICtrlFactory;
  141. private:
  142. // widgets in general are not copyable
  143. LLView(const LLView& other) {};
  144. public:
  145. #if LL_DEBUG
  146. static BOOL sIsDrawing;
  147. #endif
  148. enum ESoundFlags
  149. {
  150. SILENT = 0,
  151. MOUSE_DOWN = 1,
  152. MOUSE_UP = 2
  153. };
  154. enum ESnapType
  155. {
  156. SNAP_PARENT,
  157. SNAP_SIBLINGS,
  158. SNAP_PARENT_AND_SIBLINGS
  159. };
  160. enum ESnapEdge
  161. {
  162. SNAP_LEFT, 
  163. SNAP_TOP, 
  164. SNAP_RIGHT, 
  165. SNAP_BOTTOM
  166. };
  167. typedef std::list<LLView*> child_list_t;
  168. typedef child_list_t::iterator child_list_iter_t;
  169. typedef child_list_t::const_iterator   child_list_const_iter_t;
  170. typedef child_list_t::reverse_iterator  child_list_reverse_iter_t;
  171. typedef child_list_t::const_reverse_iterator  child_list_const_reverse_iter_t;
  172. typedef std::vector<class LLUICtrl *> ctrl_list_t;
  173. typedef std::pair<S32, S32> tab_order_t;
  174. typedef std::pair<LLUICtrl *, tab_order_t> tab_order_pair_t;
  175. // this structure primarily sorts by the tab group, secondarily by the insertion ordinal (lastly by the value of the pointer)
  176. typedef std::map<const LLUICtrl*, tab_order_t> child_tab_order_t;
  177. typedef child_tab_order_t::iterator child_tab_order_iter_t;
  178. typedef child_tab_order_t::const_iterator child_tab_order_const_iter_t;
  179. typedef child_tab_order_t::reverse_iterator child_tab_order_reverse_iter_t;
  180. typedef child_tab_order_t::const_reverse_iterator child_tab_order_const_reverse_iter_t;
  181. virtual ~LLView();
  182. // Some UI widgets need to be added as controls.  Others need to
  183. // be added as regular view children.  isCtrl should return TRUE
  184. // if a widget needs to be added as a ctrl
  185. virtual BOOL isCtrl() const;
  186. virtual BOOL isPanel() const;
  187. //
  188. // MANIPULATORS
  189. //
  190. void setMouseOpaque( BOOL b ) { mMouseOpaque = b; }
  191. BOOL getMouseOpaque() const { return mMouseOpaque; }
  192. void setToolTip( const LLStringExplicit& msg );
  193. BOOL setToolTipArg( const LLStringExplicit& key, const LLStringExplicit& text );
  194. void setToolTipArgs( const LLStringUtil::format_map_t& args );
  195. virtual void setRect(const LLRect &rect);
  196. void setFollows(U32 flags) { mReshapeFlags = flags; }
  197. // deprecated, use setFollows() with FOLLOWS_LEFT | FOLLOWS_TOP, etc.
  198. void setFollowsNone() { mReshapeFlags = FOLLOWS_NONE; }
  199. void setFollowsLeft() { mReshapeFlags |= FOLLOWS_LEFT; }
  200. void setFollowsTop() { mReshapeFlags |= FOLLOWS_TOP; }
  201. void setFollowsRight() { mReshapeFlags |= FOLLOWS_RIGHT; }
  202. void setFollowsBottom() { mReshapeFlags |= FOLLOWS_BOTTOM; }
  203. void setFollowsAll() { mReshapeFlags |= FOLLOWS_ALL; }
  204. void        setSoundFlags(U8 flags) { mSoundFlags = flags; }
  205. void setName(std::string name) { mName = name; }
  206. void setUseBoundingRect( BOOL use_bounding_rect );
  207. BOOL getUseBoundingRect();
  208. ECursorType getHoverCursor() { return mHoverCursor; }
  209. const std::string& getToolTip() const { return mToolTipMsg.getString(); }
  210. void sendChildToFront(LLView* child);
  211. void sendChildToBack(LLView* child);
  212. void moveChildToFrontOfTabGroup(LLUICtrl* child);
  213. void moveChildToBackOfTabGroup(LLUICtrl* child);
  214. virtual bool addChild(LLView* view, S32 tab_group = 0);
  215. // implemented in terms of addChild()
  216. bool addChildInBack(LLView* view,  S32 tab_group = 0);
  217. // remove the specified child from the view, and set it's parent to NULL.
  218. virtual void removeChild(LLView* view);
  219. virtual BOOL postBuild() { return TRUE; }
  220. child_tab_order_t getCtrlOrder() const { return mCtrlOrder; }
  221. ctrl_list_t getCtrlList() const;
  222. ctrl_list_t getCtrlListSorted() const;
  223. void setDefaultTabGroup(S32 d) { mDefaultTabGroup = d; }
  224. S32 getDefaultTabGroup() const { return mDefaultTabGroup; }
  225. S32 getLastTabGroup() { return mLastTabGroup; }
  226. bool        trueToRoot(const boost::function<bool (const LLView*)>& predicate) const;
  227. BOOL isInVisibleChain() const;
  228. BOOL isInEnabledChain() const;
  229. void setFocusRoot(BOOL b) { mIsFocusRoot = b; }
  230. BOOL isFocusRoot() const { return mIsFocusRoot; }
  231. virtual BOOL canFocusChildren() const;
  232. BOOL focusNextRoot();
  233. BOOL focusPrevRoot();
  234. // delete all children. Override this function if you need to
  235. // perform any extra clean up such as cached pointers to selected
  236. // children, etc.
  237. virtual void deleteAllChildren();
  238. virtual void setTentative(BOOL b);
  239. virtual BOOL getTentative() const;
  240. void  setAllChildrenEnabled(BOOL b);
  241. virtual void setVisible(BOOL visible);
  242. BOOL getVisible() const { return mVisible; }
  243. virtual void setEnabled(BOOL enabled);
  244. BOOL getEnabled() const { return mEnabled; }
  245. /// 'available' in this context means 'visible and enabled': in other
  246. /// words, can a user actually interact with this?
  247. virtual bool isAvailable() const;
  248. /// The static isAvailable() tests an LLView* that could be NULL.
  249. static bool isAvailable(const LLView* view);
  250. U8              getSoundFlags() const       { return mSoundFlags; }
  251. virtual BOOL setLabelArg( const std::string& key, const LLStringExplicit& text );
  252. virtual void handleVisibilityChange ( BOOL new_visibility );
  253. void pushVisible(BOOL visible) { mLastVisible = mVisible; setVisible(visible); }
  254. void popVisible() { setVisible(mLastVisible); }
  255. LLHandle<LLView> getHandle() { mHandle.bind(this); return mHandle; }
  256. U32 getFollows() const { return mReshapeFlags; }
  257. BOOL followsLeft() const { return mReshapeFlags & FOLLOWS_LEFT; }
  258. BOOL followsRight() const { return mReshapeFlags & FOLLOWS_RIGHT; }
  259. BOOL followsTop() const { return mReshapeFlags & FOLLOWS_TOP; }
  260. BOOL followsBottom() const { return mReshapeFlags & FOLLOWS_BOTTOM; }
  261. BOOL followsAll() const { return mReshapeFlags & FOLLOWS_ALL; }
  262. const LLRect& getRect() const { return mRect; }
  263. const LLRect& getBoundingRect() const { return mBoundingRect; }
  264. LLRect getLocalBoundingRect() const;
  265. LLRect calcScreenRect() const;
  266. LLRect calcScreenBoundingRect() const;
  267. LLRect getLocalRect() const;
  268. virtual LLRect getSnapRect() const;
  269. LLRect getLocalSnapRect() const;
  270. std::string getLayout() { return mLayout; }
  271. // Override and return required size for this object. 0 for width/height means don't care.
  272. virtual LLRect getRequiredRect();
  273. LLRect calcBoundingRect();
  274. void updateBoundingRect();
  275. LLView* getRootView();
  276. LLView* getParent() const { return mParentView; }
  277. LLView* getFirstChild() const { return (mChildList.empty()) ? NULL : *(mChildList.begin()); }
  278. LLView* findPrevSibling(LLView* child);
  279. LLView* findNextSibling(LLView* child);
  280. S32 getChildCount() const { return (S32)mChildList.size(); }
  281. template<class _Pr3> void sortChildren(_Pr3 _Pred) { mChildList.sort(_Pred); }
  282. BOOL hasAncestor(const LLView* parentp) const;
  283. BOOL hasChild(const std::string& childname, BOOL recurse = FALSE) const;
  284. BOOL  childHasKeyboardFocus( const std::string& childname ) const;
  285. // these iterators are used for collapsing various tree traversals into for loops
  286. typedef LLTreeDFSIter<LLView, child_list_const_iter_t> tree_iterator_t;
  287. tree_iterator_t beginTreeDFS();
  288. tree_iterator_t endTreeDFS();
  289. typedef LLTreeDFSPostIter<LLView, child_list_const_iter_t> tree_post_iterator_t;
  290. tree_post_iterator_t beginTreeDFSPost();
  291. tree_post_iterator_t endTreeDFSPost();
  292. typedef LLTreeDownIter<LLView> root_to_view_iterator_t;
  293. root_to_view_iterator_t beginRootToView();
  294. root_to_view_iterator_t endRootToView();
  295. //
  296. // UTILITIES
  297. //
  298. // Default behavior is to use reshape flags to resize child views
  299. virtual void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
  300. virtual void translate( S32 x, S32 y );
  301. void setOrigin( S32 x, S32 y ) { mRect.translate( x - mRect.mLeft, y - mRect.mBottom ); }
  302. BOOL translateIntoRect( const LLRect& constraint, BOOL allow_partial_outside );
  303. BOOL translateIntoRectWithExclusion( const LLRect& inside, const LLRect& exclude, BOOL allow_partial_outside );
  304. void centerWithin(const LLRect& bounds);
  305. void setShape(const LLRect& new_rect, bool by_user = false);
  306. virtual LLView* findSnapRect(LLRect& new_rect, const LLCoordGL& mouse_dir, LLView::ESnapType snap_type, S32 threshold, S32 padding = 0);
  307. virtual LLView* findSnapEdge(S32& new_edge_val, const LLCoordGL& mouse_dir, ESnapEdge snap_edge, ESnapType snap_type, S32 threshold, S32 padding = 0);
  308. virtual BOOL canSnapTo(const LLView* other_view);
  309. virtual void setSnappedTo(const LLView* snap_view);
  310. // inherited from LLFocusableElement
  311. /* virtual */ BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent);
  312. /* virtual */ BOOL handleUnicodeChar(llwchar uni_char, BOOL called_from_parent);
  313. virtual BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
  314.   EDragAndDropType cargo_type,
  315.   void* cargo_data,
  316.   EAcceptance* accept,
  317.   std::string& tooltip_msg);
  318. virtual void draw();
  319. void parseFollowsFlags(const LLView::Params& params);
  320. // Some widgets, like close box buttons, don't need to be saved
  321. BOOL getFromXUI() const { return mFromXUI; }
  322. void setFromXUI(BOOL b) { mFromXUI = b; }
  323. typedef enum e_hit_test_type
  324. {
  325. HIT_TEST_USE_BOUNDING_RECT,
  326. HIT_TEST_IGNORE_BOUNDING_RECT
  327. }EHitTestType;
  328. BOOL parentPointInView(S32 x, S32 y, EHitTestType type = HIT_TEST_USE_BOUNDING_RECT) const;
  329. BOOL pointInView(S32 x, S32 y, EHitTestType type = HIT_TEST_USE_BOUNDING_RECT) const;
  330. BOOL blockMouseEvent(S32 x, S32 y) const;
  331. // See LLMouseHandler virtuals for screenPointToLocal and localPointToScreen
  332. BOOL localPointToOtherView( S32 x, S32 y, S32 *other_x, S32 *other_y, LLView* other_view) const;
  333. BOOL localRectToOtherView( const LLRect& local, LLRect* other, LLView* other_view ) const;
  334. void screenRectToLocal( const LLRect& screen, LLRect* local ) const;
  335. void localRectToScreen( const LLRect& local, LLRect* screen ) const;
  336. LLControlVariable *findControl(const std::string& name);
  337.     // Moved setValue(), getValue(), setControlValue(), setControlName(),
  338.     // controlListener() to LLUICtrl because an LLView is NOT assumed to
  339.     // contain a value. If that's what you want, use LLUICtrl instead.
  340. // virtual bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata);
  341. const child_list_t* getChildList() const { return &mChildList; }
  342. const child_list_const_iter_t beginChild()  { return mChildList.begin(); }
  343. const child_list_const_iter_t endChild()  { return mChildList.end(); }
  344. // LLMouseHandler functions
  345. //  Default behavior is to pass events to children
  346. /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);
  347. /*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask);
  348. /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
  349. /*virtual*/ BOOL handleMiddleMouseUp(S32 x, S32 y, MASK mask);
  350. /*virtual*/ BOOL handleMiddleMouseDown(S32 x, S32 y, MASK mask);
  351. /*virtual*/ BOOL handleDoubleClick(S32 x, S32 y, MASK mask);
  352. /*virtual*/ BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);
  353. /*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
  354. /*virtual*/ BOOL handleRightMouseUp(S32 x, S32 y, MASK mask);
  355. /*virtual*/ BOOL handleToolTip(S32 x, S32 y, MASK mask);
  356. /*virtual*/ std::string getName() const;
  357. /*virtual*/ void onMouseCaptureLost();
  358. /*virtual*/ BOOL hasMouseCapture();
  359. /*virtual*/ void screenPointToLocal(S32 screen_x, S32 screen_y, S32* local_x, S32* local_y) const;
  360. /*virtual*/ void localPointToScreen(S32 local_x, S32 local_y, S32* screen_x, S32* screen_y) const;
  361. virtual LLView* childFromPoint(S32 x, S32 y);
  362. // view-specific handlers 
  363. virtual void onMouseEnter(S32 x, S32 y, MASK mask);
  364. virtual void onMouseLeave(S32 x, S32 y, MASK mask);
  365. template <class T> T* findChild(const std::string& name, BOOL recurse = TRUE) const
  366. {
  367. LLView* child = findChildView(name, recurse);
  368. T* result = dynamic_cast<T*>(child);
  369. return result;
  370. }
  371. template <class T> T* getChild(const std::string& name, BOOL recurse = TRUE) const;
  372. template <class T> T& getChildRef(const std::string& name, BOOL recurse = TRUE) const
  373. {
  374. return *getChild<T>(name, recurse);
  375. }
  376. virtual LLView* getChildView(const std::string& name, BOOL recurse = TRUE) const;
  377. virtual LLView* findChildView(const std::string& name, BOOL recurse = TRUE) const;
  378. template <class T> T* getDefaultWidget(const std::string& name) const
  379. {
  380. default_widget_map_t::const_iterator found_it = getDefaultWidgetMap().find(name);
  381. if (found_it == getDefaultWidgetMap().end())
  382. {
  383. return NULL;
  384. }
  385. return dynamic_cast<T*>(found_it->second);
  386. }
  387. //////////////////////////////////////////////
  388. // statics
  389. //////////////////////////////////////////////
  390. //static LLFontGL::HAlign selectFontHAlign(LLXMLNodePtr node);
  391. // focuses the item in the list after the currently-focused item, wrapping if necessary
  392. static BOOL focusNext(LLView::child_list_t & result);
  393. // focuses the item in the list before the currently-focused item, wrapping if necessary
  394. static BOOL focusPrev(LLView::child_list_t & result);
  395. // returns query for iterating over controls in tab order
  396. static const LLCtrlQuery & getTabOrderQuery();
  397. // return query for iterating over focus roots in tab order
  398. static const LLCtrlQuery & getFocusRootsQuery();
  399. static void deleteViewByHandle(LLHandle<LLView> handle);
  400. static LLWindow* getWindow(void) { return LLUI::sWindow; }
  401. // Set up params after XML load before calling new(),
  402. // usually to adjust layout.
  403. static void applyXUILayout(Params& p, LLView* parent);
  404. // For re-export of floaters and panels, convert the coordinate system
  405. // to be top-left based.
  406. static void setupParamsForExport(Params& p, LLView* parent);
  407. //virtual BOOL addChildFromParam(const LLInitParam::BaseBlock& params) { return TRUE; }
  408. virtual BOOL handleKeyHere(KEY key, MASK mask);
  409. virtual BOOL handleUnicodeCharHere(llwchar uni_char);
  410. virtual void handleReshape(const LLRect& rect, bool by_user);
  411. virtual void dirtyRect();
  412. //send custom notification to LLView parent
  413. virtual S32 notifyParent(const LLSD& info);
  414. //send custom notification to all view childrend
  415. // return true if _any_ children return true. otherwise false.
  416. virtual bool notifyChildren(const LLSD& info);
  417. //send custom notification to current view
  418. virtual S32 notify(const LLSD& info) { return 0;};
  419. static const LLViewDrawContext& getDrawContext();
  420. protected:
  421. void drawDebugRect();
  422. void drawChild(LLView* childp, S32 x_offset = 0, S32 y_offset = 0, BOOL force_draw = FALSE);
  423. void drawChildren();
  424. LLView* childrenHandleKey(KEY key, MASK mask);
  425. LLView* childrenHandleUnicodeChar(llwchar uni_char);
  426. LLView* childrenHandleDragAndDrop(S32 x, S32 y, MASK mask,
  427.   BOOL drop,
  428.   EDragAndDropType type,
  429.   void* data,
  430.   EAcceptance* accept,
  431.   std::string& tooltip_msg);
  432. LLView* childrenHandleHover(S32 x, S32 y, MASK mask);
  433. LLView* childrenHandleMouseUp(S32 x, S32 y, MASK mask);
  434. LLView* childrenHandleMouseDown(S32 x, S32 y, MASK mask);
  435. LLView* childrenHandleMiddleMouseUp(S32 x, S32 y, MASK mask);
  436. LLView* childrenHandleMiddleMouseDown(S32 x, S32 y, MASK mask);
  437. LLView* childrenHandleDoubleClick(S32 x, S32 y, MASK mask);
  438. LLView* childrenHandleScrollWheel(S32 x, S32 y, S32 clicks);
  439. LLView* childrenHandleRightMouseDown(S32 x, S32 y, MASK mask);
  440. LLView* childrenHandleRightMouseUp(S32 x, S32 y, MASK mask);
  441. LLView* childrenHandleToolTip(S32 x, S32 y, MASK mask);
  442. ECursorType mHoverCursor;
  443. private:
  444. LLView* mParentView;
  445. child_list_t mChildList;
  446. std::string mName;
  447. // location in pixels, relative to surrounding structure, bottom,left=0,0
  448. LLRect mRect;
  449. LLRect mBoundingRect;
  450. std::string mLayout;
  451. U32 mReshapeFlags;
  452. child_tab_order_t mCtrlOrder;
  453. S32 mDefaultTabGroup;
  454. S32 mLastTabGroup;
  455. BOOL mEnabled; // Enabled means "accepts input that has an effect on the state of the application."
  456. // A disabled view, for example, may still have a scrollbar that responds to mouse events.
  457. BOOL mMouseOpaque; // Opaque views handle all mouse events that are over their rect.
  458. LLUIString mToolTipMsg; // isNull() is true if none.
  459. U8          mSoundFlags;
  460. BOOL mFromXUI;
  461. BOOL mIsFocusRoot;
  462. BOOL mUseBoundingRect; // hit test against bounding rectangle that includes all child elements
  463. LLRootHandle<LLView> mHandle;
  464. BOOL mLastVisible;
  465. BOOL mVisible;
  466. S32 mNextInsertionOrdinal;
  467. static LLWindow* sWindow; // All root views must know about their window.
  468. typedef std::map<std::string, LLView*> default_widget_map_t;
  469. // allocate this map no demand, as it is rarely needed
  470. mutable default_widget_map_t* mDefaultWidgets;
  471. default_widget_map_t& getDefaultWidgetMap() const;
  472. public:
  473. // Depth in view hierarchy during rendering
  474. static S32 sDepth;
  475. // Draw debug rectangles around widgets to help with alignment and spacing
  476. static bool sDebugRects;
  477. // Draw widget names and sizes when drawing debug rectangles, turning this
  478. // off is useful to make the rectangles themselves easier to see.
  479. static bool sDebugRectsShowNames;
  480. static bool sDebugKeys;
  481. static bool sDebugMouseHandling;
  482. static std::string sMouseHandlerMessage;
  483. static S32 sSelectID;
  484. static std::set<LLView*> sPreviewHighlightedElements; // DEV-16869
  485. static BOOL sHighlightingDiffs; // DEV-16869
  486. static LLView* sPreviewClickedElement; // DEV-16869
  487. static BOOL sDrawPreviewHighlights;
  488. static S32 sLastLeftXML;
  489. static S32 sLastBottomXML;
  490. static BOOL sForceReshape;
  491. };
  492. class LLCompareByTabOrder
  493. {
  494. public:
  495. LLCompareByTabOrder(LLView::child_tab_order_t order) : mTabOrder(order) {}
  496. virtual ~LLCompareByTabOrder() {}
  497. bool operator() (const LLView* const a, const LLView* const b) const;
  498. private:
  499. virtual bool compareTabOrders(const LLView::tab_order_t & a, const LLView::tab_order_t & b) const { return a < b; }
  500. LLView::child_tab_order_t mTabOrder;
  501. };
  502. template <class T> T* LLView::getChild(const std::string& name, BOOL recurse) const
  503. {
  504. LLView* child = findChildView(name, recurse);
  505. T* result = dynamic_cast<T*>(child);
  506. if (!result)
  507. {
  508. // did we find *something* with that name?
  509. if (child)
  510. {
  511. llwarns << "Found child named " << name << " but of wrong type " << typeid(*child).name() << ", expecting " << typeid(T*).name() << llendl;
  512. }
  513. result = getDefaultWidget<T>(name);
  514. if (!result)
  515. {
  516. result = LLUICtrlFactory::getDefaultWidget<T>(name);
  517. if (result)
  518. {
  519. // *NOTE: You cannot call mFoo = getChild<LLFoo>("bar")
  520. // in a floater or panel constructor.  The widgets will not
  521. // be ready.  Instead, put it in postBuild().
  522. llwarns << "Making dummy " << typeid(T).name() << " named "" << name << "" in " << getName() << llendl;
  523. }
  524. else
  525. {
  526. llwarns << "Failed to create dummy " << typeid(T).name() << llendl;
  527. return NULL;
  528. }
  529. getDefaultWidgetMap()[name] = result;
  530. }
  531. }
  532. return result;
  533. }
  534. // Compiler optimization - don't generate these specializations inline,
  535. // require explicit specialization.  See llbutton.cpp for an example.
  536. #ifndef LLVIEW_CPP
  537. extern template class LLView* LLView::getChild<class LLView>(
  538. const std::string& name, BOOL recurse) const;
  539. #endif
  540. #endif //LL_LLVIEW_H