summaryrefslogtreecommitdiff
path: root/indra/llui/llfloater.h
diff options
context:
space:
mode:
Diffstat (limited to 'indra/llui/llfloater.h')
-rw-r--r--indra/llui/llfloater.h399
1 files changed, 399 insertions, 0 deletions
diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h
new file mode 100644
index 0000000000..d682c7a36a
--- /dev/null
+++ b/indra/llui/llfloater.h
@@ -0,0 +1,399 @@
+/**
+ * @file llfloater.h
+ * @brief LLFloater base class
+ *
+ * Copyright (c) 2002-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+// Floating "windows" within the GL display, like the inventory floater,
+// mini-map floater, etc.
+
+
+#ifndef LL_FLOATER_H
+#define LL_FLOATER_H
+
+#include "llpanel.h"
+#include "lluuid.h"
+#include "lltabcontainer.h"
+#include <set>
+
+class LLDragHandle;
+class LLResizeHandle;
+class LLResizeBar;
+class LLButton;
+class LLMultiFloater;
+
+const S32 LLFLOATER_VPAD = 6;
+const S32 LLFLOATER_HPAD = 6;
+const S32 LLFLOATER_CLOSE_BOX_SIZE = 16;
+const S32 LLFLOATER_HEADER_SIZE = 16;
+
+const BOOL RESIZE_YES = TRUE;
+const BOOL RESIZE_NO = FALSE;
+
+const S32 DEFAULT_MIN_WIDTH = 100;
+const S32 DEFAULT_MIN_HEIGHT = 100;
+
+const BOOL DRAG_ON_TOP = FALSE;
+const BOOL DRAG_ON_LEFT = TRUE;
+
+const BOOL MINIMIZE_YES = TRUE;
+const BOOL MINIMIZE_NO = FALSE;
+
+const BOOL CLOSE_YES = TRUE;
+const BOOL CLOSE_NO = FALSE;
+
+const BOOL ADJUST_VERTICAL_YES = TRUE;
+const BOOL ADJUST_VERTICAL_NO = FALSE;
+
+
+class LLFloater : public LLPanel
+{
+friend class LLFloaterView;
+public:
+ enum EFloaterButtons
+ {
+ BUTTON_CLOSE,
+ BUTTON_RESTORE,
+ BUTTON_MINIMIZE,
+ BUTTON_TEAR_OFF,
+ BUTTON_EDIT,
+ BUTTON_COUNT
+ };
+
+ LLFloater();
+ LLFloater(const LLString& name); //simple constructor for data-driven initialization
+ LLFloater( const LLString& name, const LLRect& rect, const LLString& title,
+ BOOL resizable = FALSE,
+ S32 min_width = DEFAULT_MIN_WIDTH,
+ S32 min_height = DEFAULT_MIN_HEIGHT,
+ BOOL drag_on_left = FALSE,
+ BOOL minimizable = TRUE,
+ BOOL close_btn = TRUE,
+ BOOL bordered = BORDER_NO);
+
+ LLFloater( const LLString& name, const LLString& rect_control, const LLString& title,
+ BOOL resizable = FALSE,
+ S32 min_width = DEFAULT_MIN_WIDTH,
+ S32 min_height = DEFAULT_MIN_HEIGHT,
+ BOOL drag_on_left = FALSE,
+ BOOL minimizable = TRUE,
+ BOOL close_btn = TRUE,
+ BOOL bordered = BORDER_NO);
+
+ virtual ~LLFloater();
+
+ virtual LLXMLNodePtr getXML(bool save_children = true) const;
+ static LLView* fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFactory *factory);
+ void initFloaterXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFactory *factory, BOOL open = TRUE);
+
+ /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = 1);
+ /*virtual*/ void translate(S32 x, S32 y);
+ /*virtual*/ BOOL canSnapTo(LLView* other_view);
+ /*virtual*/ void snappedTo(LLView* snap_view);
+ /*virtual*/ void setFocus( BOOL b );
+ /*virtual*/ void setIsChrome(BOOL is_chrome);
+
+ // Can be called multiple times to reset floater parameters.
+ // Deletes all children of the floater.
+ virtual void init(const LLString& title, BOOL resizable,
+ S32 min_width, S32 min_height, BOOL drag_on_left,
+ BOOL minimizable, BOOL close_btn);
+ virtual EWidgetType getWidgetType() const;
+ virtual LLString getWidgetTag() const;
+
+ virtual void open();
+
+ // If allowed, close the floater cleanly, releasing focus.
+ // app_quitting is passed to onClose() below.
+ virtual void close(bool app_quitting = false);
+
+ void setAutoFocus(BOOL focus) { mAutoFocus = focus; setFocus(focus); }
+
+ // Release keyboard and mouse focus
+ void releaseFocus();
+
+ // moves to center of gFloaterView
+ void center();
+ // applies rectangle stored in mRectControl, if any
+ void applyRectControl();
+
+
+ LLMultiFloater* getHost() { return (LLMultiFloater*)LLFloater::getFloaterByHandle(mHostHandle); }
+
+ void setTitle( const LLString& title );
+ const LLString& getTitle() const;
+ virtual void setMinimized(BOOL b);
+ void moveResizeHandleToFront();
+ void addDependentFloater(LLFloater* dependent, BOOL reposition = TRUE);
+ void addDependentFloater(LLViewHandle dependent_handle, BOOL reposition = TRUE);
+ LLFloater* getDependee() { return (LLFloater*)LLFloater::getFloaterByHandle(mDependeeHandle); }
+ void removeDependentFloater(LLFloater* dependent);
+ BOOL isMinimized() { return mMinimized; }
+ BOOL isFrontmost();
+ BOOL isDependent() { return !mDependeeHandle.isDead(); }
+ void setCanMinimize(BOOL can_minimize);
+ void setCanClose(BOOL can_close);
+ void setCanTearOff(BOOL can_tear_off);
+ virtual void setCanResize(BOOL can_resize);
+ void setCanDrag(BOOL can_drag);
+ void setHost(LLMultiFloater* host);
+ BOOL isResizable() const { return mResizable; }
+ void setResizeLimits( S32 min_width, S32 min_height );
+ void getResizeLimits( S32* min_width, S32* min_height ) { *min_width = mMinWidth; *min_height = mMinHeight; }
+
+
+ bool isMinimizeable() const{ return mButtonsEnabled[BUTTON_MINIMIZE]; }
+ // Does this window have a close button, NOT can we close it right now.
+ bool isCloseable() const{ return (mButtonsEnabled[BUTTON_CLOSE] ? true : false); }
+ bool isDragOnLeft() const{ return mDragOnLeft; }
+ S32 getMinWidth() const{ return mMinWidth; }
+ S32 getMinHeight() const{ return mMinHeight; }
+
+ virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
+ virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
+ virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask);
+
+ virtual void draw();
+
+ // Call destroy() to free memory, or setVisible(FALSE) to keep it
+ // If app_quitting, you might not want to save your visibility.
+ // Defaults to destroy().
+ virtual void onClose(bool app_quitting);
+
+ // Defaults to true.
+ virtual BOOL canClose();
+
+ virtual void setVisible(BOOL visible);
+ void setFrontmost(BOOL take_focus = TRUE);
+
+ // Defaults to false.
+ virtual BOOL canSaveAs();
+
+ // Defaults to no-op.
+ virtual void saveAs();
+
+ void setSnapTarget(LLViewHandle handle) { mSnappedTo = handle; }
+ void clearSnapTarget() { mSnappedTo.markDead(); }
+ LLViewHandle getSnapTarget() { return mSnappedTo; }
+
+ /*virtual*/ LLView* getRootMostFastFrameView();
+
+ static void closeByMenu(void *userdata);
+ static void onClickClose(void *userdata);
+ static void onClickMinimize(void *userdata);
+ static void onClickTearOff(void *userdata);
+ static void onClickEdit(void *userdata);
+
+ static void setFloaterHost(LLMultiFloater* hostp) {sHostp = hostp; }
+ static void setEditModeEnabled(BOOL enable);
+ static BOOL getEditModeEnabled();
+ static LLMultiFloater* getFloaterHost() {return sHostp; }
+
+ static LLFloater* getFloaterByHandle(LLViewHandle handle);
+
+protected:
+ // Don't call this directly. You probably want to call close(). JC
+ void destroy();
+ virtual void bringToFront(S32 x, S32 y);
+ virtual void setVisibleAndFrontmost(BOOL take_focus=TRUE);
+ void setForeground(BOOL b); // called only by floaterview
+ void cleanupHandles(); // remove handles to dead floaters
+ void createMinimizeButton();
+ void updateButtons();
+ void buildButtons();
+
+protected:
+// static LLViewerImage* sBackgroundImage;
+// static LLViewerImage* sShadowImage;
+
+ LLDragHandle* mDragHandle;
+ LLResizeBar* mResizeBar[4];
+ LLResizeHandle* mResizeHandle[4];
+ LLButton *mMinimizeButton;
+ BOOL mCanTearOff;
+ BOOL mMinimized;
+ LLRect mPreviousRect;
+ BOOL mForeground;
+ LLViewHandle mDependeeHandle;
+
+ BOOL mFirstLook; // TRUE if the _next_ time this floater is visible will be the first time in the session that it is visible.
+
+ BOOL mResizable;
+ S32 mMinWidth;
+ S32 mMinHeight;
+
+ BOOL mAutoFocus;
+ BOOL mEditing;
+
+ typedef std::set<LLViewHandle> handle_set_t;
+ typedef std::set<LLViewHandle>::iterator handle_set_iter_t;
+ handle_set_t mDependents;
+ bool mDragOnLeft;
+
+ BOOL mButtonsEnabled[BUTTON_COUNT];
+ LLButton* mButtons[BUTTON_COUNT];
+ F32 mButtonScale;
+
+ LLViewHandle mSnappedTo;
+
+ LLViewHandle mHostHandle;
+ LLViewHandle mLastHostHandle;
+
+ static BOOL sEditModeEnabled;
+ static LLMultiFloater* sHostp;
+ static LLString sButtonActiveImageNames[BUTTON_COUNT];
+ static LLString sButtonInactiveImageNames[BUTTON_COUNT];
+ static LLString sButtonPressedImageNames[BUTTON_COUNT];
+ static LLString sButtonNames[BUTTON_COUNT];
+ static LLString sButtonToolTips[BUTTON_COUNT];
+ typedef void (*click_callback)(void *);
+ static click_callback sButtonCallbacks[BUTTON_COUNT];
+
+ typedef std::map<LLViewHandle, LLFloater*> handle_map_t;
+ typedef std::map<LLViewHandle, LLFloater*>::iterator handle_map_iter_t;
+ static handle_map_t sFloaterMap;
+
+ std::vector<LLView*> mMinimizedHiddenChildren;
+};
+
+
+/////////////////////////////////////////////////////////////
+// LLFloaterView
+// Parent of all floating panels
+
+class LLFloaterView : public LLUICtrl
+{
+public:
+ LLFloaterView( const LLString& name, const LLRect& rect );
+
+ virtual EWidgetType getWidgetType() const;
+ virtual LLString getWidgetTag() const;
+
+ /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent);
+ void reshape(S32 width, S32 height, BOOL called_from_parent, BOOL adjust_vertical);
+
+ /*virtual*/ void draw();
+ /*virtual*/ const LLRect getSnapRect() const;
+ void refresh();
+
+ void getNewFloaterPosition( S32* left, S32* top );
+ void resetStartingFloaterPosition();
+ LLRect findNeighboringPosition( LLFloater* reference_floater, LLFloater* neighbor );
+
+ // Given a child of gFloaterView, make sure this view can fit entirely onscreen.
+ void adjustToFitScreen(LLFloater* floater, BOOL allow_partial_outside);
+
+ void getMinimizePosition( S32 *left, S32 *bottom);
+ void restoreAll(); // un-minimize all floaters
+ typedef std::set<LLView*> skip_list_t;
+ void LLFloaterView::pushVisibleAll(BOOL visible, const skip_list_t& skip_list = skip_list_t());
+ void LLFloaterView::popVisibleAll(const skip_list_t& skip_list = skip_list_t());
+
+ void setCycleMode(BOOL mode);
+ BOOL getCycleMode();
+ void bringToFront( LLFloater* child, BOOL give_focus = TRUE );
+ void highlightFocusedFloater();
+ void unhighlightFocusedFloater();
+ void focusFrontFloater();
+ void destroyAllChildren();
+ // attempt to close all floaters
+ void closeAllChildren(bool app_quitting);
+ BOOL allChildrenClosed();
+
+ LLFloater* getFrontmost();
+ LLFloater* getBackmost();
+ LLFloater* getParentFloater(LLView* viewp);
+ LLFloater* getFocusedFloater();
+ void syncFloaterTabOrder();
+
+ // Get a floater based the handle. If this returns NULL, it is up
+ // to the caller to discard the handle.
+ LLFloater* getFloaterByHandle(LLViewHandle handle);
+
+ // Returns z order of child provided. 0 is closest, larger numbers
+ // are deeper in the screen. If there is no such child, the return
+ // value is not defined.
+ S32 getZOrder(LLFloater* child);
+
+ void setSnapOffsetBottom(S32 offset) { mSnapOffsetBottom = offset; }
+
+private:
+ S32 mColumn;
+ S32 mNextLeft;
+ S32 mNextTop;
+ BOOL mFocusCycleMode;
+ S32 mSnapOffsetBottom;
+};
+
+class LLMultiFloater : public LLFloater
+{
+public:
+ LLMultiFloater();
+ LLMultiFloater(LLTabContainerCommon::TabPosition tab_pos);
+ LLMultiFloater(const LLString& name);
+ LLMultiFloater(const LLString& name, const LLRect& rect, LLTabContainer::TabPosition tab_pos = LLTabContainer::TOP, BOOL auto_resize = FALSE);
+ LLMultiFloater(const LLString& name, const LLString& rect_control, LLTabContainer::TabPosition tab_pos = LLTabContainer::TOP, BOOL auto_resize = FALSE);
+ virtual ~LLMultiFloater();
+
+ virtual void init(const LLString& title, BOOL resizable,
+ S32 min_width, S32 min_height, BOOL drag_on_left,
+ BOOL minimizable, BOOL close_btn);
+
+ virtual BOOL postBuild();
+ /*virtual*/ void open();
+ /*virtual*/ void onClose(bool app_quitting);
+ /*virtual*/ void draw();
+ /*virtual*/ void setVisible(BOOL visible);
+ /*virtual*/ BOOL handleKeyHere(KEY key, MASK mask, BOOL called_from_parent);
+
+ /*virtual*/ EWidgetType getWidgetType() const;
+ /*virtual*/ LLString getWidgetTag() const;
+
+ virtual void setCanResize(BOOL can_resize);
+ virtual void growToFit(LLFloater* floaterp, S32 width, S32 height);
+ virtual void addFloater(LLFloater* floaterp, BOOL select_added_floater, LLTabContainerCommon::eInsertionPoint insertion_point = LLTabContainerCommon::END);
+
+ virtual void showFloater(LLFloater* floaterp);
+ virtual void removeFloater(LLFloater* floaterp);
+
+ virtual void tabOpen(LLFloater* opened_floater, bool from_click);
+ virtual void tabClose();
+
+ virtual BOOL selectFloater(LLFloater* floaterp);
+ virtual void selectNextFloater();
+ virtual void selectPrevFloater();
+
+ virtual LLFloater* getActiveFloater();
+ virtual BOOL isFloaterFlashing(LLFloater* floaterp);
+ virtual S32 getFloaterCount();
+
+ virtual void setFloaterFlashing(LLFloater* floaterp, BOOL flashing);
+ virtual BOOL closeAllFloaters(); //Returns FALSE if the floater could not be closed due to pending confirmation dialogs
+ void setTabContainer(LLTabContainerCommon* tab_container) { if (!mTabContainer) mTabContainer = tab_container; }
+ static void onTabSelected(void* userdata, bool);
+
+protected:
+ struct LLFloaterData
+ {
+ S32 mWidth;
+ S32 mHeight;
+ BOOL mCanMinimize;
+ BOOL mCanResize;
+ };
+
+ LLTabContainerCommon* mTabContainer;
+
+ typedef std::map<LLViewHandle, LLFloaterData> floater_data_map_t;
+ floater_data_map_t mFloaterDataMap;
+
+ LLTabContainerCommon::TabPosition mTabPos;
+ BOOL mAutoResize;
+};
+
+
+extern LLFloaterView* gFloaterView;
+
+#endif // LL_FLOATER_H
+