llview.h

Go to the documentation of this file.
00001 
00032 #ifndef LL_LLVIEW_H
00033 #define LL_LLVIEW_H
00034 
00035 // A view is an area in a window that can draw.  It might represent
00036 // the HUD or a dialog box or a button.  It can also contain sub-views
00037 // and child widgets
00038 
00039 #include "llcoord.h"
00040 #include "llfontgl.h"
00041 #include "llmortician.h"
00042 #include "llmousehandler.h"
00043 #include "llnametable.h"
00044 #include "llsd.h"
00045 #include "llstring.h"
00046 #include "llrect.h"
00047 #include "llui.h"
00048 #include "lluixmltags.h"
00049 #include "llviewquery.h"
00050 #include "llxmlnode.h"
00051 #include "stdenums.h"
00052 
00053 class LLColor4;
00054 class LLWindow;
00055 class LLUICtrl;
00056 class LLScrollListItem;
00057 
00058 const U32       FOLLOWS_NONE    = 0x00;
00059 const U32       FOLLOWS_LEFT    = 0x01;
00060 const U32       FOLLOWS_RIGHT   = 0x02;
00061 const U32       FOLLOWS_TOP             = 0x10;
00062 const U32       FOLLOWS_BOTTOM  = 0x20;
00063 const U32       FOLLOWS_ALL             = 0x33;
00064 
00065 const BOOL      MOUSE_OPAQUE = TRUE;
00066 const BOOL      NOT_MOUSE_OPAQUE = FALSE;
00067 
00068 const U32 GL_NAME_UI_RESERVED = 2;
00069 
00070 class LLSimpleListener;
00071 class LLEventDispatcher;
00072 
00073 class LLViewHandle
00074 {
00075 public:
00076         LLViewHandle() { mID = 0; } 
00077 
00078         void init() { mID = ++sNextID; }
00079         void markDead() { mID = 0; }
00080         BOOL isDead() { return (mID == 0); }
00081         friend bool operator==(const LLViewHandle& lhs, const LLViewHandle& rhs);
00082         friend bool operator!=(const LLViewHandle& lhs, const LLViewHandle& rhs);
00083         friend bool     operator<(const LLViewHandle &a, const LLViewHandle &b);
00084 
00085 public:
00086         static LLViewHandle sDeadHandle;
00087 
00088 protected:
00089         S32             mID;
00090 
00091         static S32 sNextID;
00092 };
00093 
00094 class LLView : public LLMouseHandler, public LLMortician, public LLSimpleListenerObservable
00095 {
00096 
00097 public:
00098 #if LL_DEBUG
00099         static BOOL sIsDrawing;
00100 #endif
00101         enum ESoundFlags
00102         {
00103                 SILENT = 0,
00104                 MOUSE_DOWN = 1,
00105                 MOUSE_UP = 2
00106         };
00107 
00108         enum ESnapType
00109         {
00110                 SNAP_PARENT,
00111                 SNAP_SIBLINGS,
00112                 SNAP_PARENT_AND_SIBLINGS
00113         };
00114 
00115         enum ESnapEdge
00116         {
00117                 SNAP_LEFT, 
00118                 SNAP_TOP, 
00119                 SNAP_RIGHT, 
00120                 SNAP_BOTTOM
00121         };
00122 
00123         typedef std::list<LLView*> child_list_t;
00124         typedef child_list_t::iterator                                  child_list_iter_t;
00125         typedef child_list_t::const_iterator                    child_list_const_iter_t;
00126         typedef child_list_t::reverse_iterator                  child_list_reverse_iter_t;
00127         typedef child_list_t::const_reverse_iterator    child_list_const_reverse_iter_t;
00128 
00129         typedef std::vector<LLUICtrl *>                                 ctrl_list_t;
00130 
00131         typedef std::pair<S32, S32>                                                     tab_order_t;
00132         typedef std::pair<LLUICtrl *, tab_order_t>                      tab_order_pair_t;
00133         // this structure primarily sorts by the tab group, secondarily by the insertion ordinal (lastly by the value of the pointer)
00134         typedef std::map<const LLUICtrl*, tab_order_t>          child_tab_order_t;
00135         typedef child_tab_order_t::iterator                                     child_tab_order_iter_t;
00136         typedef child_tab_order_t::const_iterator                       child_tab_order_const_iter_t;
00137         typedef child_tab_order_t::reverse_iterator                     child_tab_order_reverse_iter_t;
00138         typedef child_tab_order_t::const_reverse_iterator       child_tab_order_const_reverse_iter_t;
00139 
00140 private:
00141         LLView*         mParentView;
00142         child_list_t mChildList;
00143 
00144 protected:
00145         LLString        mName;
00146         // location in pixels, relative to surrounding structure, bottom,left=0,0
00147         LLRect          mRect;
00148         
00149         U32                     mReshapeFlags;
00150 
00151         child_tab_order_t mCtrlOrder;
00152         S32                     mDefaultTabGroup;
00153 
00154         BOOL            mEnabled;               // Enabled means "accepts input that has an effect on the state of the application."
00155                                                                 // A disabled view, for example, may still have a scrollbar that responds to mouse events.
00156         BOOL            mMouseOpaque;   // Opaque views handle all mouse events that are over their rect.
00157         LLString        mToolTipMsg;    // isNull() is true if none.
00158 
00159         U8          mSoundFlags;
00160         BOOL            mSaveToXML;
00161 
00162         BOOL            mIsFocusRoot;
00163 
00164 public:
00165         LLViewHandle mViewHandle;
00166         BOOL            mLastVisible;
00167         BOOL            mSpanChildren;
00168 
00169 private:
00170         BOOL            mVisible;
00171         BOOL            mHidden;                // Never show (generally for replacement text only)
00172 
00173         S32                     mNextInsertionOrdinal;
00174 
00175 protected:
00176         static LLWindow* sWindow;       // All root views must know about their window.
00177 
00178 public:
00179         static BOOL     sDebugRects;    // Draw debug rects behind everything.
00180         static BOOL sDebugKeys;
00181         static S32      sDepth;
00182         static BOOL sDebugMouseHandling;
00183         static LLString sMouseHandlerMessage;
00184         static S32      sSelectID;
00185         static BOOL sEditingUI;
00186         static LLView* sEditingUIView;
00187         static S32 sLastLeftXML;
00188         static S32 sLastBottomXML;
00189         static std::map<LLViewHandle,LLView*> sViewHandleMap;
00190         static BOOL sForceReshape;
00191 
00192 public:
00193         static LLView* getViewByHandle(LLViewHandle handle);
00194         static BOOL deleteViewByHandle(LLViewHandle handle);
00195         
00196 public:
00197         LLView();
00198         LLView(const LLString& name, BOOL mouse_opaque);
00199         LLView(const LLString& name, const LLRect& rect, BOOL mouse_opaque, U32 follows=FOLLOWS_NONE);
00200 
00201         virtual ~LLView();
00202 
00203         // Hack to support LLFocusMgr
00204         virtual BOOL isView();
00205 
00206         // Some UI widgets need to be added as controls.  Others need to
00207         // be added as regular view children.  isCtrl should return TRUE
00208         // if a widget needs to be added as a ctrl
00209         virtual BOOL isCtrl() const;
00210 
00211         virtual BOOL isPanel();
00212         
00213         //
00214         // MANIPULATORS
00215         //
00216         void            setMouseOpaque( BOOL b );
00217         void            setToolTip( const LLString& msg );
00218 
00219         virtual void setRect(const LLRect &rect);
00220         void            setFollows(U32 flags);
00221 
00222         // deprecated, use setFollows() with FOLLOWS_LEFT | FOLLOWS_TOP, etc.
00223         void            setFollowsNone();
00224         void            setFollowsLeft();
00225         void            setFollowsTop();
00226         void            setFollowsRight();
00227         void            setFollowsBottom();
00228         void            setFollowsAll();
00229 
00230         void        setSoundFlags(U8 flags);
00231         void            setName(LLString name);
00232         void            setSpanChildren( BOOL span_children );
00233 
00234         const LLString& getToolTip();
00235 
00236         void            sendChildToFront(LLView* child);
00237         void            sendChildToBack(LLView* child);
00238         void            moveChildToFrontOfTabGroup(LLUICtrl* child);
00239 
00240         void            addChild(LLView* view, S32 tab_group = 0);
00241         void            addChildAtEnd(LLView* view,  S32 tab_group = 0);
00242         // remove the specified child from the view, and set it's parent to NULL.
00243         void            removeChild(LLView* view, BOOL deleteIt = FALSE);
00244 
00245         virtual void    addCtrl( LLUICtrl* ctrl, S32 tab_group);
00246         virtual void    addCtrlAtEnd( LLUICtrl* ctrl, S32 tab_group);
00247         virtual void    removeCtrl( LLUICtrl* ctrl);
00248 
00249         child_tab_order_t getCtrlOrder() const { return mCtrlOrder; }
00250         ctrl_list_t getCtrlList() const;
00251         ctrl_list_t getCtrlListSorted() const;
00252         S32 getDefaultTabGroup() const;
00253 
00254         BOOL            isInVisibleChain() const;
00255         BOOL            isInEnabledChain() const;
00256 
00257         BOOL            isFocusRoot() const;
00258         LLView*         findRootMostFocusRoot();
00259         virtual BOOL canFocusChildren() const;
00260 
00261         class LLFocusRootsFilter : public LLQueryFilter, public LLSingleton<LLFocusRootsFilter>
00262         {
00263                 /*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const 
00264                 {
00265                         return filterResult_t(view->isCtrl() && view->isFocusRoot(), !view->isFocusRoot());
00266                 }
00267         };
00268 
00269         virtual  BOOL focusNextRoot();
00270         virtual  BOOL focusPrevRoot();
00271 
00272         virtual BOOL focusNextItem(BOOL text_entry_only);
00273         virtual BOOL focusPrevItem(BOOL text_entry_only);
00274         virtual BOOL focusFirstItem(BOOL prefer_text_fields = FALSE );
00275         virtual BOOL focusLastItem(BOOL prefer_text_fields = FALSE);
00276 
00277         // delete all children. Override this function if you need to
00278         // perform any extra clean up such as cached pointers to selected
00279         // children, etc.
00280         virtual void deleteAllChildren();
00281 
00282         // by default, does nothing
00283         virtual void    setTentative(BOOL b);
00284         // by default, returns false
00285         virtual BOOL    getTentative() const;
00286         virtual void    setAllChildrenEnabled(BOOL b);
00287 
00288         virtual void    setEnabled(BOOL enabled);
00289         virtual void    setVisible(BOOL visible);
00290         virtual void    setHidden(BOOL hidden);         // Never show (replacement text)
00291 
00292         // by default, does nothing and returns false
00293         virtual BOOL    setLabelArg( const LLString& key, const LLStringExplicit& text );
00294 
00295         virtual void    onVisibilityChange ( BOOL curVisibilityIn );
00296 
00297         void                    pushVisible(BOOL visible)       { mLastVisible = mVisible; setVisible(visible); }
00298         void                    popVisible()                            { setVisible(mLastVisible); mLastVisible = TRUE; }
00299 
00300         //
00301         // ACCESSORS
00302         //
00303         BOOL            getMouseOpaque() const                  { return mMouseOpaque; }
00304 
00305         U32                     getFollows() const                              { return mReshapeFlags; }
00306         BOOL            followsLeft() const                             { return mReshapeFlags & FOLLOWS_LEFT; }
00307         BOOL            followsRight() const                    { return mReshapeFlags & FOLLOWS_RIGHT; }
00308         BOOL            followsTop() const                              { return mReshapeFlags & FOLLOWS_TOP; }
00309         BOOL            followsBottom() const                   { return mReshapeFlags & FOLLOWS_BOTTOM; }
00310         BOOL            followsAll() const                              { return mReshapeFlags & FOLLOWS_ALL; }
00311 
00312         const LLRect&   getRect() const                         { return mRect; }
00313         const LLRect    getScreenRect() const;
00314         const LLRect    getLocalRect() const;
00315         virtual const LLRect getSnapRect() const        { return mRect; }
00316         virtual const LLRect getLocalSnapRect() const;
00317 
00318         virtual LLRect getRequiredRect();               // Get required size for this object. 0 for width/height means don't care.
00319         virtual void updateRect();                              // apply procedural updates to own rectangle
00320 
00321         LLView*         getRootView();
00322         LLView*         getParent() const                               { return mParentView; }
00323         LLView*         getFirstChild()                                 { return (mChildList.empty()) ? NULL : *(mChildList.begin()); }
00324         S32                     getChildCount() const                   { return (S32)mChildList.size(); }
00325         template<class _Pr3> void sortChildren(_Pr3 _Pred) { mChildList.sort(_Pred); }
00326         BOOL            hasAncestor(LLView* parentp);
00327 
00328         BOOL            hasChild(const LLString& childname, BOOL recurse = FALSE) const;
00329 
00330         BOOL            childHasKeyboardFocus( const LLString& childname ) const;
00331 
00332         //
00333         // UTILITIES
00334         //
00335 
00336         // Default behavior is to use reshape flags to resize child views
00337         virtual void    reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
00338         virtual void    translate( S32 x, S32 y );
00339         virtual void    setOrigin( S32 x, S32 y )       { mRect.translate( x - mRect.mLeft, y - mRect.mBottom ); }
00340         BOOL                    translateIntoRect( const LLRect& constraint, BOOL allow_partial_outside );
00341 
00342         virtual void    userSetShape(const LLRect& new_rect);
00343         virtual LLView* findSnapRect(LLRect& new_rect, const LLCoordGL& mouse_dir, LLView::ESnapType snap_type, S32 threshold, S32 padding = 0);
00344         virtual LLView* findSnapEdge(S32& new_edge_val, const LLCoordGL& mouse_dir, ESnapEdge snap_edge, ESnapType snap_type, S32 threshold, S32 padding = 0);
00345 
00346         // Defaults to other_view->getVisible()
00347         virtual BOOL    canSnapTo(LLView* other_view);
00348 
00349         virtual void    snappedTo(LLView* snap_view);
00350 
00351         virtual BOOL    handleKey(KEY key, MASK mask, BOOL called_from_parent);
00352         virtual BOOL    handleUnicodeChar(llwchar uni_char, BOOL called_from_parent);
00353         virtual BOOL    handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
00354                                                                           EDragAndDropType cargo_type,
00355                                                                           void* cargo_data,
00356                                                                           EAcceptance* accept,
00357                                                                           LLString& tooltip_msg);
00358 
00359         // LLMouseHandler functions
00360         // Default behavior is to pass events to children
00361 
00362         /*virtual*/ BOOL        handleHover(S32 x, S32 y, MASK mask);
00363         /*virtual*/ BOOL        handleMouseUp(S32 x, S32 y, MASK mask);
00364         /*virtual*/ BOOL        handleMouseDown(S32 x, S32 y, MASK mask);
00365         /*virtual*/ BOOL        handleDoubleClick(S32 x, S32 y, MASK mask);
00366         /*virtual*/ BOOL        handleScrollWheel(S32 x, S32 y, S32 clicks);
00367         /*virtual*/ BOOL        handleRightMouseDown(S32 x, S32 y, MASK mask);
00368         /*virtual*/ BOOL        handleRightMouseUp(S32 x, S32 y, MASK mask);
00369         /*virtual*/ void        onMouseCaptureLost();
00370         /*virtual*/ BOOL        hasMouseCapture();
00371 
00372         // Default behavior is to pass the tooltip event to children,
00373         // then display mToolTipMsg if no child handled it.
00374         /*virtual*/ BOOL        handleToolTip(S32 x, S32 y, LLString& msg, LLRect* sticky_rect);
00375 
00376         LLString getShowNamesToolTip();
00377 
00378         virtual void    draw();
00379 
00380         void                    drawDebugRect();
00381         void                    drawChild(LLView* childp, S32 x_offset = 0, S32 y_offset = 0, BOOL force_draw = FALSE);
00382 
00383         virtual const LLString& getName() const;
00384 
00385         virtual EWidgetType getWidgetType() const = 0;
00386         virtual LLString getWidgetTag() const = 0;
00387         virtual LLXMLNodePtr getXML(bool save_children = true) const;
00388 
00389         static U32 createRect(LLXMLNodePtr node, LLRect &rect, LLView* parent_view, const LLRect &required_rect = LLRect());
00390         virtual void initFromXML(LLXMLNodePtr node, LLView* parent);
00391 
00392         static LLFontGL* selectFont(LLXMLNodePtr node);
00393         static LLFontGL::HAlign selectFontHAlign(LLXMLNodePtr node);
00394         static LLFontGL::VAlign selectFontVAlign(LLXMLNodePtr node);
00395         static LLFontGL::StyleFlags selectFontStyle(LLXMLNodePtr node);
00396 
00397         // Some widgets, like close box buttons, don't need to be saved
00398         BOOL getSaveToXML() const { return mSaveToXML; }
00399         void setSaveToXML(BOOL b) { mSaveToXML = b; }
00400 
00401         // Only saves color if different from default setting.
00402         static void addColorXML(LLXMLNodePtr node, const LLColor4& color,
00403                                                         const LLString& xml_name, const LLString& control_name);
00404         static void saveColorToXML(std::ostream& out, const LLColor4& color,
00405                                                            const LLString& xml_name, const LLString& control_name,
00406                                                            const LLString& indent); // DEPRECATED
00407         // Escapes " (quot) ' (apos) & (amp) < (lt) > (gt)
00408         //static LLString escapeXML(const LLString& xml);
00409         static LLWString escapeXML(const LLWString& xml);
00410         
00411         //same as above, but wraps multiple lines in quotes and prepends
00412         //indent as leading white space on each line
00413         static LLString escapeXML(const LLString& xml, LLString& indent);
00414 
00415         // focuses the item in the list after the currently-focused item, wrapping if necessary
00416         static  BOOL focusNext(LLView::child_list_t & result);
00417         // focuses the item in the list before the currently-focused item, wrapping if necessary
00418         static  BOOL focusPrev(LLView::child_list_t & result);
00419 
00420         // returns query for iterating over controls in tab order       
00421         static const LLCtrlQuery & getTabOrderQuery();
00422         // return query for iterating over focus roots in tab order
00423         static const LLCtrlQuery & getFocusRootsQuery();
00424 
00425         BOOL                    getEnabled() const                      { return mEnabled; }
00426         BOOL                    getVisible() const                      { return mVisible && !mHidden; }
00427         U8              getSoundFlags() const       { return mSoundFlags; }
00428 
00429         // Default to no action
00430         virtual void    onFocusLost();
00431         virtual void    onFocusReceived();
00432 
00433         BOOL                    parentPointInView(S32 x, S32 y) const { return mRect.pointInRect( x, y ); }
00434         BOOL                    pointInView(S32 x, S32 y) const { return mRect.localPointInRect( x, y ); }
00435         virtual void    screenPointToLocal(S32 screen_x, S32 screen_y, S32* local_x, S32* local_y) const;
00436         virtual void    localPointToScreen(S32 local_x, S32 local_y, S32* screen_x, S32* screen_y) const;
00437         virtual BOOL    localPointToOtherView( S32 x, S32 y, S32 *other_x, S32 *other_y, LLView* other_view);
00438         virtual void    screenRectToLocal( const LLRect& screen, LLRect* local ) const;
00439         virtual void    localRectToScreen( const LLRect& local, LLRect* screen ) const;
00440         virtual BOOL    localRectToOtherView( const LLRect& local, LLRect* other, LLView* other_view ) const;
00441 
00442 
00443         static LLWindow*        getWindow(void);
00444 
00445         // Listener dispatching functions (Dispatcher deletes pointers to listeners on deregistration or destruction)
00446         LLSimpleListener* getListenerByName(const LLString &callback_name);
00447         void registerEventListener(LLString name, LLSimpleListener* function);
00448         void deregisterEventListener(LLString name);
00449         LLString findEventListener(LLSimpleListener *listener) const;
00450         void addListenerToControl(LLEventDispatcher *observer, const LLString& name, LLSD filter, LLSD userdata);
00451 
00452         virtual LLView* getChildByName(const LLString& name, BOOL recurse = FALSE) const;
00453 
00454         void addBoolControl(LLString name, bool initial_value);
00455         LLControlBase *getControl(LLString name);
00456         virtual LLControlBase *findControl(LLString name);
00457 
00458         void                    setControlValue(const LLSD& value);
00459         virtual void    setControlName(const LLString& control, LLView *context);
00460         virtual LLString getControlName() const;
00461         virtual bool    handleEvent(LLPointer<LLEvent> event, const LLSD& userdata);
00462         virtual void    setValue(const LLSD& value);
00463         const child_list_t*     getChildList() const { return &mChildList; }
00464 
00465 protected:
00466         virtual BOOL    handleKeyHere(KEY key, MASK mask, BOOL called_from_parent);
00467         virtual BOOL    handleUnicodeCharHere(llwchar uni_char, BOOL called_from_parent);
00468 
00469         LLView* childrenHandleKey(KEY key, MASK mask);
00470         LLView* childrenHandleUnicodeChar(llwchar uni_char);
00471         LLView* childrenHandleDragAndDrop(S32 x, S32 y, MASK mask,
00472                                                                                           BOOL drop,
00473                                                                                           EDragAndDropType type,
00474                                                                                           void* data,
00475                                                                                           EAcceptance* accept,
00476                                                                                           LLString& tooltip_msg);
00477 
00478         LLView* childrenHandleHover(S32 x, S32 y, MASK mask);
00479         LLView* childrenHandleMouseUp(S32 x, S32 y, MASK mask);
00480         LLView* childrenHandleMouseDown(S32 x, S32 y, MASK mask);
00481         LLView* childrenHandleDoubleClick(S32 x, S32 y, MASK mask);
00482         LLView* childrenHandleScrollWheel(S32 x, S32 y, S32 clicks);
00483         LLView* childrenHandleRightMouseDown(S32 x, S32 y, MASK mask);
00484         LLView* childrenHandleRightMouseUp(S32 x, S32 y, MASK mask);
00485 
00486         typedef std::map<LLString, LLPointer<LLSimpleListener> > dispatch_list_t;
00487         dispatch_list_t mDispatchList;
00488 
00489 protected:
00490         typedef std::map<LLString, LLControlBase*> control_map_t;
00491         control_map_t mFloaterControls;
00492 
00493         LLString                mControlName;
00494         friend class LLUICtrlFactory;
00495 };
00496 
00497 
00498 
00499 
00500 class LLCompareByTabOrder
00501 {
00502 public:
00503         LLCompareByTabOrder(LLView::child_tab_order_t order);
00504         virtual ~LLCompareByTabOrder() {}
00505         bool operator() (const LLView* const a, const LLView* const b) const;
00506 protected:
00507         virtual bool compareTabOrders(const LLView::tab_order_t & a, const LLView::tab_order_t & b) const;
00508         LLView::child_tab_order_t mTabOrder;
00509 };
00510 
00511 #endif

Generated on Thu Jul 1 06:09:26 2010 for Second Life Viewer by  doxygen 1.4.7