Files
SingularityViewer/indra/llui/lltabcontainer.h
2010-04-02 02:48:44 -03:00

247 lines
8.0 KiB
C++

/**
* @file lltabcontainer.h
* @brief LLTabContainer class
*
* $LicenseInfo:firstyear=2001&license=viewergpl$
*
* Copyright (c) 2001-2009, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
* to you under the terms of the GNU General Public License, version 2.0
* ("GPL"), unless you have obtained a separate licensing agreement
* ("Other License"), formally executed by you and Linden Lab. Terms of
* the GPL can be found in doc/GPL-license.txt in this distribution, or
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
*
* There are special exceptions to the terms and conditions of the GPL as
* it is applied to this Source Code. View the full text of the exception
* in the file doc/FLOSS-exception.txt in this software distribution, or
* online at
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
*
* By copying, modifying or distributing this software, you acknowledge
* that you have read and understood your obligations described above,
* and agree to abide by those obligations.
*
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
*/
#ifndef LL_TABCONTAINER_H
#define LL_TABCONTAINER_H
#include "llpanel.h"
#include "lltextbox.h"
#include "llframetimer.h"
extern const S32 TABCNTR_HEADER_HEIGHT;
class LLTabContainer : public LLPanel
{
public:
enum TabPosition
{
TOP,
BOTTOM,
LEFT
};
typedef enum e_insertion_point
{
START,
END,
LEFT_OF_CURRENT,
RIGHT_OF_CURRENT
} eInsertionPoint;
LLTabContainer( const std::string& name, const LLRect& rect, TabPosition pos,
BOOL bordered, BOOL is_vertical);
/*virtual*/ ~LLTabContainer();
// from LLView
/*virtual*/ void setValue(const LLSD& value);
/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
/*virtual*/ void draw();
/*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, std::string& msg, LLRect* sticky_rect );
/*virtual*/ BOOL handleKeyHere(KEY key, MASK mask);
/*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
EDragAndDropType type, void* cargo_data,
EAcceptance* accept, std::string& tooltip);
/*virtual*/ LLXMLNodePtr getXML(bool save_children = true) const;
/*virtual*/ LLView* getChildView(const std::string& name, BOOL recurse = TRUE, BOOL create_if_missing = TRUE) const;
void addTabPanel(LLPanel* child,
const std::string& label,
BOOL select = FALSE,
void (*on_tab_clicked)(void*, bool) = NULL,
void* userdata = NULL,
S32 indent = 0,
BOOL placeholder = FALSE,
eInsertionPoint insertion_point = END);
void addPlaceholder(LLPanel* child, const std::string& label);
void removeTabPanel( LLPanel* child );
void lockTabs(S32 num_tabs = 0);
void unlockTabs();
S32 getNumLockedTabs() { return mLockedTabCount; }
void enableTabButton(S32 which, BOOL enable);
void deleteAllTabs();
LLPanel* getCurrentPanel();
S32 getCurrentPanelIndex();
S32 getTabCount();
LLPanel* getPanelByIndex(S32 index);
S32 getIndexForPanel(LLPanel* panel);
S32 getPanelIndexByTitle(const std::string& title);
LLPanel* getPanelByName(const std::string& name);
void setCurrentTabName(const std::string& name);
void selectFirstTab();
void selectLastTab();
void selectNextTab();
void selectPrevTab();
BOOL selectTabPanel( LLPanel* child );
BOOL selectTab(S32 which);
BOOL selectTabByName(const std::string& title);
BOOL setTab(S32 which);
BOOL getTabPanelFlashing(LLPanel* child);
void setTabPanelFlashing(LLPanel* child, BOOL state);
void setTabImage(LLPanel* child, std::string img_name, const LLColor4& color = LLColor4::white);
void setTitle( const std::string& title );
const std::string getPanelTitle(S32 index);
void setTopBorderHeight(S32 height);
S32 getTopBorderHeight() const;
void setTabChangeCallback(LLPanel* tab, void (*on_tab_clicked)(void*,bool));
void setTabPrecommitChangeCallback(LLPanel* tab, void (*on_precommit)(void*, bool));
void setTabUserData(LLPanel* tab, void* userdata);
void setRightTabBtnOffset( S32 offset );
void setPanelTitle(S32 index, const std::string& title);
TabPosition getTabPosition() const { return mTabPosition; }
void setMinTabWidth(S32 width) { mMinTabWidth = width; }
void setMaxTabWidth(S32 width) { mMaxTabWidth = width; }
S32 getMinTabWidth() const { return mMinTabWidth; }
S32 getMaxTabWidth() const { return mMaxTabWidth; }
void startDragAndDropDelayTimer() { mDragAndDropDelayTimer.start(); }
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 );
static LLView* fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFactory *factory);
private:
// Structure used to map tab buttons to and from tab panels
struct LLTabTuple
{
LLTabTuple( LLTabContainer* c, LLPanel* p, LLButton* b,
void (*cb)(void*,bool), void* userdata, LLTextBox* placeholder = NULL,
void (*pcb)(void*,bool) = NULL)
:
mTabContainer(c),
mTabPanel(p),
mButton(b),
mOnChangeCallback( cb ),
mPrecommitChangeCallback( pcb ),
mUserData( userdata ),
mOldState(FALSE),
mPlaceholderText(placeholder),
mPadding(0)
{}
LLTabContainer* mTabContainer;
LLPanel* mTabPanel;
LLButton* mButton;
void (*mOnChangeCallback)(void*, bool);
void (*mPrecommitChangeCallback)(void*,bool); // Precommit callback gets called before tab is changed and
// can prevent it from being changed. onChangeCallback is called
// immediately after tab is actually changed - Nyx
void* mUserData;
BOOL mOldState;
LLTextBox* mPlaceholderText;
S32 mPadding;
};
void initButtons();
LLTabTuple* getTab(S32 index) { return mTabList[index]; }
LLTabTuple* getTabByPanel(LLPanel* child);
void insertTuple(LLTabTuple * tuple, eInsertionPoint insertion_point);
S32 getScrollPos() const { return mScrollPos; }
void setScrollPos(S32 pos) { mScrollPos = pos; }
S32 getMaxScrollPos() const { return mMaxScrollPos; }
void setMaxScrollPos(S32 pos) { mMaxScrollPos = pos; }
S32 getScrollPosPixels() const { return mScrollPosPixels; }
void setScrollPosPixels(S32 pixels) { mScrollPosPixels = pixels; }
void setTabsHidden(BOOL hidden) { mTabsHidden = hidden; }
BOOL getTabsHidden() const { return mTabsHidden; }
void setCurrentPanelIndex(S32 index) { mCurrentTabIdx = index; }
void scrollPrev() { mScrollPos = llmax(0, mScrollPos-1); } // No wrap
void scrollNext() { mScrollPos = llmin(mScrollPos+1, mMaxScrollPos); } // No wrap
void updateMaxScrollPos();
void commitHoveredButton(S32 x, S32 y);
// Variables
typedef std::vector<LLTabTuple*> tuple_list_t;
tuple_list_t mTabList;
S32 mCurrentTabIdx;
S32 mNextTabIdx;
BOOL mTabsHidden;
BOOL mScrolled;
LLFrameTimer mScrollTimer;
S32 mScrollPos;
S32 mScrollPosPixels;
S32 mMaxScrollPos;
void (*mCloseCallback)(void*);
void* mCallbackUserdata;
LLTextBox* mTitleBox;
S32 mTopBorderHeight;
TabPosition mTabPosition;
S32 mLockedTabCount;
S32 mMinTabWidth;
LLButton* mPrevArrowBtn;
LLButton* mNextArrowBtn;
BOOL mIsVertical;
// Horizontal specific
LLButton* mJumpPrevArrowBtn;
LLButton* mJumpNextArrowBtn;
S32 mRightTabBtnOffset; // Extra room to the right of the tab buttons.
S32 mMaxTabWidth;
S32 mTotalTabWidth;
LLFrameTimer mDragAndDropDelayTimer;
};
#endif // LL_TABCONTAINER_H