Newer
Older
Steven Bennetts
committed
/**
* @file llchatitemscontainer.cpp
* @brief chat history scrolling panel implementation
*
* $LicenseInfo:firstyear=2009&license=viewerlgpl$
Steven Bennetts
committed
* 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.
Steven Bennetts
committed
*
* 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.
Steven Bennetts
committed
*
* 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
Steven Bennetts
committed
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
Steven Bennetts
committed
* $/LicenseInfo$
*/
#include "llviewerprecompiledheaders.h"
#include "llchatitemscontainerctrl.h"
#include "lltextbox.h"
#include "llchatmsgbox.h"
#include "llavatariconctrl.h"
Vadim ProductEngine
committed
#include "llcommandhandler.h"
Steven Bennetts
committed
#include "llfloaterreg.h"
Richard Nelson
committed
#include "lllocalcliprect.h"
Steven Bennetts
committed
#include "lltrans.h"
Steven Bennetts
committed
#include "llviewercontrol.h"
Steven Bennetts
committed
Yuri Chebotarev
committed
#include "llslurl.h"
static const S32 msg_left_offset = 10;
static const S32 msg_height_pad = 5;
Steven Bennetts
committed
Vadim ProductEngine
committed
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
//*******************************************************************************************************************
// LLObjectHandler
//*******************************************************************************************************************
// handle secondlife:///app/object/<ID>/inspect SLURLs
class LLObjectHandler : public LLCommandHandler
{
public:
LLObjectHandler() : LLCommandHandler("object", UNTRUSTED_BLOCK) { }
bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
{
if (params.size() < 2) return false;
LLUUID object_id;
if (!object_id.set(params[0], FALSE))
{
return false;
}
const std::string verb = params[1].asString();
if (verb == "inspect")
{
LLFloaterReg::showInstance("inspect_object", LLSD().with("object_id", object_id));
return true;
}
return false;
}
};
LLObjectHandler gObjectHandler;
Steven Bennetts
committed
//*******************************************************************************************************************
//LLNearbyChatToastPanel
Steven Bennetts
committed
//*******************************************************************************************************************
LLNearbyChatToastPanel* LLNearbyChatToastPanel::createInstance()
Steven Bennetts
committed
{
item->buildFromFile("panel_chat_item.xml");
Steven Bennetts
committed
return item;
}
void LLNearbyChatToastPanel::reshape (S32 width, S32 height, BOOL called_from_parent )
Steven Bennetts
committed
{
LLPanel::reshape(width, height,called_from_parent);
LLUICtrl* msg_text = getChild<LLUICtrl>("msg_text", false);
LLUICtrl* icon = getChild<LLUICtrl>("avatar_icon", false);
LLRect msg_text_rect = msg_text->getRect();
LLRect avatar_rect = icon->getRect();
avatar_rect.setLeftTopAndSize(2,height-2,avatar_rect.getWidth(),avatar_rect.getHeight());
icon->setRect(avatar_rect);
msg_text_rect.setLeftTopAndSize( avatar_rect.mRight + msg_left_offset,
height - msg_height_pad,
width - avatar_rect.mRight - msg_left_offset - msg_right_offset,
height - 2*msg_height_pad);
msg_text->reshape( msg_text_rect.getWidth(), msg_text_rect.getHeight(), 1);
msg_text->setRect(msg_text_rect);
Steven Bennetts
committed
}
Steven Bennetts
committed
{
return LLPanel::postBuild();
}
void LLNearbyChatToastPanel::addMessage(LLSD& notification)
Steven Bennetts
committed
{
std::string messageText = notification["message"].asString(); // UTF-8 line of text
Steven Bennetts
committed
LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false);
Steven Bennetts
committed
std::string color_name = notification["text_color"].asString();
LLColor4 textColor = LLUIColorTable::instance().getColor(color_name);
textColor.mV[VALPHA] =notification["color_alpha"].asReal();
S32 font_size = notification["font_size"].asInteger();
Steven Bennetts
committed
LLFontGL* messageFont;
switch(font_size)
{
case 0: messageFont = LLFontGL::getFontSansSerifSmall(); break;
default:
case 1: messageFont = LLFontGL::getFontSansSerif(); break;
case 2: messageFont = LLFontGL::getFontSansSerifBig(); break;
}
Steven Bennetts
committed
//append text
{
LLStyle::Params style_params;
style_params.color(textColor);
std::string font_name = LLFontGL::nameFromFont(messageFont);
std::string font_style_size = LLFontGL::sizeFromFont(messageFont);
style_params.font.name(font_name);
style_params.font.size(font_style_size);
Steven Bennetts
committed
int chat_type = notification["chat_type"].asInteger();
if(notification["chat_style"].asInteger()== CHAT_STYLE_IRC)
{
style_params.font.style = "ITALIC";
}
else if( chat_type == CHAT_TYPE_SHOUT)
{
style_params.font.style = "BOLD";
}
else if( chat_type == CHAT_TYPE_WHISPER)
{
style_params.font.style = "ITALIC";
}
msg_text->appendText(messageText, TRUE, style_params);
}
snapToMessageHeight();
Steven Bennetts
committed
}
Steven Bennetts
committed
{
std::string messageText = notification["message"].asString(); // UTF-8 line of text
std::string fromName = notification["from"].asString(); // agent or object name
mFromID = notification["from_id"].asUUID(); // agent id or object id
Igor Borovkov
committed
mFromName = fromName;
int sType = notification["source"].asInteger();
mSourceType = (EChatSourceType)sType;
std::string color_name = notification["text_color"].asString();
LLColor4 textColor = LLUIColorTable::instance().getColor(color_name);
textColor.mV[VALPHA] =notification["color_alpha"].asReal();
S32 font_size = notification["font_size"].asInteger();
LLFontGL* messageFont;
switch(font_size)
{
case 0: messageFont = LLFontGL::getFontSansSerifSmall(); break;
case 1: messageFont = LLFontGL::getFontSansSerif(); break;
case 2: messageFont = LLFontGL::getFontSansSerifBig(); break;
LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false);
msg_text->setText(std::string(""));
if ( notification["chat_style"].asInteger() != CHAT_STYLE_IRC )
{
std::string str_sender;
Vadim ProductEngine
committed
str_sender = fromName;
Steven Bennetts
committed
str_sender+=" ";
Vadim ProductEngine
committed
//append sender name
if (mSourceType == CHAT_SOURCE_AGENT || mSourceType == CHAT_SOURCE_OBJECT)
{
LLStyle::Params style_params_name;
Seth ProductEngine
committed
LLColor4 user_name_color = LLUIColorTable::instance().getColor("HTMLLinkColor");
style_params_name.color(user_name_color);
std::string font_name = LLFontGL::nameFromFont(messageFont);
std::string font_style_size = LLFontGL::sizeFromFont(messageFont);
style_params_name.font.name(font_name);
style_params_name.font.size(font_style_size);
Vadim ProductEngine
committed
style_params_name.link_href = notification["sender_slurl"].asString();
Vadim ProductEngine
committed
style_params_name.is_link = true;
Yuri Chebotarev
committed
msg_text->appendText(str_sender, FALSE, style_params_name);
}
Vadim ProductEngine
committed
else
{
msg_text->appendText(str_sender, false);
}
LLStyle::Params style_params;
style_params.color(textColor);
std::string font_name = LLFontGL::nameFromFont(messageFont);
std::string font_style_size = LLFontGL::sizeFromFont(messageFont);
style_params.font.name(font_name);
style_params.font.size(font_style_size);
int chat_type = notification["chat_type"].asInteger();
if(notification["chat_style"].asInteger()== CHAT_STYLE_IRC)
style_params.font.style = "ITALIC";
else if( chat_type == CHAT_TYPE_SHOUT)
{
style_params.font.style = "BOLD";
}
else if( chat_type == CHAT_TYPE_WHISPER)
{
style_params.font.style = "ITALIC";
}
msg_text->appendText(messageText, FALSE, style_params);
snapToMessageHeight();
mIsDirty = true;//will set Avatar Icon in draw
}
void LLNearbyChatToastPanel::snapToMessageHeight ()
LLChatMsgBox* text_box = getChild<LLChatMsgBox>("msg_text", false);
S32 new_height = llmax (text_box->getTextPixelHeight() + 2*text_box->getVPad() + 2*msg_height_pad, 25);
panel_rect.setLeftTopAndSize( panel_rect.mLeft, panel_rect.mTop, panel_rect.getWidth(), new_height);
reshape( getRect().getWidth(), getRect().getHeight(), 1);
void LLNearbyChatToastPanel::onMouseLeave (S32 x, S32 y, MASK mask)
Steven Bennetts
committed
{
}
void LLNearbyChatToastPanel::onMouseEnter (S32 x, S32 y, MASK mask)
Steven Bennetts
committed
{
Steven Bennetts
committed
}
BOOL LLNearbyChatToastPanel::handleMouseDown (S32 x, S32 y, MASK mask)
Yuri Chebotarev
committed
{
return LLPanel::handleMouseDown(x,y,mask);
}
BOOL LLNearbyChatToastPanel::handleMouseUp (S32 x, S32 y, MASK mask)
Steven Bennetts
committed
{
Ychebotarev ProductEngine
committed
/*
fix for request EXT-4780
leaving this commented since I don't remember why ew block those messages...
Yuri Chebotarev
committed
return LLPanel::handleMouseUp(x,y,mask);
Ychebotarev ProductEngine
committed
*/
Yuri Chebotarev
committed
LLChatMsgBox* text_box = getChild<LLChatMsgBox>("msg_text", false);
S32 local_x = x - text_box->getRect().mLeft;
S32 local_y = y - text_box->getRect().mBottom;
//if text_box process mouse up (ussually this is click on url) - we didn't show nearby_chat.
if (text_box->pointInView(local_x, local_y) )
{
if (text_box->handleMouseUp(local_x,local_y,mask) == TRUE)
return TRUE;
else
{
Yuri Chebotarev
committed
return FALSE;
}
}
Yuri Chebotarev
committed
return LLPanel::handleMouseUp(x,y,mask);
Steven Bennetts
committed
}
void LLNearbyChatToastPanel::setHeaderVisibility(EShowItemHeader e)
Steven Bennetts
committed
{
LLUICtrl* icon = getChild<LLUICtrl>("avatar_icon", false);
if(icon)
icon->setVisible(e == CHATITEMHEADER_SHOW_ONLY_ICON || e==CHATITEMHEADER_SHOW_BOTH);
Steven Bennetts
committed
}
Steven Bennetts
committed
{
LLChatMsgBox* msg_text = findChild<LLChatMsgBox>("msg_text");
if(!msg_text)
return false;
James Cook
committed
return msg_text->getLineCount()<10;
Steven Bennetts
committed
}
BOOL LLNearbyChatToastPanel::handleRightMouseDown(S32 x, S32 y, MASK mask)
LLUICtrl* avatar_icon = getChild<LLUICtrl>("avatar_icon", false);
S32 local_x = x - avatar_icon->getRect().mLeft;
S32 local_y = y - avatar_icon->getRect().mBottom;
if(avatar_icon->pointInView(local_x, local_y) && mSourceType != CHAT_SOURCE_AGENT)
return TRUE;
return LLPanel::handleRightMouseDown(x,y,mask);
}
Steven Bennetts
committed
{
Steven Bennetts
committed
{
LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon", false);
if(icon)
{
icon->setDrawTooltip(mSourceType == CHAT_SOURCE_AGENT);
Yuri Chebotarev
committed
if(mSourceType == CHAT_SOURCE_OBJECT)
icon->setValue(LLSD("OBJECT_Icon"));
Dmitry Zaporozhan
committed
else if(mSourceType == CHAT_SOURCE_SYSTEM)
icon->setValue(LLSD("SL_Logo"));
Yuri Chebotarev
committed
else if(mSourceType == CHAT_SOURCE_AGENT)
icon->setValue(mFromID);
else if(!mFromID.isNull())
icon->setValue(mFromID);
}