diff options
Diffstat (limited to 'indra/newview/llchatmsgbox.cpp')
-rw-r--r-- | indra/newview/llchatmsgbox.cpp | 110 |
1 files changed, 41 insertions, 69 deletions
diff --git a/indra/newview/llchatmsgbox.cpp b/indra/newview/llchatmsgbox.cpp index bd0c36b44a..6eaafc9059 100644 --- a/indra/newview/llchatmsgbox.cpp +++ b/indra/newview/llchatmsgbox.cpp @@ -39,88 +39,60 @@ static LLDefaultChildRegistry::Register<LLChatMsgBox> r("text_chat"); -LLChatMsgBox::Params::Params() : - block_spacing("block_spacing", 10) +class ChatSeparator : public LLTextSegment { - line_spacing = 4; -} +public: + ChatSeparator(S32 start, S32 end) + : LLTextSegment(start, end), + mEditor(NULL) + {} -LLChatMsgBox::LLChatMsgBox(const Params& p) : - LLTextBox(p), - mBlockSpacing(p.block_spacing) -{} + /*virtual*/ void linkToDocument(class LLTextBase* editor) + { + mEditor = editor; + } -void LLChatMsgBox::addText( const LLStringExplicit& text ) -{ - LLWString t = mText.getWString(); - if (! t.empty()) + /*virtual*/ void unlinkFromDocument(class LLTextBase* editor) { - t += '\n'; + mEditor = NULL; } - t += getWrappedText(text); - LLTextBox::setText(wstring_to_utf8str(t)); - mSeparatorOffset.push_back(getLength()); -} -void LLChatMsgBox::setText(const LLStringExplicit& text) -{ - mSeparatorOffset.clear(); - mText.clear(); - addText(text); -} + /*virtual*/ S32 getWidth(S32 first_char, S32 num_chars) const + { + return mEditor->getDocumentPanel()->getRect().getWidth(); + } -void LLChatMsgBox::setValue(const LLSD& value ) -{ - setText(value.asString()); -} + /*virtual*/ F32 draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRect& draw_rect) + { + gl_line_2d(draw_rect.mLeft + 5, draw_rect.getCenterY(), draw_rect.mRight - 5, draw_rect.getCenterY(), LLColor4::grey); + return draw_rect.getWidth(); + } + +private: + LLTextBase* mEditor; +}; -S32 LLChatMsgBox::getTextPixelHeight() -{ - S32 num_blocks = mSeparatorOffset.size(); - S32 num_lines = getTextLinesNum(); - return (S32)(num_lines * mDefaultFont->getLineHeight() + \ - (num_lines-1) * mLineSpacing + \ - (num_blocks-1) * mBlockSpacing + \ - 2 * mLineSpacing); -} -S32 LLChatMsgBox::getTextLinesNum() +LLChatMsgBox::Params::Params() : + block_spacing("block_spacing", 10) { - S32 num_lines = getLineCount(); - if (num_lines < 1) - { - num_lines = 1; - } - - return num_lines; + line_spacing.pixels = 4; } -void LLChatMsgBox::drawText(S32 x, S32 y, const LLWString &text, const LLColor4 &color) -{ - S32 start = 0; - S32 width = getRect().getWidth()-10; +LLChatMsgBox::LLChatMsgBox(const Params& p) : + LLTextBox(p), + mBlockSpacing(p.block_spacing) +{} - // iterate through each block of text that has been added - y -= mLineSpacing; - for (std::vector<S32>::iterator it = mSeparatorOffset.begin(); it != mSeparatorOffset.end() ;) +void LLChatMsgBox::addText( const LLStringExplicit& text ) +{ + S32 length = getLength(); + // if there is existing text, add a separator + if (length > 0) { - // display the text for this block - S32 num_chars = *it - start; - LLWString text = mDisplayText.substr(start, num_chars); - LLTextBox::drawText(x, y, text, color); - - // exit the loop if this is the last text block - start += num_chars + 1; // skip the newline - if (++it == mSeparatorOffset.end()) - { - break; - } - - // output a separator line between blocks - S32 num_lines = std::count(text.begin(), text.end(), '\n') + 1; - y -= num_lines * (llfloor(mDefaultFont->getLineHeight()) + mLineSpacing); - S32 sep_y = y - mBlockSpacing/2 + mLineSpacing/2; - gl_line_2d(5, sep_y, width, sep_y, LLColor4::grey); - y -= mBlockSpacing; + // chat separator exists right before the null terminator + insertSegment(new ChatSeparator(length - 1, length - 1)); } + // prepend newline only if there is some existing text + appendText(text, length > 0); } |