summaryrefslogtreecommitdiff
path: root/indra/newview/llimfloater.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llimfloater.cpp')
-rw-r--r--indra/newview/llimfloater.cpp660
1 files changed, 323 insertions, 337 deletions
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index f5cda52d44..c99da9e9c1 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -28,6 +28,7 @@
#include "llimfloater.h"
+#include "lldraghandle.h"
#include "llnotificationsutil.h"
#include "llagent.h"
@@ -40,35 +41,31 @@
#include "llfloaterreg.h"
#include "llimfloatercontainer.h" // to replace separate IM Floaters with multifloater container
#include "llinventoryfunctions.h"
-#include "lllayoutstack.h"
+//#include "lllayoutstack.h"
#include "lllineeditor.h"
#include "lllogchat.h"
-#include "llpanelimcontrolpanel.h"
#include "llscreenchannel.h"
#include "llsyswellwindow.h"
#include "lltrans.h"
#include "llchathistory.h"
#include "llnotifications.h"
#include "llviewerwindow.h"
-#include "llvoicechannel.h"
#include "lltransientfloatermgr.h"
#include "llinventorymodel.h"
#include "llrootview.h"
#include "llspeakers.h"
#include "llviewerchat.h"
-
+#include "llnotificationmanager.h"
LLIMFloater::LLIMFloater(const LLUUID& session_id)
- : LLTransientDockableFloater(NULL, true, session_id),
- mControlPanel(NULL),
- mSessionID(session_id),
+ : LLIMConversation(session_id),
mLastMessageIndex(-1),
mDialog(IM_NOTHING_SPECIAL),
- mChatHistory(NULL),
mInputEditor(NULL),
mSavedTitle(),
mTypingStart(),
mShouldSendTypingState(false),
+ mChatHistory(NULL),
mMeTyping(false),
mOtherTyping(false),
mTypingTimer(),
@@ -76,35 +73,15 @@ LLIMFloater::LLIMFloater(const LLUUID& session_id)
mPositioned(false),
mSessionInitialized(false)
{
- LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(mSessionID);
- if (im_session)
+ mIsNearbyChat = false;
+
+ mSession = LLIMModel::getInstance()->findIMSession(mSessionID);
+
+ if (mSession)
{
- mSessionInitialized = im_session->mSessionInitialized;
-
- mDialog = im_session->mType;
- switch(mDialog){
- case IM_NOTHING_SPECIAL:
- case IM_SESSION_P2P_INVITE:
- mFactoryMap["panel_im_control_panel"] = LLCallbackMap(createPanelIMControl, this);
- break;
- case IM_SESSION_CONFERENCE_START:
- mFactoryMap["panel_im_control_panel"] = LLCallbackMap(createPanelAdHocControl, this);
- break;
- case IM_SESSION_GROUP_START:
- mFactoryMap["panel_im_control_panel"] = LLCallbackMap(createPanelGroupControl, this);
- break;
- case IM_SESSION_INVITE:
- if (gAgent.isInGroup(mSessionID))
- {
- mFactoryMap["panel_im_control_panel"] = LLCallbackMap(createPanelGroupControl, this);
- }
- else
- {
- mFactoryMap["panel_im_control_panel"] = LLCallbackMap(createPanelAdHocControl, this);
- }
- break;
- default: break;
- }
+ mIsP2PChat = mSession->isP2PSessionType();
+ mSessionInitialized = mSession->mSessionInitialized;
+ mDialog = mSession->mType;
}
setOverlapsScreenChannel(true);
@@ -116,7 +93,7 @@ LLIMFloater::LLIMFloater(const LLUUID& session_id)
void LLIMFloater::onFocusLost()
{
LLIMModel::getInstance()->resetActiveSessionID();
-
+
LLChicletBar::getInstance()->getChicletPanel()->setChicletToggleState(mSessionID, false);
}
@@ -146,17 +123,16 @@ void LLIMFloater::onClose(bool app_quitting)
}
/* static */
-void LLIMFloater::newIMCallback(const LLSD& data){
-
+void LLIMFloater::newIMCallback(const LLSD& data)
+{
if (data["num_unread"].asInteger() > 0 || data["from_id"].asUUID().isNull())
{
LLUUID session_id = data["session_id"].asUUID();
LLIMFloater* floater = LLFloaterReg::findTypedInstance<LLIMFloater>("impanel", session_id);
- if (floater == NULL) return;
// update if visible, otherwise will be updated when opened
- if (floater->getVisible())
+ if (floater && floater->getVisible())
{
floater->updateMessages();
}
@@ -189,73 +165,64 @@ void LLIMFloater::onSendMsg( LLUICtrl* ctrl, void* userdata )
void LLIMFloater::sendMsg()
{
- if (!gAgent.isGodlike()
- && (mDialog == IM_NOTHING_SPECIAL)
- && mOtherParticipantUUID.isNull())
- {
- llinfos << "Cannot send IM to everyone unless you're a god." << llendl;
- return;
- }
-
- if (mInputEditor)
+ if (gAgent.isGodlike()
+ || (mDialog != IM_NOTHING_SPECIAL)
+ || !mOtherParticipantUUID.isNull())
{
- LLWString text = mInputEditor->getConvertedText();
- if(!text.empty())
+ if (mInputEditor)
{
- // Truncate and convert to UTF8 for transport
- std::string utf8_text = wstring_to_utf8str(text);
- utf8_text = utf8str_truncate(utf8_text, MAX_MSG_BUF_SIZE - 1);
-
- if (mSessionInitialized)
- {
- LLIMModel::sendMessage(utf8_text, mSessionID,
- mOtherParticipantUUID,mDialog);
- }
- else
+ LLWString text = mInputEditor->getConvertedText();
+ if(!text.empty())
{
- //queue up the message to send once the session is initialized
- mQueuedMsgsForInit.append(utf8_text);
- }
+ // Truncate and convert to UTF8 for transport
+ std::string utf8_text = wstring_to_utf8str(text);
+ utf8_text = utf8str_truncate(utf8_text, MAX_MSG_BUF_SIZE - 1);
+
+ if (mSessionInitialized)
+ {
+ LLIMModel::sendMessage(utf8_text, mSessionID, mOtherParticipantUUID, mDialog);
+ }
+ else
+ {
+ //queue up the message to send once the session is initialized
+ mQueuedMsgsForInit.append(utf8_text);
+ }
- mInputEditor->setText(LLStringUtil::null);
+ mInputEditor->setText(LLStringUtil::null);
- updateMessages();
+ updateMessages();
+ }
}
}
+ else
+ {
+ llinfos << "Cannot send IM to everyone unless you're a god." << llendl;
+ }
}
-
-
LLIMFloater::~LLIMFloater()
{
+ mVoiceChannelStateChangeConnection.disconnect();
+ if(LLVoiceClient::instanceExists())
+ {
+ LLVoiceClient::getInstance()->removeObserver(this);
+ }
+
LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::IM, this);
}
//virtual
BOOL LLIMFloater::postBuild()
{
- // User-resizable control panels in P2P sessions look ugly (EXT-3470).
- if (mDialog == IM_NOTHING_SPECIAL || mDialog == IM_SESSION_P2P_INVITE)
- {
- getChild<LLLayoutStack>("im_panels")->setPanelUserResize("panel_im_control_panel", FALSE);
- }
-
- const LLUUID& other_party_id = LLIMModel::getInstance()->getOtherParticipantID(mSessionID);
+ const LLUUID& other_party_id =
+ LLIMModel::getInstance()->getOtherParticipantID(mSessionID);
if (other_party_id.notNull())
{
mOtherParticipantUUID = other_party_id;
}
- mControlPanel->setSessionId(mSessionID);
- mControlPanel->getParent()->setVisible(gSavedSettings.getBOOL("IMShowControlPanel"));
-
- LLButton* slide_left = getChild<LLButton>("slide_left_btn");
- slide_left->setVisible(mControlPanel->getParent()->getVisible());
- slide_left->setClickedCallback(boost::bind(&LLIMFloater::onSlide, this));
+ boundVoiceChannel();
- LLButton* slide_right = getChild<LLButton>("slide_right_btn");
- slide_right->setVisible(!mControlPanel->getParent()->getVisible());
- slide_right->setClickedCallback(boost::bind(&LLIMFloater::onSlide, this));
mInputEditor = getChild<LLLineEditor>("chat_editor");
mInputEditor->setMaxTextLength(1023);
@@ -282,18 +249,16 @@ BOOL LLIMFloater::postBuild()
mTypingStart = LLTrans::getString("IM_typing_start_string");
// Disable input editor if session cannot accept text
- LLIMModel::LLIMSession* im_session =
- LLIMModel::instance().findIMSession(mSessionID);
- if( im_session && !im_session->mTextIMPossible )
+ if ( mSession && !mSession->mTextIMPossible )
{
mInputEditor->setEnabled(FALSE);
mInputEditor->setLabel(LLTrans::getString("IM_unavailable_text_label"));
}
- if ( im_session && im_session->isP2PSessionType())
+ if (mIsP2PChat)
{
// look up display name for window title
- LLAvatarNameCache::get(im_session->mOtherParticipantID,
+ LLAvatarNameCache::get(mSession->mOtherParticipantID,
boost::bind(&LLIMFloater::onAvatarNameCache,
this, _1, _2));
}
@@ -303,19 +268,88 @@ BOOL LLIMFloater::postBuild()
updateSessionName(session_name, session_name);
}
+ childSetAction("voice_call_btn", boost::bind(&LLIMFloater::onCallButtonClicked, this));
+
+ LLVoiceClient::getInstance()->addObserver(this);
+
//*TODO if session is not initialized yet, add some sort of a warning message like "starting session...blablabla"
//see LLFloaterIMPanel for how it is done (IB)
- if(isChatMultiTab())
+ return LLIMConversation::postBuild();
+}
+
+void LLIMFloater::boundVoiceChannel()
+{
+ LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(mSessionID);
+ if(voice_channel)
{
- return LLFloater::postBuild();
+ mVoiceChannelStateChangeConnection = voice_channel->setStateChangedCallback(
+ boost::bind(&LLIMFloater::onVoiceChannelStateChanged, this, _1, _2));
+
+ //call (either p2p, group or ad-hoc) can be already in started state
+ bool callIsActive = voice_channel->getState() >= LLVoiceChannel::STATE_CALL_STARTED;
+ updateCallBtnState(callIsActive);
+ }
+}
+
+void LLIMFloater::enableDisableCallBtn()
+{
+ bool voice_enabled = LLVoiceClient::getInstance()->voiceEnabled()
+ && LLVoiceClient::getInstance()->isVoiceWorking();
+
+ if (mSession)
+ {
+ bool session_initialized = mSession->mSessionInitialized;
+ bool callback_enabled = mSession->mCallBackEnabled;
+
+ BOOL enable_connect =
+ session_initialized && voice_enabled && callback_enabled;
+ getChildView("voice_call_btn")->setEnabled(enable_connect);
}
else
{
- return LLDockableFloater::postBuild();
+ getChildView("voice_call_btn")->setEnabled(false);
+ }
+}
+
+
+void LLIMFloater::onCallButtonClicked()
+{
+ LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(mSessionID);
+ if (voice_channel)
+ {
+ bool is_call_active = voice_channel->getState() >= LLVoiceChannel::STATE_CALL_STARTED;
+ if (is_call_active)
+ {
+ gIMMgr->endCall(mSessionID);
+ }
+ else
+ {
+ gIMMgr->startCall(mSessionID);
+ }
+ }
+}
+
+/*void LLIMFloater::onOpenVoiceControlsClicked()
+{
+ LLFloaterReg::showInstance("voice_controls");
+}*/
+
+void LLIMFloater::onChange(EStatusType status, const std::string &channelURI, bool proximal)
+{
+ if(status != STATUS_JOINING && status != STATUS_LEFT_CHANNEL)
+ {
+ enableDisableCallBtn();
}
}
+void LLIMFloater::onVoiceChannelStateChanged(
+ const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state)
+{
+ bool callIsActive = new_state >= LLVoiceChannel::STATE_CALL_STARTED;
+ updateCallBtnState(callIsActive);
+}
+
void LLIMFloater::updateSessionName(const std::string& ui_title,
const std::string& ui_label)
{
@@ -334,8 +368,10 @@ void LLIMFloater::onAvatarNameCache(const LLUUID& agent_id,
}
// virtual
-void LLIMFloater::draw()
+BOOL LLIMFloater::tick()
{
+ BOOL parents_retcode = LLIMConversation::tick();
+
if ( mMeTyping )
{
// Time out if user hasn't typed for a while.
@@ -345,49 +381,7 @@ void LLIMFloater::draw()
}
}
- LLTransientDockableFloater::draw();
-}
-
-
-// static
-void* LLIMFloater::createPanelIMControl(void* userdata)
-{
- LLIMFloater *self = (LLIMFloater*)userdata;
- self->mControlPanel = new LLPanelIMControlPanel();
- self->mControlPanel->setXMLFilename("panel_im_control_panel.xml");
- return self->mControlPanel;
-}
-
-
-// static
-void* LLIMFloater::createPanelGroupControl(void* userdata)
-{
- LLIMFloater *self = (LLIMFloater*)userdata;
- self->mControlPanel = new LLPanelGroupControlPanel(self->mSessionID);
- self->mControlPanel->setXMLFilename("panel_group_control_panel.xml");
- return self->mControlPanel;
-}
-
-// static
-void* LLIMFloater::createPanelAdHocControl(void* userdata)
-{
- LLIMFloater *self = (LLIMFloater*)userdata;
- self->mControlPanel = new LLPanelAdHocControlPanel(self->mSessionID);
- self->mControlPanel->setXMLFilename("panel_adhoc_control_panel.xml");
- return self->mControlPanel;
-}
-
-void LLIMFloater::onSlide()
-{
- mControlPanel->getParent()->setVisible(!mControlPanel->getParent()->getVisible());
-
- gSavedSettings.setBOOL("IMShowControlPanel", mControlPanel->getParent()->getVisible());
-
- getChild<LLButton>("slide_left_btn")->setVisible(mControlPanel->getParent()->getVisible());
- getChild<LLButton>("slide_right_btn")->setVisible(!mControlPanel->getParent()->getVisible());
-
- LLLayoutStack* stack = getChild<LLLayoutStack>("im_panels");
- if (stack) stack->setAnimate(true);
+ return parents_retcode;
}
//static
@@ -395,7 +389,8 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id)
{
closeHiddenIMToasts();
- if (!gIMMgr->hasSession(session_id)) return NULL;
+ if (!gIMMgr->hasSession(session_id))
+ return NULL;
if(!isChatMultiTab())
{
@@ -415,7 +410,8 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id)
bool exist = findInstance(session_id);
LLIMFloater* floater = getInstance(session_id);
- if (!floater) return NULL;
+ if (!floater)
+ return NULL;
if(isChatMultiTab())
{
@@ -465,6 +461,22 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id)
return floater;
}
+//static
+LLIMFloater* LLIMFloater::findInstance(const LLUUID& session_id)
+{
+ LLIMFloater* conversation =
+ LLFloaterReg::findTypedInstance<LLIMFloater>("impanel", session_id);
+
+ return conversation;
+}
+
+LLIMFloater* LLIMFloater::getInstance(const LLUUID& session_id)
+{
+ LLIMFloater* conversation =
+ LLFloaterReg::getTypedInstance<LLIMFloater>("impanel", session_id);
+
+ return conversation;
+}
void LLIMFloater::setDocked(bool docked, bool pop_on_undock)
{
@@ -527,9 +539,12 @@ void LLIMFloater::setVisible(BOOL visible)
BOOL LLIMFloater::getVisible()
{
+ bool visible;
+
if(isChatMultiTab())
{
- LLIMFloaterContainer* im_container = LLIMFloaterContainer::getInstance();
+ LLIMFloaterContainer* im_container =
+ LLIMFloaterContainer::getInstance();
// Treat inactive floater as invisible.
bool is_active = im_container->getActiveFloater() == this;
@@ -537,16 +552,21 @@ BOOL LLIMFloater::getVisible()
//torn off floater is always inactive
if (!is_active && getHost() != im_container)
{
- return LLTransientDockableFloater::getVisible();
+ visible = LLTransientDockableFloater::getVisible();
+ }
+ else
+ {
+ // getVisible() returns TRUE when Tabbed IM window is minimized.
+ visible = is_active && !im_container->isMinimized()
+ && im_container->getVisible();
}
-
- // getVisible() returns TRUE when Tabbed IM window is minimized.
- return is_active && !im_container->isMinimized() && im_container->getVisible();
}
else
{
- return LLTransientDockableFloater::getVisible();
+ visible = LLTransientDockableFloater::getVisible();
}
+
+ return visible;
}
//static
@@ -554,7 +574,8 @@ bool LLIMFloater::toggle(const LLUUID& session_id)
{
if(!isChatMultiTab())
{
- LLIMFloater* floater = LLFloaterReg::findTypedInstance<LLIMFloater>("impanel", session_id);
+ LLIMFloater* floater = LLFloaterReg::findTypedInstance<LLIMFloater>(
+ "impanel", session_id);
if (floater && floater->getVisible() && floater->hasFocus())
{
// clicking on chiclet to close floater just hides it to maintain existing
@@ -575,17 +596,6 @@ bool LLIMFloater::toggle(const LLUUID& session_id)
return true;
}
-//static
-LLIMFloater* LLIMFloater::findInstance(const LLUUID& session_id)
-{
- return LLFloaterReg::findTypedInstance<LLIMFloater>("impanel", session_id);
-}
-
-LLIMFloater* LLIMFloater::getInstance(const LLUUID& session_id)
-{
- return LLFloaterReg::getTypedInstance<LLIMFloater>("impanel", session_id);
-}
-
void LLIMFloater::sessionInitReplyReceived(const LLUUID& im_session_id)
{
mSessionInitialized = true;
@@ -595,51 +605,59 @@ void LLIMFloater::sessionInitReplyReceived(const LLUUID& im_session_id)
{
mSessionID = im_session_id;
setKey(im_session_id);
- mControlPanel->setSessionId(im_session_id);
- }
- // updating "Call" button from group control panel here to enable it without placing into draw() (EXT-4796)
- if(gAgent.isInGroup(im_session_id))
- {
- mControlPanel->updateCallButton();
+ boundVoiceChannel();
+
+ mSession = LLIMModel::getInstance()->findIMSession(mSessionID);
+ mIsP2PChat = mSession && mSession->isP2PSessionType();
+
+ buildParticipantList();
}
//*TODO here we should remove "starting session..." warning message if we added it in postBuild() (IB)
-
//need to send delayed messaged collected while waiting for session initialization
- if (!mQueuedMsgsForInit.size()) return;
- LLSD::array_iterator iter;
- for ( iter = mQueuedMsgsForInit.beginArray();
- iter != mQueuedMsgsForInit.endArray();
- ++iter)
+ if (mQueuedMsgsForInit.size())
{
- LLIMModel::sendMessage(iter->asString(), mSessionID,
- mOtherParticipantUUID, mDialog);
+ LLSD::array_iterator iter;
+ for ( iter = mQueuedMsgsForInit.beginArray();
+ iter != mQueuedMsgsForInit.endArray(); ++iter)
+ {
+ LLIMModel::sendMessage(iter->asString(), mSessionID,
+ mOtherParticipantUUID, mDialog);
+ }
}
}
-void LLIMFloater::updateMessages()
+void LLIMFloater::appendMessage(const LLChat& chat, const LLSD &args)
{
- bool use_plain_text_chat_history = gSavedSettings.getBOOL("PlainTextChatHistory");
+ LLChat& tmp_chat = const_cast<LLChat&>(chat);
+
+ if (!chat.mMuted)
+ {
+ tmp_chat.mFromName = chat.mFromName;
+ LLSD chat_args;
+ if (args) chat_args = args;
+ chat_args["use_plain_text_chat_history"] =
+ gSavedSettings.getBOOL("PlainTextChatHistory");
+ chat_args["show_time"] = gSavedSettings.getBOOL("IMShowTime");
+ chat_args["show_names_for_p2p_conv"] = !mIsP2PChat
+ || gSavedSettings.getBOOL("IMShowNamesForP2PConv");
+
+ mChatHistory->appendMessage(chat, chat_args);
+ }
+}
+void LLIMFloater::updateMessages()
+{
std::list<LLSD> messages;
// we shouldn't reset unread message counters if IM floater doesn't have focus
- if (hasFocus())
- {
- LLIMModel::instance().getMessages(mSessionID, messages, mLastMessageIndex+1);
- }
- else
- {
- LLIMModel::instance().getMessagesSilently(mSessionID, messages, mLastMessageIndex+1);
- }
+ LLIMModel::instance().getMessages(
+ mSessionID, messages, mLastMessageIndex + 1, hasFocus());
if (messages.size())
{
- LLSD chat_args;
- chat_args["use_plain_text_chat_history"] = use_plain_text_chat_history;
-
std::ostringstream message;
std::list<LLSD>::const_reverse_iterator iter = messages.rbegin();
std::list<LLSD>::const_reverse_iterator iter_end = messages.rend();
@@ -689,23 +707,23 @@ void LLIMFloater::updateMessages()
chat.mText = message;
}
- mChatHistory->appendMessage(chat, chat_args);
+ appendMessage(chat);
mLastMessageIndex = msg["index"].asInteger();
// if it is a notification - next message is a notification history log, so skip it
if (chat.mNotifId.notNull() && LLNotificationsUtil::find(chat.mNotifId) != NULL)
{
if (++iter == iter_end)
- {
- break;
- }
- else
- {
- mLastMessageIndex++;
- }
- }
- }
- }
+ {
+ break;
+ }
+ else
+ {
+ mLastMessageIndex++;
+ }
+ }
+ }
+ }
}
void LLIMFloater::reloadMessages()
@@ -713,6 +731,7 @@ void LLIMFloater::reloadMessages()
mChatHistory->clear();
mLastMessageIndex = -1;
updateMessages();
+ mInputEditor->setFont(LLViewerChat::getChatFont());
}
// static
@@ -741,28 +760,22 @@ void LLIMFloater::onInputEditorFocusLost(LLFocusableElement* caller, void* userd
// static
void LLIMFloater::onInputEditorKeystroke(LLLineEditor* caller, void* userdata)
{
- LLIMFloater* self = (LLIMFloater*)userdata;
+ LLIMFloater* self = (LLIMFloater*) userdata;
std::string text = self->mInputEditor->getText();
- if (!text.empty())
- {
- self->setTyping(true);
- }
- else
- {
- // Deleting all text counts as stopping typing.
- self->setTyping(false);
- }
+
+ // Deleting all text counts as stopping typing.
+ self->setTyping(!text.empty());
}
void LLIMFloater::setTyping(bool typing)
{
- if ( typing )
+ if (typing)
{
// Started or proceeded typing, reset the typing timeout timer
mTypingTimeoutTimer.reset();
}
- if ( mMeTyping != typing )
+ if (mMeTyping != typing)
{
// Typing state is changed
mMeTyping = typing;
@@ -774,34 +787,32 @@ void LLIMFloater::setTyping(bool typing)
// Don't want to send typing indicators to multiple people, potentially too
// much network traffic. Only send in person-to-person IMs.
- if ( mShouldSendTypingState && mDialog == IM_NOTHING_SPECIAL )
+ if (mShouldSendTypingState && mDialog == IM_NOTHING_SPECIAL)
{
- if ( mMeTyping )
+ // Still typing, send 'start typing' notification or
+ // send 'stop typing' notification immediately
+ if (!mMeTyping || mTypingTimer.getElapsedTimeF32() > 1.f)
{
- if ( mTypingTimer.getElapsedTimeF32() > 1.f )
- {
- // Still typing, send 'start typing' notification
- LLIMModel::instance().sendTypingState(mSessionID, mOtherParticipantUUID, TRUE);
- mShouldSendTypingState = false;
- }
- }
- else
- {
- // Send 'stop typing' notification immediately
- LLIMModel::instance().sendTypingState(mSessionID, mOtherParticipantUUID, FALSE);
+ LLIMModel::instance().sendTypingState(mSessionID,
+ mOtherParticipantUUID, mMeTyping);
mShouldSendTypingState = false;
+
}
}
- LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
- if (speaker_mgr)
- speaker_mgr->setSpeakerTyping(gAgent.getID(), FALSE);
-
+ if (!mIsNearbyChat)
+ {
+ LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
+ if (speaker_mgr)
+ {
+ speaker_mgr->setSpeakerTyping(gAgent.getID(), FALSE);
+ }
+ }
}
void LLIMFloater::processIMTyping(const LLIMInfo* im_info, BOOL typing)
{
- if ( typing )
+ if (typing)
{
// other user started typing
addTypingIndicator(im_info);
@@ -815,9 +826,7 @@ void LLIMFloater::processIMTyping(const LLIMInfo* im_info, BOOL typing)
void LLIMFloater::processAgentListUpdates(const LLSD& body)
{
- if ( !body.isMap() ) return;
-
- if ( body.has("agent_updates") && body["agent_updates"].isMap() )
+ if (body.isMap() && body.has("agent_updates") && body["agent_updates"].isMap())
{
LLSD agent_data = body["agent_updates"].get(gAgentID.asString());
if (agent_data.isMap() && agent_data.has("info"))
@@ -826,7 +835,7 @@ void LLIMFloater::processAgentListUpdates(const LLSD& body)
if (agent_info.has("mutes"))
{
- BOOL moderator_muted_text = agent_info["mutes"]["text"].asBoolean();
+ BOOL moderator_muted_text = agent_info["mutes"]["text"].asBoolean();
mInputEditor->setEnabled(!moderator_muted_text);
std::string label;
if (moderator_muted_text)
@@ -842,42 +851,19 @@ void LLIMFloater::processAgentListUpdates(const LLSD& body)
}
}
-void LLIMFloater::updateChatHistoryStyle()
-{
- mChatHistory->clear();
- mLastMessageIndex = -1;
- updateMessages();
-}
-
-void LLIMFloater::processChatHistoryStyleUpdate(const LLSD& newvalue)
-{
- LLFontGL* font = LLViewerChat::getChatFont();
- LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("impanel");
- for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin();
- iter != inst_list.end(); ++iter)
- {
- LLIMFloater* floater = dynamic_cast<LLIMFloater*>(*iter);
- if (floater)
- {
- floater->updateChatHistoryStyle();
- floater->mInputEditor->setFont(font);
- }
- }
-
-}
-
void LLIMFloater::processSessionUpdate(const LLSD& session_update)
{
// *TODO : verify following code when moderated mode will be implemented
- if ( false && session_update.has("moderated_mode") &&
- session_update["moderated_mode"].has("voice") )
+ if (false && session_update.has("moderated_mode") &&
+ session_update["moderated_mode"].has("voice"))
{
BOOL voice_moderated = session_update["moderated_mode"]["voice"];
const std::string session_label = LLIMModel::instance().getName(mSessionID);
if (voice_moderated)
{
- setTitle(session_label + std::string(" ") + LLTrans::getString("IM_moderated_chat_label"));
+ setTitle(session_label + std::string(" ")
+ + LLTrans::getString("IM_moderated_chat_label"));
}
else
{
@@ -891,15 +877,14 @@ void LLIMFloater::processSessionUpdate(const LLSD& session_update)
}
BOOL LLIMFloater::handleDragAndDrop(S32 x, S32 y, MASK mask,
- BOOL drop, EDragAndDropType cargo_type,
- void *cargo_data, EAcceptance *accept,
- std::string& tooltip_msg)
+ BOOL drop, EDragAndDropType cargo_type,
+ void *cargo_data, EAcceptance *accept,
+ std::string& tooltip_msg)
{
-
if (mDialog == IM_NOTHING_SPECIAL)
{
LLToolDragAndDrop::handleGiveDragAndDrop(mOtherParticipantUUID, mSessionID, drop,
- cargo_type, cargo_data, accept);
+ cargo_type, cargo_data, accept);
}
// handle case for dropping calling cards (and folders of calling cards) onto invitation panel for invites
@@ -909,14 +894,14 @@ BOOL LLIMFloater::handleDragAndDrop(S32 x, S32 y, MASK mask,
if (cargo_type == DAD_CALLINGCARD)
{
- if (dropCallingCard((LLInventoryItem*)cargo_data, drop))
+ if (dropCallingCard((LLInventoryItem*) cargo_data, drop))
{
*accept = ACCEPT_YES_MULTI;
}
}
else if (cargo_type == DAD_CATEGORY)
{
- if (dropCategory((LLInventoryCategory*)cargo_data, drop))
+ if (dropCategory((LLInventoryCategory*) cargo_data, drop))
{
*accept = ACCEPT_YES_MULTI;
}
@@ -928,9 +913,9 @@ BOOL LLIMFloater::handleDragAndDrop(S32 x, S32 y, MASK mask,
BOOL LLIMFloater::dropCallingCard(LLInventoryItem* item, BOOL drop)
{
BOOL rv = isInviteAllowed();
- if(rv && item && item->getCreatorUUID().notNull())
+ if (rv && item && item->getCreatorUUID().notNull())
{
- if(drop)
+ if (drop)
{
uuid_vec_t ids;
ids.push_back(item->getCreatorUUID());
@@ -948,26 +933,26 @@ BOOL LLIMFloater::dropCallingCard(LLInventoryItem* item, BOOL drop)
BOOL LLIMFloater::dropCategory(LLInventoryCategory* category, BOOL drop)
{
BOOL rv = isInviteAllowed();
- if(rv && category)
+ if (rv && category)
{
LLInventoryModel::cat_array_t cats;
LLInventoryModel::item_array_t items;
LLUniqueBuddyCollector buddies;
gInventory.collectDescendentsIf(category->getUUID(),
- cats,
- items,
- LLInventoryModel::EXCLUDE_TRASH,
- buddies);
+ cats,
+ items,
+ LLInventoryModel::EXCLUDE_TRASH,
+ buddies);
S32 count = items.count();
- if(count == 0)
+ if (count == 0)
{
rv = FALSE;
}
- else if(drop)
+ else if (drop)
{
uuid_vec_t ids;
ids.reserve(count);
- for(S32 i = 0; i < count; ++i)
+ for (S32 i = 0; i < count; ++i)
{
ids.push_back(items.get(i)->getCreatorUUID());
}
@@ -979,12 +964,11 @@ BOOL LLIMFloater::dropCategory(LLInventoryCategory* category, BOOL drop)
BOOL LLIMFloater::isInviteAllowed() const
{
-
- return ( (IM_SESSION_CONFERENCE_START == mDialog)
- || (IM_SESSION_INVITE == mDialog) );
+ return ((IM_SESSION_CONFERENCE_START == mDialog)
+ || (IM_SESSION_INVITE == mDialog));
}
-class LLSessionInviteResponder : public LLHTTPClient::Responder
+class LLSessionInviteResponder: public LLHTTPClient::Responder
{
public:
LLSessionInviteResponder(const LLUUID& session_id)
@@ -1005,61 +989,60 @@ private:
BOOL LLIMFloater::inviteToSession(const uuid_vec_t& ids)
{
LLViewerRegion* region = gAgent.getRegion();
- if (!region)
+ bool is_region_exist = !!region;
+
+ if (is_region_exist)
{
- return FALSE;
- }
+ S32 count = ids.size();
- S32 count = ids.size();
+ if (isInviteAllowed() && (count > 0))
+ {
+ llinfos << "LLIMFloater::inviteToSession() - inviting participants" << llendl;
- if( isInviteAllowed() && (count > 0) )
- {
- llinfos << "LLIMFloater::inviteToSession() - inviting participants" << llendl;
+ std::string url = region->getCapability("ChatSessionRequest");
- std::string url = region->getCapability("ChatSessionRequest");
+ LLSD data;
- LLSD data;
+ data["params"] = LLSD::emptyArray();
+ for (int i = 0; i < count; i++)
+ {
+ data["params"].append(ids[i]);
+ }
- data["params"] = LLSD::emptyArray();
- for (int i = 0; i < count; i++)
+ data["method"] = "invite";
+ data["session-id"] = mSessionID;
+ LLHTTPClient::post(
+ url,
+ data,
+ new LLSessionInviteResponder(mSessionID));
+ }
+ else
{
- data["params"].append(ids[i]);
+ llinfos << "LLIMFloater::inviteToSession -"
+ << " no need to invite agents for "
+ << mDialog << llendl;
+ // successful add, because everyone that needed to get added
+ // was added.
}
-
- data["method"] = "invite";
- data["session-id"] = mSessionID;
- LLHTTPClient::post(
- url,
- data,
- new LLSessionInviteResponder(
- mSessionID));
- }
- else
- {
- llinfos << "LLIMFloater::inviteToSession -"
- << " no need to invite agents for "
- << mDialog << llendl;
- // successful add, because everyone that needed to get added
- // was added.
}
- return TRUE;
+ return is_region_exist;
}
void LLIMFloater::addTypingIndicator(const LLIMInfo* im_info)
{
// We may have lost a "stop-typing" packet, don't add it twice
- if ( im_info && !mOtherTyping )
+ if (im_info && !mOtherTyping)
{
mOtherTyping = true;
// Save and set new title
mSavedTitle = getTitle();
- setTitle (mTypingStart);
+ setTitle(mTypingStart);
// Update speaker
LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
- if ( speaker_mgr )
+ if (speaker_mgr)
{
speaker_mgr->setSpeakerTyping(im_info->mFromID, TRUE);
}
@@ -1068,23 +1051,22 @@ void LLIMFloater::addTypingIndicator(const LLIMInfo* im_info)
void LLIMFloater::removeTypingIndicator(const LLIMInfo* im_info)
{
- if ( mOtherTyping )
+ if (mOtherTyping)
{
mOtherTyping = false;
// Revert the title to saved one
setTitle(mSavedTitle);
- if ( im_info )
+ if (im_info)
{
// Update speaker
LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
- if ( speaker_mgr )
+ if (speaker_mgr)
{
speaker_mgr->setSpeakerTyping(im_info->mFromID, FALSE);
}
}
-
}
}
@@ -1101,7 +1083,8 @@ void LLIMFloater::closeHiddenIMToasts()
}
};
- LLNotificationsUI::LLScreenChannel* channel = LLNotificationsUI::LLChannelManager::getNotificationScreenChannel();
+ LLNotificationsUI::LLScreenChannel* channel =
+ LLNotificationsUI::LLChannelManager::getNotificationScreenChannel();
if (channel != NULL)
{
channel->closeHiddenToasts(IMToastMatcher());
@@ -1124,14 +1107,6 @@ void LLIMFloater::confirmLeaveCallCallback(const LLSD& notification, const LLSD&
}
// static
-bool LLIMFloater::isChatMultiTab()
-{
- // Restart is required in order to change chat window type.
- static bool is_single_window = gSavedSettings.getS32("ChatWindow") == 1;
- return is_single_window;
-}
-
-// static
void LLIMFloater::initIMFloater()
{
// This is called on viewer start up
@@ -1143,41 +1118,51 @@ void LLIMFloater::initIMFloater()
void LLIMFloater::sRemoveTypingIndicator(const LLSD& data)
{
LLUUID session_id = data["session_id"];
- if (session_id.isNull()) return;
+ if (session_id.isNull())
+ return;
LLUUID from_id = data["from_id"];
- if (gAgentID == from_id || LLUUID::null == from_id) return;
+ if (gAgentID == from_id || LLUUID::null == from_id)
+ return;
LLIMFloater* floater = LLIMFloater::findInstance(session_id);
- if (!floater) return;
+ if (!floater)
+ return;
- if (IM_NOTHING_SPECIAL != floater->mDialog) return;
+ if (IM_NOTHING_SPECIAL != floater->mDialog)
+ return;
floater->removeTypingIndicator();
}
void LLIMFloater::onIMChicletCreated( const LLUUID& session_id )
{
+ LLIMFloater::addToHost(session_id);
+}
- if (isChatMultiTab())
+void LLIMFloater::addToHost(const LLUUID& session_id)
+{
+ if (LLIMConversation::isChatMultiTab())
{
- LLIMFloaterContainer* im_box = LLIMFloaterContainer::getInstance();
- if (!im_box) return;
-
- if (LLIMFloater::findInstance(session_id)) return;
-
- LLIMFloater* new_tab = LLIMFloater::getInstance(session_id);
+ LLIMFloaterContainer* im_box = LLIMFloaterContainer::findInstance();
+ if (!im_box)
+ {
+ im_box = LLIMFloaterContainer::getInstance();
+ }
- im_box->addFloater(new_tab, FALSE, LLTabContainer::END);
+ if (im_box && !LLIMFloater::findInstance(session_id))
+ {
+ LLIMFloater* new_tab = LLIMFloater::getInstance(session_id);
+ im_box->addFloater(new_tab, FALSE, LLTabContainer::END);
+ }
}
-
}
void LLIMFloater::onClickCloseBtn()
{
LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(
- mSessionID);
+ mSessionID);
if (session == NULL)
{
@@ -1190,7 +1175,8 @@ void LLIMFloater::onClickCloseBtn()
LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(mSessionID);
- if (is_call_with_chat && voice_channel != NULL && voice_channel->isActive())
+ if (is_call_with_chat && voice_channel != NULL
+ && voice_channel->isActive())
{
LLSD payload;
payload["session_id"] = mSessionID;