250 lines
7.2 KiB
C++
250 lines
7.2 KiB
C++
/**
|
|
* @file lltabcontainer.h
|
|
* @brief LLTabContainerCommon base class
|
|
*
|
|
* Copyright (c) 2001-$CurrentYear$, Linden Research, Inc.
|
|
* $License$
|
|
*/
|
|
|
|
// Fear my script-fu!
|
|
|
|
#ifndef LL_TABCONTAINER_H
|
|
#define LL_TABCONTAINER_H
|
|
|
|
#include "llpanel.h"
|
|
#include "llframetimer.h"
|
|
|
|
class LLButton;
|
|
class LLTextBox;
|
|
|
|
|
|
class LLTabContainerCommon : public LLPanel
|
|
{
|
|
public:
|
|
enum TabPosition
|
|
{
|
|
TOP,
|
|
BOTTOM,
|
|
LEFT
|
|
};
|
|
typedef enum e_insertion_point
|
|
{
|
|
START,
|
|
END,
|
|
RIGHT_OF_CURRENT
|
|
} eInsertionPoint;
|
|
|
|
LLTabContainerCommon( const LLString& name,
|
|
const LLRect& rect,
|
|
TabPosition pos,
|
|
void(*close_callback)(void*), void* callback_userdata,
|
|
BOOL bordered = TRUE);
|
|
|
|
LLTabContainerCommon( const LLString& name,
|
|
const LLString& rect_control,
|
|
TabPosition pos,
|
|
void(*close_callback)(void*), void* callback_userdata,
|
|
BOOL bordered = TRUE);
|
|
|
|
virtual ~LLTabContainerCommon();
|
|
|
|
virtual void initButtons() = 0;
|
|
|
|
virtual void setValue(const LLSD& value) { selectTab((S32) value.asInteger()); }
|
|
virtual EWidgetType getWidgetType() const { return WIDGET_TYPE_TAB_CONTAINER; }
|
|
virtual LLString getWidgetTag() const { return LL_TAB_CONTAINER_COMMON_TAG; }
|
|
|
|
virtual LLView* getChildByName(const LLString& name, BOOL recurse = FALSE) const;
|
|
|
|
static LLView* fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFactory *factory);
|
|
|
|
virtual void addTabPanel(LLPanel* child,
|
|
const LLString& label,
|
|
BOOL select = FALSE,
|
|
void (*on_tab_clicked)(void*, bool) = NULL,
|
|
void* userdata = NULL,
|
|
S32 indent = 0,
|
|
BOOL placeholder = FALSE,
|
|
eInsertionPoint insertion_point = END) = 0;
|
|
virtual void addPlaceholder(LLPanel* child, const LLString& label);
|
|
virtual void lockTabs();
|
|
|
|
virtual void enableTabButton(S32 which, BOOL enable);
|
|
|
|
virtual void removeTabPanel( LLPanel* child );
|
|
virtual void deleteAllTabs();
|
|
virtual LLPanel* getCurrentPanel();
|
|
virtual S32 getCurrentPanelIndex();
|
|
virtual S32 getTabCount();
|
|
virtual S32 getPanelIndexByTitle(const LLString& title);
|
|
virtual LLPanel* getPanelByIndex(S32 index);
|
|
virtual LLPanel* getPanelByName(const LLString& name);
|
|
virtual S32 getIndexForPanel(LLPanel* panel);
|
|
|
|
virtual void setCurrentTabName(const LLString& name);
|
|
|
|
|
|
virtual void selectFirstTab();
|
|
virtual void selectLastTab();
|
|
virtual BOOL selectTabPanel( LLPanel* child );
|
|
virtual BOOL selectTab(S32 which) = 0;
|
|
virtual BOOL selectTabByName(const LLString& title);
|
|
virtual void selectNextTab();
|
|
virtual void selectPrevTab();
|
|
|
|
BOOL getTabPanelFlashing(LLPanel* child);
|
|
void setTabPanelFlashing(LLPanel* child, BOOL state);
|
|
virtual void setTabImage(LLPanel* child, std::string img_name);
|
|
void setTitle( const LLString& title );
|
|
const LLString getPanelTitle(S32 index);
|
|
|
|
virtual void setTopBorderHeight(S32 height);
|
|
|
|
virtual void setTabChangeCallback(LLPanel* tab, void (*on_tab_clicked)(void*,bool));
|
|
virtual void setTabUserData(LLPanel* tab, void* userdata);
|
|
|
|
virtual void reshape(S32 width, S32 height, BOOL called_from_parent);
|
|
|
|
static void onCloseBtn(void* userdata);
|
|
static void onTabBtn(void* userdata);
|
|
static void onNextBtn(void* userdata);
|
|
static void onNextBtnHeld(void* userdata);
|
|
static void onPrevBtn(void* userdata);
|
|
static void onPrevBtnHeld(void* userdata);
|
|
static void onJumpFirstBtn( void* userdata );
|
|
static void onJumpLastBtn( void* userdata );
|
|
|
|
virtual void setRightTabBtnOffset( S32 offset ) { }
|
|
virtual void setPanelTitle(S32 index, const LLString& title) { }
|
|
|
|
virtual TabPosition getTabPosition() { return mTabPosition; }
|
|
|
|
|
|
protected:
|
|
// Structure used to map tab buttons to and from tab panels
|
|
struct LLTabTuple
|
|
{
|
|
LLTabTuple( LLTabContainerCommon* c, LLPanel* p, LLButton* b,
|
|
void (*cb)(void*,bool), void* userdata, LLTextBox* placeholder = NULL )
|
|
:
|
|
mTabContainer(c),
|
|
mTabPanel(p),
|
|
mButton(b),
|
|
mOnChangeCallback( cb ),
|
|
mUserData( userdata ),
|
|
mOldState(FALSE),
|
|
mPlaceholderText(placeholder)
|
|
{}
|
|
|
|
LLTabContainerCommon* mTabContainer;
|
|
LLPanel* mTabPanel;
|
|
LLButton* mButton;
|
|
void (*mOnChangeCallback)(void*, bool);
|
|
void* mUserData;
|
|
BOOL mOldState;
|
|
LLTextBox* mPlaceholderText;
|
|
};
|
|
|
|
typedef std::vector<LLTabTuple*> tuple_list_t;
|
|
tuple_list_t mTabList;
|
|
S32 mCurrentTabIdx;
|
|
|
|
BOOL mScrolled;
|
|
LLFrameTimer mScrollTimer;
|
|
S32 mScrollPos;
|
|
S32 mScrollPosPixels;
|
|
S32 mMaxScrollPos;
|
|
|
|
void (*mCloseCallback)(void*);
|
|
void* mCallbackUserdata;
|
|
|
|
LLTextBox* mTitleBox;
|
|
|
|
S32 mTopBorderHeight;
|
|
TabPosition mTabPosition;
|
|
S32 mLockedTabCount;
|
|
|
|
protected:
|
|
void scrollPrev();
|
|
void scrollNext();
|
|
|
|
virtual void updateMaxScrollPos() = 0;
|
|
virtual void commitHoveredButton(S32 x, S32 y) = 0;
|
|
LLTabTuple* getTabByPanel(LLPanel* child);
|
|
void insertTuple(LLTabTuple * tuple, eInsertionPoint insertion_point);
|
|
};
|
|
|
|
class LLTabContainer : public LLTabContainerCommon
|
|
{
|
|
public:
|
|
LLTabContainer( const LLString& name, const LLRect& rect, TabPosition pos,
|
|
void(*close_callback)(void*), void* callback_userdata,
|
|
const LLString& title=LLString::null, BOOL bordered = TRUE );
|
|
|
|
LLTabContainer( const LLString& name, const LLString& rect_control, TabPosition pos,
|
|
void(*close_callback)(void*), void* callback_userdata,
|
|
const LLString& title=LLString::null, BOOL bordered = TRUE );
|
|
|
|
~LLTabContainer();
|
|
|
|
/*virtual*/ void initButtons();
|
|
|
|
/*virtual*/ void draw();
|
|
|
|
/*virtual*/ void addTabPanel(LLPanel* child,
|
|
const LLString& label,
|
|
BOOL select = FALSE,
|
|
void (*on_tab_clicked)(void*, bool) = NULL,
|
|
void* userdata = NULL,
|
|
S32 indent = 0,
|
|
BOOL placeholder = FALSE,
|
|
eInsertionPoint insertion_point = END);
|
|
|
|
/*virtual*/ BOOL selectTab(S32 which);
|
|
/*virtual*/ void removeTabPanel( LLPanel* child );
|
|
|
|
/*virtual*/ void setPanelTitle(S32 index, const LLString& title);
|
|
/*virtual*/ void setTabImage(LLPanel* child, std::string img_name);
|
|
/*virtual*/ void setRightTabBtnOffset( S32 offset );
|
|
|
|
/*virtual*/ void setMinTabWidth(S32 width);
|
|
/*virtual*/ void setMaxTabWidth(S32 width);
|
|
|
|
/*virtual*/ S32 getMinTabWidth() const;
|
|
/*virtual*/ S32 getMaxTabWidth() const;
|
|
|
|
/*virtual*/ BOOL handleMouseDown( S32 x, S32 y, MASK mask );
|
|
/*virtual*/ BOOL handleHover( S32 x, S32 y, MASK mask );
|
|
/*virtual*/ BOOL handleMouseUp( S32 x, S32 y, MASK mask );
|
|
/*virtual*/ BOOL handleToolTip(S32 x, S32 y, LLString& msg, LLRect* sticky_rect );
|
|
/*virtual*/ BOOL handleKeyHere(KEY key, MASK mask, BOOL called_from_parent);
|
|
/*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
|
|
EDragAndDropType type, void* cargo_data,
|
|
EAcceptance* accept, LLString& tooltip);
|
|
|
|
virtual LLXMLNodePtr getXML(bool save_children = true) const;
|
|
|
|
|
|
protected:
|
|
|
|
LLButton* mLeftArrowBtn;
|
|
LLButton* mJumpLeftArrowBtn;
|
|
LLButton* mRightArrowBtn;
|
|
LLButton* mJumpRightArrowBtn;
|
|
|
|
S32 mRightTabBtnOffset; // Extra room to the right of the tab buttons.
|
|
|
|
protected:
|
|
virtual void updateMaxScrollPos();
|
|
virtual void commitHoveredButton(S32 x, S32 y);
|
|
|
|
S32 mMinTabWidth;
|
|
S32 mMaxTabWidth;
|
|
S32 mTotalTabWidth;
|
|
};
|
|
|
|
const S32 TABCNTR_CLOSE_BTN_SIZE = 16;
|
|
const S32 TABCNTR_HEADER_HEIGHT = LLPANEL_BORDER_WIDTH + TABCNTR_CLOSE_BTN_SIZE;
|
|
|
|
#endif // LL_TABCONTAINER_H
|