247 lines
8.0 KiB
C++
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
|