/** * @file llconsole.h * @brief a simple console-style output device * * $LicenseInfo:firstyear=2001&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2010, Linden Research, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License only. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ #ifndef LL_LLCONSOLE_H #define LL_LLCONSOLE_H #include "llfixedbuffer.h" #include "lluictrl.h" #include "v4color.h" #include class LLSD; class LLConsole : public LLFixedBuffer, public LLUICtrl, public LLInstanceTracker { public: typedef enum e_font_size { MONOSPACE = -1, SMALL = 0, BIG = 1 } EFontSize; struct Params : public LLInitParam::Block { Optional max_lines; Optional persist_time; Optional font_size_index; Optional parse_urls; // If lines should be parsed for URLs Optional background_image; // Configurable background for different console types Optional session_support; // Session support Params() : max_lines("max_lines", LLUI::getInstance()->mSettingGroups["config"]->getS32("ConsoleMaxLines")), persist_time("persist_time", 0.f), // forever font_size_index("font_size_index"), parse_urls("parse_urls", false), // If lines should be parsed for URLs background_image("background_image", "Console_Background"), // Configurable background for different console types session_support("session_support", false) // Session support { changeDefault(mouse_opaque, false); } }; protected: LLConsole(const Params&); friend class LLUICtrlFactory; public: // call once per frame to pull data out of LLFixedBuffer static void updateClass(); //A paragraph color segment defines the color of text in a line //of text that was received for console display. It has no //notion of line wraps, screen position, or the text it contains. //It is only the number of characters that are a color and the //color. struct ParagraphColorSegment { S32 mNumChars; LLColor4 mColor; }; //A line color segment is a chunk of text, the color associated //with it, and the X Position it was calculated to begin at //on the screen. X Positions are re-calculated if the //screen changes size. class LineColorSegment { public: LineColorSegment(LLWString text, LLColor4 color, F32 xpos) : mText(text), mColor(color), mXPosition(xpos) {} public: LLWString mText; LLColor4 mColor; F32 mXPosition; }; typedef std::list line_color_segments_t; //A line is composed of one or more color segments. class Line { public: line_color_segments_t mLineColorSegments; // Added styleflags member for fontstyle customization LLFontGL::StyleFlags mStyleFlags; }; typedef std::list lines_t; typedef std::list paragraph_color_segments_t; //A paragraph is a processed element containing the entire text of the //message (used for recalculating positions on screen resize) //The time this message was added to the console output //The visual screen width of the longest line in this block //And a list of one or more lines which are used to display this message. class Paragraph { public: // Added styleflags parameter for style customization //Paragraph (LLWString str, const LLColor4 &color, F32 add_time, const LLFontGL* font, F32 screen_width); Paragraph (LLWString str, const LLColor4 &color, F32 add_time, const LLFontGL* font, F32 screen_width, LLFontGL::StyleFlags styleflags, const LLUUID& session_id, bool parse_urls, LLConsole* console); // void makeParagraphColorSegments ( const LLColor4 &color); // Added styleflags parameter for style customization //void updateLines ( F32 screen_width, const LLFontGL* font, bool force_resize=false ); void updateLines ( F32 screen_width, const LLFontGL* font, LLFontGL::StyleFlags styleflags, bool force_resize=false ); // public: LLWString mParagraphText; //The entire text of the paragraph paragraph_color_segments_t mParagraphColorSegments; F32 mAddTime; //Time this paragraph was added to the display. F32 mMaxWidth; //Width of the widest line of text in this paragraph. lines_t mLines; LLUUID mSessionID; // Session support // Parse SLURLs LLUUID mID; LLWString mSourceText; std::map mUrlLabels; // }; //The console contains a deque of paragraphs which represent the individual messages. typedef std::deque paragraph_t; paragraph_t mParagraphs; ~LLConsole(){}; // each line lasts this long after being added void setLinePersistTime(F32 seconds); void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE); // -1 = monospace, 0 means small, font size = 1 means big void setFontSize(S32 size_index); // Overrides /*virtual*/ void draw(); // Chat console void addConsoleLine(const std::string& utf8line, const LLColor4 &color, const LLUUID& session_id = LLUUID::null, LLFontGL::StyleFlags styleflags = LLFontGL::NORMAL); void addConsoleLine(const LLWString& wline, const LLColor4 &color, const LLUUID& session_id = LLUUID::null, LLFontGL::StyleFlags styleflags = LLFontGL::NORMAL); void clear(); void addSession(const LLUUID& session_id); void removeSession(const LLUUID& session_id); std::deque mLineColors; std::deque mLineStyle; std::deque mSessionIDs; protected: /*virtual*/ void removeExtraLines(); void onUrlLabelCallback(const LLUUID& paragraph_id, const std::string& url, const std::string& label); // private: void update(); F32 mLinePersistTime; // Age at which to stop drawing. F32 mFadeTime; // Age at which to start fading const LLFontGL* mFont; S32 mConsoleWidth; S32 mConsoleHeight; bool mParseUrls; // If lines should be parsed for URLs LLUIImagePtr mBackgroundImage; // Configurable background for different console types // Session support std::set mCurrentSessions; bool mSessionSupport; // }; extern LLConsole* gConsole; #endif