diff options
Diffstat (limited to 'indra/newview/lllocationinputctrl.h')
-rw-r--r-- | indra/newview/lllocationinputctrl.h | 248 |
1 files changed, 248 insertions, 0 deletions
diff --git a/indra/newview/lllocationinputctrl.h b/indra/newview/lllocationinputctrl.h new file mode 100644 index 0000000000..07aa30295c --- /dev/null +++ b/indra/newview/lllocationinputctrl.h @@ -0,0 +1,248 @@ +/** + * @file lllocationinputmonitorctrl.h + * @brief Combobox-like location input control + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 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_LLLOCATIONINPUTCTRL_H +#define LL_LLLOCATIONINPUTCTRL_H + +#include "llbutton.h" +#include "lluictrl.h" +#include "llctrlselectioninterface.h" +#include "llimagegl.h" +#include "llrect.h" +#include "llscrolllistitem.h" +#include <boost/function.hpp> + +// Classes +class LLButton; +class LLFontGL; +class LLLineEditor; +class LLScrollListCtrl; +class LLSquareButton; +class LLUICtrlFactory; +class LLViewBorder; + +/** + * Location input control. + * + * This is currently just a copy of LLComboBox (which is not exactly what the nav bar needs). + * The only major difference so far is the way auto-completion works. + * + * @see LLNavigationBar + */ +class LLLocationInputCtrl +: public LLUICtrl, public LLCtrlListInterface +{ + LOG_CLASS(LLLocationInputCtrl); + +public: + struct Params + : public LLInitParam::Block<Params, LLUICtrl::Params> + { + Optional<bool> allow_text_entry, select_on_focus; + Optional<S32> max_chars; + Optional<commit_callback_t> prearrange_callback; + Optional<commit_callback_t> text_entry_callback; + Optional<commit_callback_t > selection_callback; + Optional<LLUIImage*> arrow_image; +Multiple<LLScrollListItem::Params> items; + + Params() + : allow_text_entry("allow_text_entry", false), + select_on_focus("select_on_focus", true), + max_chars("max_chars", 20), + arrow_image("arrow_image", LLUI::getUIImage("combobox_arrow.tga")), + items("item") + { + addSynonym(items, "combo_item"); + } + }; + + typedef enum e_preferred_position + { + ABOVE, + BELOW + } EPreferredPosition; + + virtual ~LLLocationInputCtrl(); +protected: + friend class LLUICtrlFactory; + LLLocationInputCtrl(const Params&); +public: + // LLView interface + + virtual BOOL postBuild(); + virtual void draw(); + virtual void onFocusLost(); + + virtual void setEnabled(BOOL enabled); + + virtual BOOL handleToolTip(S32 x, S32 y, std::string& msg, LLRect* sticky_rect); + virtual BOOL handleKeyHere(KEY key, MASK mask); + virtual BOOL handleUnicodeCharHere(llwchar uni_char); + + // LLUICtrl interface + virtual void clear(); // select nothing + virtual void onCommit(); + virtual BOOL acceptsTextInput() const { return mAllowTextEntry; } + virtual BOOL isDirty() const; // Returns TRUE if the user has modified this control. + virtual void resetDirty(); // Clear dirty state + + virtual void setFocus(BOOL b); + + // Selects item by underlying LLSD value, using LLSD::asString() matching. + // For simple items, this is just the name of the label. + virtual void setValue(const LLSD& value ); + + // Gets underlying LLSD value for currently selected items. For simple + // items, this is just the label. + virtual LLSD getValue() const; + + void setTextEntry(const LLStringExplicit& text); + void setText(const LLStringExplicit& text); + + LLScrollListItem* add(const std::string& name, EAddPosition pos = ADD_BOTTOM, BOOL enabled = TRUE); // add item "name" to menu + LLScrollListItem* add(const std::string& name, const LLUUID& id, EAddPosition pos = ADD_BOTTOM, BOOL enabled = TRUE); + LLScrollListItem* add(const std::string& name, void* userdata, EAddPosition pos = ADD_BOTTOM, BOOL enabled = TRUE); + LLScrollListItem* add(const std::string& name, LLSD value, EAddPosition pos = ADD_BOTTOM, BOOL enabled = TRUE); + LLScrollListItem* addSeparator(EAddPosition pos = ADD_BOTTOM); + BOOL remove( S32 index ); // remove item by index, return TRUE if found and removed + void removeall() { clearRows(); } + + void sortByName(BOOL ascending = TRUE); // Sort the entries in the combobox by name + + // Select current item by name using selectItemByLabel. Returns FALSE if not found. + BOOL setSimple(const LLStringExplicit& name); + // Get name of current item. Returns an empty string if not found. + const std::string getSimple() const; + // Get contents of column x of selected row + const std::string getSelectedItemLabel(S32 column = 0) const; + + // Sets the label, which doesn't have to exist in the label. + // This is probably a UI abuse. + void setLabel(const LLStringExplicit& name); + + BOOL remove(const std::string& name); // remove item "name", return TRUE if found and removed + + BOOL setCurrentByIndex( S32 index ); + S32 getCurrentIndex() const; + + virtual void updateLayout(); + + //======================================================================== + LLCtrlSelectionInterface* getSelectionInterface() { return (LLCtrlSelectionInterface*)this; }; + LLCtrlListInterface* getListInterface() { return (LLCtrlListInterface*)this; }; + + // LLCtrlListInterface functions + // See llscrolllistctrl.h + virtual S32 getItemCount() const; + // Overwrites the default column (See LLScrollListCtrl for format) + virtual void addColumn(const LLSD& column, EAddPosition pos = ADD_BOTTOM); + virtual void clearColumns(); + virtual void setColumnLabel(const std::string& column, const std::string& label); + virtual LLScrollListItem* addElement(const LLSD& value, EAddPosition pos = ADD_BOTTOM, void* userdata = NULL); + virtual LLScrollListItem* addSimpleElement(const std::string& value, EAddPosition pos = ADD_BOTTOM, const LLSD& id = LLSD()); + virtual void clearRows(); + virtual void sortByColumn(const std::string& name, BOOL ascending); + + // LLCtrlSelectionInterface functions + virtual BOOL getCanSelect() const { return TRUE; } + virtual BOOL selectFirstItem() { return setCurrentByIndex(0); } + virtual BOOL selectNthItem( S32 index ) { return setCurrentByIndex(index); } + virtual BOOL selectItemRange( S32 first, S32 last ); + virtual S32 getFirstSelectedIndex() const { return getCurrentIndex(); } + virtual BOOL setCurrentByID( const LLUUID& id ); + virtual LLUUID getCurrentID() const; // LLUUID::null if no items in menu + virtual BOOL setSelectedByValue(const LLSD& value, BOOL selected); + virtual LLSD getSelectedValue(); + virtual BOOL isSelected(const LLSD& value) const; + virtual BOOL operateOnSelection(EOperation op); + virtual BOOL operateOnAll(EOperation op); + + //======================================================================== + + void* getCurrentUserdata(); + + void setPrearrangeCallback( commit_callback_t cb ) { mPrearrangeCallback = cb; } + void setTextEntryCallback( commit_callback_t cb ) { mTextEntryCallback = cb; } + void setSelectionCallback( commit_callback_t cb ) { mSelectionCallback = cb; } + + void setButtonVisible(BOOL visible); + + void onButtonDown(); + void onItemSelected(const LLSD& data); + void onTextCommit(const LLSD& data); + + virtual void updateSelection(); + virtual void showList(); + virtual void hideList(); + + //======================================================================== + BOOL childHasFocus() const; /// Is one of our children focused? + + BOOL canCut() const; + BOOL canCopy() const; + BOOL canPaste() const; + BOOL canDeselect() const; + BOOL canSelectAll() const; + + void cut(); + void copy(); + void paste(); + void deleteSelection(); + void selectAll(); + //======================================================================== + + void onTextEntry(LLLineEditor* line_editor); + +protected: + + void prearrangeList(std::string filter = ""); + + + LLButton* mButton; + LLScrollListCtrl* mList; + EPreferredPosition mListPosition; + LLPointer<LLUIImage> mArrowImage; + std::string mLabel; + S32 mButtonPadding; + LLLineEditor* mTextEntry; + BOOL mAllowTextEntry; + BOOL mSelectOnFocus; + BOOL mHasAutocompletedText; + S32 mMaxChars; + BOOL mTextEntryTentative; + commit_callback_t mPrearrangeCallback; + commit_callback_t mTextEntryCallback; + commit_callback_t mSelectionCallback; +}; + +#endif |