llfloaterchatterbox.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:9k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llfloaterchatterbox.cpp
  3.  * @author Richard
  4.  * @date 2007-05-08
  5.  * @brief Implementation of the chatterbox integrated conversation ui
  6.  *
  7.  * $LicenseInfo:firstyear=2007&license=viewergpl$
  8.  * 
  9.  * Copyright (c) 2007-2010, Linden Research, Inc.
  10.  * 
  11.  * Second Life Viewer Source Code
  12.  * The source code in this file ("Source Code") is provided by Linden Lab
  13.  * to you under the terms of the GNU General Public License, version 2.0
  14.  * ("GPL"), unless you have obtained a separate licensing agreement
  15.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  16.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  17.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  18.  * 
  19.  * There are special exceptions to the terms and conditions of the GPL as
  20.  * it is applied to this Source Code. View the full text of the exception
  21.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  22.  * online at
  23.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  24.  * 
  25.  * By copying, modifying or distributing this software, you acknowledge
  26.  * that you have read and understood your obligations described above,
  27.  * and agree to abide by those obligations.
  28.  * 
  29.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  30.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  31.  * COMPLETENESS OR PERFORMANCE.
  32.  * $/LicenseInfo$
  33.  */
  34. #include "llviewerprecompiledheaders.h"
  35. #include "llfloaterreg.h"
  36. #include "llfloaterchatterbox.h"
  37. #include "lluictrlfactory.h"
  38. #include "llfloaterfriends.h"
  39. #include "llfloatergroups.h"
  40. #include "llviewercontrol.h"
  41. #include "llvoicechannel.h"
  42. #include "llimpanel.h"
  43. #include "llimview.h"
  44. //
  45. // LLFloaterMyFriends
  46. //
  47. LLFloaterMyFriends::LLFloaterMyFriends(const LLSD& seed)
  48. : LLFloater(seed)
  49. {
  50. mFactoryMap["friends_panel"] = LLCallbackMap(LLFloaterMyFriends::createFriendsPanel, NULL);
  51. mFactoryMap["groups_panel"] = LLCallbackMap(LLFloaterMyFriends::createGroupsPanel, NULL);
  52. //Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this, "floater_my_friends.xml");
  53. }
  54. LLFloaterMyFriends::~LLFloaterMyFriends()
  55. {
  56. }
  57. BOOL LLFloaterMyFriends::postBuild()
  58. {
  59. return TRUE;
  60. }
  61. void LLFloaterMyFriends::onOpen(const LLSD& key)
  62. {
  63. if (key.asString() == "friends")
  64. {
  65. childShowTab("friends_and_groups", "friends_panel");
  66. }
  67. else if (key.asString() == "groups")
  68. {
  69. childShowTab("friends_and_groups", "groups_panel");
  70. }
  71. }
  72. //static
  73. void* LLFloaterMyFriends::createFriendsPanel(void* data)
  74. {
  75. return new LLPanelFriends();
  76. }
  77. //static
  78. void* LLFloaterMyFriends::createGroupsPanel(void* data)
  79. {
  80. return new LLPanelGroups();
  81. }
  82. //static
  83. LLFloaterMyFriends* LLFloaterMyFriends::getInstance()
  84. {
  85. return LLFloaterReg::getTypedInstance<LLFloaterMyFriends>("contacts", "friends") ;
  86. }
  87. //
  88. // LLFloaterChatterBox
  89. //
  90. LLFloaterChatterBox::LLFloaterChatterBox(const LLSD& seed)
  91. : LLMultiFloater(seed),
  92. mActiveVoiceFloater(NULL)
  93. {
  94. mAutoResize = FALSE;
  95. //Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this, "floater_chatterbox.xml", FALSE);
  96. }
  97. LLFloaterChatterBox::~LLFloaterChatterBox()
  98. {
  99. }
  100. BOOL LLFloaterChatterBox::postBuild()
  101. {
  102. setVisibleCallback(boost::bind(&LLFloaterChatterBox::onVisibilityChange, this, _2));
  103. if (gSavedSettings.getBOOL("ContactsTornOff"))
  104. {
  105. LLFloaterMyFriends* floater_contacts = LLFloaterMyFriends::getInstance();
  106. if(floater_contacts)
  107. {
  108. // add then remove to set up relationship for re-attach
  109. addFloater(floater_contacts, FALSE);
  110. removeFloater(floater_contacts);
  111. // reparent to floater view
  112. gFloaterView->addChild(floater_contacts);
  113. }
  114. }
  115. else
  116. {
  117. addFloater(LLFloaterMyFriends::getInstance(), TRUE);
  118. }
  119. mTabContainer->lockTabs();
  120. return TRUE;
  121. }
  122. BOOL LLFloaterChatterBox::handleKeyHere(KEY key, MASK mask)
  123. {
  124. if (key == 'W' && mask == MASK_CONTROL)
  125. {
  126. LLFloater* floater = getActiveFloater();
  127. // is user closeable and is system closeable
  128. if (floater && floater->canClose())
  129. {
  130. if (floater->isCloseable())
  131. {
  132. floater->closeFloater();
  133. }
  134. else
  135. {
  136. // close chatterbox window if frontmost tab is reserved, non-closeable tab
  137. // such as contacts or near me
  138. closeFloater();
  139. }
  140. }
  141. return TRUE;
  142. }
  143. return LLMultiFloater::handleKeyHere(key, mask);
  144. }
  145. void LLFloaterChatterBox::draw()
  146. {
  147. // clear new im notifications when chatterbox is visible
  148. if (!isMinimized()) 
  149. {
  150. gIMMgr->clearNewIMNotification();
  151. }
  152. LLFloater* current_active_floater = getCurrentVoiceFloater();
  153. // set icon on tab for floater currently associated with active voice channel
  154. if(mActiveVoiceFloater != current_active_floater)
  155. {
  156. // remove image from old floater's tab
  157. if (mActiveVoiceFloater)
  158. {
  159. mTabContainer->setTabImage(mActiveVoiceFloater, "");
  160. }
  161. }
  162. // update image on current active tab
  163. if (current_active_floater)
  164. {
  165. LLColor4 icon_color = LLColor4::white;
  166. LLVoiceChannel* channelp = LLVoiceChannel::getCurrentVoiceChannel();
  167. if (channelp)
  168. {
  169. if (channelp->isActive())
  170. {
  171. icon_color = LLColor4::green;
  172. }
  173. else if (channelp->getState() == LLVoiceChannel::STATE_ERROR)
  174. {
  175. icon_color = LLColor4::red;
  176. }
  177. else // active, but not connected
  178. {
  179. icon_color = LLColor4::yellow;
  180. }
  181. }
  182. mTabContainer->setTabImage(current_active_floater, "active_voice_tab.tga", icon_color);
  183. }
  184. mActiveVoiceFloater = current_active_floater;
  185. LLMultiFloater::draw();
  186. }
  187. void LLFloaterChatterBox::onOpen(const LLSD& key)
  188. {
  189. //*TODO:Skinning show the session id associated with key
  190. if (key.asString() == "local")
  191. {
  192. }
  193. else if (key.isDefined())
  194. {
  195. /*LLFloaterIMPanel* impanel = gIMMgr->findFloaterBySession(key.asUUID());
  196. if (impanel)
  197. {
  198. impanel->openFloater();
  199. }*/
  200. }
  201. }
  202. void LLFloaterChatterBox::onVisibilityChange ( const LLSD& new_visibility )
  203. {
  204. }
  205. void LLFloaterChatterBox::removeFloater(LLFloater* floaterp)
  206. {
  207. if(!floaterp) return;
  208. if (floaterp->getName() == "chat floater")
  209. {
  210. // only my friends floater now locked
  211. mTabContainer->lockTabs(mTabContainer->getNumLockedTabs() - 1);
  212. gSavedSettings.setBOOL("ChatHistoryTornOff", TRUE);
  213. floaterp->setCanClose(TRUE);
  214. }
  215. else if (floaterp->getName() == "floater_my_friends")
  216. {
  217. // only chat floater now locked
  218. mTabContainer->lockTabs(mTabContainer->getNumLockedTabs() - 1);
  219. gSavedSettings.setBOOL("ContactsTornOff", TRUE);
  220. floaterp->setCanClose(TRUE);
  221. }
  222. LLMultiFloater::removeFloater(floaterp);
  223. }
  224. void LLFloaterChatterBox::addFloater(LLFloater* floaterp, 
  225. BOOL select_added_floater, 
  226. LLTabContainer::eInsertionPoint insertion_point)
  227. {
  228. if(!floaterp) return;
  229. S32 num_locked_tabs = mTabContainer->getNumLockedTabs();
  230. // already here
  231. if (floaterp->getHost() == this)
  232. {
  233. openFloater(floaterp->getKey());
  234. return;
  235. }
  236. // make sure my friends and chat history both locked when re-attaching chat history
  237. if (floaterp->getName() == "chat floater")
  238. {
  239. mTabContainer->unlockTabs();
  240. // add chat history as second tab if contact window is present, first tab otherwise
  241. if (getChildView("floater_my_friends"))
  242. {
  243. // assuming contacts window is first tab, select it
  244. mTabContainer->selectFirstTab();
  245. // and add ourselves after
  246. LLMultiFloater::addFloater(floaterp, select_added_floater, LLTabContainer::RIGHT_OF_CURRENT);
  247. }
  248. else
  249. {
  250. LLMultiFloater::addFloater(floaterp, select_added_floater, LLTabContainer::START);
  251. }
  252. // make sure first two tabs are now locked
  253. mTabContainer->lockTabs(num_locked_tabs + 1);
  254. gSavedSettings.setBOOL("ChatHistoryTornOff", FALSE);
  255. floaterp->setCanClose(FALSE);
  256. }
  257. else if (floaterp->getName() == "floater_my_friends")
  258. {
  259. mTabContainer->unlockTabs();
  260. // add contacts window as first tab
  261. LLMultiFloater::addFloater(floaterp, select_added_floater, LLTabContainer::START);
  262. // make sure first two tabs are now locked
  263. mTabContainer->lockTabs(num_locked_tabs + 1);
  264. gSavedSettings.setBOOL("ContactsTornOff", FALSE);
  265. floaterp->setCanClose(FALSE);
  266. }
  267. else
  268. {
  269. LLMultiFloater::addFloater(floaterp, select_added_floater, insertion_point);
  270. // openFloater(floaterp->getKey());
  271. }
  272. // make sure active voice icon shows up for new tab
  273. if (floaterp == mActiveVoiceFloater)
  274. {
  275. mTabContainer->setTabImage(floaterp, "active_voice_tab.tga");
  276. }
  277. }
  278. //static
  279. LLFloaterChatterBox* LLFloaterChatterBox::getInstance()
  280. {
  281. return LLFloaterReg::getTypedInstance<LLFloaterChatterBox>("communicate", LLSD()) ; 
  282. }
  283. //static 
  284. LLFloater* LLFloaterChatterBox::getCurrentVoiceFloater()
  285. {
  286. if (!LLVoiceClient::voiceEnabled())
  287. {
  288. return NULL;
  289. }
  290. if (LLVoiceChannelProximal::getInstance() == LLVoiceChannel::getCurrentVoiceChannel())
  291. {
  292. return NULL;
  293. }
  294. else
  295. {
  296. LLFloaterChatterBox* floater = LLFloaterChatterBox::getInstance();
  297. if(!floater) return NULL;
  298. // iterator over all IM tabs (skip friends and near me)
  299. for (S32 i = 0; i < floater->getFloaterCount(); i++)
  300. {
  301. LLPanel* panelp = floater->mTabContainer->getPanelByIndex(i);
  302. if (panelp->getName() == "im_floater")
  303. {
  304. // only LLFloaterIMPanels are called "im_floater"
  305. LLFloaterIMPanel* im_floaterp = (LLFloaterIMPanel*)panelp;
  306. LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(im_floaterp->getSessionID());
  307. if (voice_channel  == LLVoiceChannel::getCurrentVoiceChannel())
  308. {
  309. return im_floaterp;
  310. }
  311. }
  312. }
  313. }
  314. return NULL;
  315. }