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.cpp104
1 files changed, 59 insertions, 45 deletions
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index 0ce8d4b7cd..aee34eb0af 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -109,6 +109,7 @@ LLIMFloater::LLIMFloater(const LLUUID& session_id)
default: break;
}
}
+ setOverlapsScreenChannel(true);
}
void LLIMFloater::onFocusLost()
@@ -119,6 +120,12 @@ void LLIMFloater::onFocusLost()
void LLIMFloater::onFocusReceived()
{
LLIMModel::getInstance()->setActiveSessionID(mSessionID);
+
+ // return focus to the input field when active tab in the multitab container is clicked.
+ if (isChatMultiTab() && mInputEditor)
+ {
+ mInputEditor->setFocus(TRUE);
+ }
}
// virtual
@@ -354,35 +361,7 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id)
{
if (!gIMMgr->hasSession(session_id)) return NULL;
- // we should make sure all related chiclets are in place when the session is a voice call
- // chiclets come firts, then comes IM window
- if (gIMMgr->isVoiceCall(session_id))
- {
- LLIMModel* im_model = LLIMModel::getInstance();
- LLBottomTray* b_tray = LLBottomTray::getInstance();
-
- //*TODO hide that into Bottom tray
- if (!b_tray->getChicletPanel()->findChiclet<LLChiclet>(session_id))
- {
- LLIMChiclet* chiclet = b_tray->createIMChiclet(session_id);
- if(chiclet)
- {
- chiclet->setIMSessionName(im_model->getName(session_id));
- chiclet->setOtherParticipantId(im_model->getOtherParticipantID(session_id));
- }
- }
-
- LLIMWellWindow::getInstance()->addIMRow(session_id);
- }
-
- bool not_existed = true;
-
- if(isChatMultiTab())
- {
- LLIMFloater* target_floater = findInstance(session_id);
- not_existed = NULL == target_floater;
- }
- else
+ if(!isChatMultiTab())
{
//hide all
LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("impanel");
@@ -397,19 +376,33 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id)
}
}
- LLIMFloater* floater = LLFloaterReg::showTypedInstance<LLIMFloater>("impanel", session_id);
+ bool exist = findInstance(session_id);
+
+ LLIMFloater* floater = getInstance(session_id);
+ if (!floater) return NULL;
if(isChatMultiTab())
{
+ LLIMFloaterContainer* floater_container = LLIMFloaterContainer::getInstance();
+
// do not add existed floaters to avoid adding torn off instances
- if (not_existed)
+ if (!exist)
{
// LLTabContainer::eInsertionPoint i_pt = user_initiated ? LLTabContainer::RIGHT_OF_CURRENT : LLTabContainer::END;
// TODO: mantipov: use LLTabContainer::RIGHT_OF_CURRENT if it exists
LLTabContainer::eInsertionPoint i_pt = LLTabContainer::END;
+
+ if (floater_container)
+ {
+ floater_container->addFloater(floater, TRUE, i_pt);
+ }
+ }
- LLIMFloaterContainer* floater_container = LLFloaterReg::showTypedInstance<LLIMFloaterContainer>("im_container");
- floater_container->addFloater(floater, TRUE, i_pt);
+ if (floater_container)
+ {
+ //selecting the panel resets a chiclet's counter
+ floater_container->selectFloater(floater);
+ floater_container->setVisible(TRUE);
}
}
else
@@ -436,8 +429,8 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id)
}
// window is positioned, now we can show it.
- floater->setVisible(true);
}
+ floater->setVisible(TRUE);
return floater;
}
@@ -477,16 +470,6 @@ void LLIMFloater::setDocked(bool docked, bool pop_on_undock)
}
}
-void LLIMFloater::setTornOff(bool torn_off)
-{
- // When IM Floater isn't torn off, "close" button should be hidden.
- // This call will just disables it, since there is a hack in LLFloater::updateButton,
- // which prevents hiding of close button in that case.
- setCanClose(torn_off);
-
- LLTransientDockableFloater::setTornOff(torn_off);
-}
-
void LLIMFloater::setVisible(BOOL visible)
{
LLNotificationsUI::LLScreenChannel* channel = dynamic_cast<LLNotificationsUI::LLScreenChannel*>
@@ -541,6 +524,11 @@ 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;
@@ -588,7 +576,7 @@ void LLIMFloater::updateMessages()
std::string time = msg["time"].asString();
LLUUID from_id = msg["from_id"].asUUID();
- std::string from = from_id != gAgentID ? msg["from"].asString() : LLTrans::getString("You");
+ std::string from = msg["from"].asString();
std::string message = msg["message"].asString();
LLChat chat;
@@ -617,6 +605,15 @@ void LLIMFloater::onInputEditorFocusReceived( LLFocusableElement* caller, void*
//in disconnected state IM input editor should be disabled
self->mInputEditor->setEnabled(!gDisconnected);
}
+
+ // when IM Floater is a part of the multitab container LLTabContainer set focus to the first
+ // child on tab button's mouse up. This leads input field lost focus. See EXT-3852.
+ if (isChatMultiTab())
+ {
+ // So, clear control captured mouse to prevent LLTabContainer set focus on the panel's first child.
+ // do not pass self->mInputEditor, this leads to have "Edit Text" mouse pointer wherever it is.
+ gFocusMgr.setMouseCapture(NULL);
+ }
}
// static
@@ -1010,3 +1007,20 @@ void LLIMFloater::sRemoveTypingIndicator(const LLSD& data)
floater->removeTypingIndicator();
}
+
+void LLIMFloater::onIMChicletCreated( const LLUUID& session_id )
+{
+
+ if (isChatMultiTab())
+ {
+ LLIMFloaterContainer* im_box = LLIMFloaterContainer::getInstance();
+ if (!im_box) return;
+
+ if (LLIMFloater::findInstance(session_id)) return;
+
+ LLIMFloater* new_tab = LLIMFloater::getInstance(session_id);
+
+ im_box->addFloater(new_tab, FALSE, LLTabContainer::END);
+ }
+
+}