diff options
| author | Andrew Dyukov <adyukov@productengine.com> | 2009-10-26 19:33:38 +0200 | 
|---|---|---|
| committer | Andrew Dyukov <adyukov@productengine.com> | 2009-10-26 19:33:38 +0200 | 
| commit | 33c1be212afb3cf36a80c1fadb6aa9e55670c8ff (patch) | |
| tree | 781b568c805c82c152bc4808b747eaaec92419da | |
| parent | ff37134a405e81899b4d9e7d07be7e3da85c8278 (diff) | |
| parent | 1d4d4fec00aacb1e1e00a4f60a6af4d8ed3b8bde (diff) | |
merge
--HG--
branch : product-engine
| -rw-r--r-- | indra/newview/llagent.cpp | 6 | ||||
| -rw-r--r-- | indra/newview/llchannelmanager.cpp | 4 | ||||
| -rw-r--r-- | indra/newview/llimfloater.cpp | 138 | ||||
| -rw-r--r-- | indra/newview/llimfloater.h | 18 | ||||
| -rw-r--r-- | indra/newview/llimview.cpp | 116 | ||||
| -rw-r--r-- | indra/newview/llimview.h | 73 | ||||
| -rw-r--r-- | indra/newview/llscreenchannel.cpp | 1 | ||||
| -rw-r--r-- | indra/newview/llsyswellwindow.cpp | 6 | ||||
| -rw-r--r-- | indra/newview/llsyswellwindow.h | 1 | ||||
| -rw-r--r-- | indra/newview/llviewerinventory.cpp | 1 | ||||
| -rw-r--r-- | indra/newview/llviewermenu.cpp | 1 | ||||
| -rw-r--r-- | indra/newview/llviewerwindow.cpp | 1 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/floater_nearby_chat.xml | 1 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/strings.xml | 10 | 
14 files changed, 243 insertions, 134 deletions
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index f62606cc50..5800db482f 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -5391,12 +5391,6 @@ void update_group_floaters(const LLUUID& group_id)  	//*TODO Implement group update for Profile View   	// still actual as of July 31, 2009 (DZ) -	if (gIMMgr) -	{ -		// update the talk view -		gIMMgr->refresh(); -	} -  	gAgent.fireEvent(new LLOldEvents::LLEvent(&gAgent, "new group"), "");  } diff --git a/indra/newview/llchannelmanager.cpp b/indra/newview/llchannelmanager.cpp index 77f941eef0..6427422572 100644 --- a/indra/newview/llchannelmanager.cpp +++ b/indra/newview/llchannelmanager.cpp @@ -40,6 +40,8 @@  #include "llbottomtray.h"  #include "llviewerwindow.h"  #include "llrootview.h" +#include "llsyswellwindow.h" +#include "llfloaterreg.h"  #include <algorithm> @@ -128,7 +130,7 @@ void LLChannelManager::onLoginCompleted()  	S32 channel_right_bound = gViewerWindow->getWorldViewRect().mRight - gSavedSettings.getS32("NotificationChannelRightMargin");   	S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth");  	mStartUpChannel->init(channel_right_bound - channel_width, channel_right_bound); -	mStartUpChannel->setShowToasts(true); +	mStartUpChannel->setMouseDownCallback(boost::bind(&LLSysWellWindow::onStartUpToastClick, LLFloaterReg::getTypedInstance<LLSysWellWindow>("syswell_window"), _2, _3, _4));  	mStartUpChannel->setCommitCallback(boost::bind(&LLChannelManager::onStartUpToastClose, this));  	mStartUpChannel->createStartUpToast(away_notifications, gSavedSettings.getS32("StartUpToastLifeTime")); diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp index a20b5ea66c..5813faa133 100644 --- a/indra/newview/llimfloater.cpp +++ b/indra/newview/llimfloater.cpp @@ -61,7 +61,14 @@ LLIMFloater::LLIMFloater(const LLUUID& session_id)  	mLastMessageIndex(-1),  	mDialog(IM_NOTHING_SPECIAL),  	mChatHistory(NULL), -	mInputEditor(NULL),  +	mInputEditor(NULL), +	mSavedTitle(), +	mTypingStart(), +	mShouldSendTypingState(false), +	mMeTyping(false), +	mOtherTyping(false), +	mTypingTimer(), +	mTypingTimeoutTimer(),  	mPositioned(false),  	mSessionInitialized(false)  { @@ -95,6 +102,7 @@ void LLIMFloater::onFocusReceived()  // virtual  void LLIMFloater::onClose(bool app_quitting)  { +	setTyping(false);  	gIMMgr->leaveSession(mSessionID);  } @@ -141,6 +149,7 @@ void LLIMFloater::onSendMsg( LLUICtrl* ctrl, void* userdata )  {  	LLIMFloater* self = (LLIMFloater*) userdata;  	self->sendMsg(); +	self->setTyping(false);  }  void LLIMFloater::sendMsg() @@ -228,12 +237,27 @@ BOOL LLIMFloater::postBuild()  		LLLogChat::loadHistory(getTitle(), &chatFromLogFile, (void *)this);  	} +	mTypingStart = LLTrans::getString("IM_typing_start_string"); +  	//*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)  	return LLDockableFloater::postBuild();  } +// virtual +void LLIMFloater::draw() +{ +	if ( mMeTyping ) +	{ +		// Time out if user hasn't typed for a while. +		if ( mTypingTimeoutTimer.getElapsedTimeF32() > LLAgent::TYPING_TIMEOUT_SECS ) +		{ +			setTyping(false); +		} +	} +	LLFloater::draw(); +}  // static @@ -402,7 +426,8 @@ void LLIMFloater::sessionInitReplyReceived(const LLUUID& im_session_id)  void LLIMFloater::updateMessages()  { -	std::list<LLSD> messages = LLIMModel::instance().getMessages(mSessionID, mLastMessageIndex+1); +	std::list<LLSD> messages; +	LLIMModel::instance().getMessages(mSessionID, messages, mLastMessageIndex+1);  	std::string agent_name;  	gCacheName->getFullName(gAgentID, agent_name); @@ -450,7 +475,7 @@ void LLIMFloater::onInputEditorFocusReceived( LLFocusableElement* caller, void*  void LLIMFloater::onInputEditorFocusLost(LLFocusableElement* caller, void* userdata)  {  	LLIMFloater* self = (LLIMFloater*) userdata; -	self->setTyping(FALSE); +	self->setTyping(false);  }  // static @@ -460,19 +485,118 @@ void LLIMFloater::onInputEditorKeystroke(LLLineEditor* caller, void* userdata)  	std::string text = self->mInputEditor->getText();  	if (!text.empty())  	{ -		self->setTyping(TRUE); +		self->setTyping(true);  	}  	else  	{  		// Deleting all text counts as stopping typing. -		self->setTyping(FALSE); +		self->setTyping(false); +	} +} + +void LLIMFloater::setTyping(bool typing) +{ +	if ( typing ) +	{ +		// Started or proceeded typing, reset the typing timeout timer +		mTypingTimeoutTimer.reset(); +	} + +	if ( mMeTyping != typing ) +	{ +		// Typing state is changed +		mMeTyping = typing; +		// So, should send current state +		mShouldSendTypingState = true; +		// In case typing is started, send state after some delay +		mTypingTimer.reset(); +	} + +	// 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 ( mMeTyping ) +		{ +			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); +			mShouldSendTypingState = false; +		} +	} + +	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 ) +	{ +		// other user started typing +		addTypingIndicator(im_info); +	} +	else +	{ +		// other user stopped typing +		removeTypingIndicator(im_info);  	}  } +void LLIMFloater::addTypingIndicator(const LLIMInfo* im_info) +{ +	// We may have lost a "stop-typing" packet, don't add it twice +	if ( im_info && !mOtherTyping ) +	{ +		mOtherTyping = true; -//just a stub for now -void LLIMFloater::setTyping(BOOL typing) +		// Create typing is started title string +		LLUIString typing_start(mTypingStart); +		typing_start.setArg("[NAME]", im_info->mName); + +		// Save and set new title +		mSavedTitle = getTitle(); +		setTitle (typing_start); + +		// Update speaker +		LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID); +		if ( speaker_mgr ) +		{ +			speaker_mgr->setSpeakerTyping(im_info->mFromID, TRUE); +		} +	} +} + +void LLIMFloater::removeTypingIndicator(const LLIMInfo* im_info)  { +	if ( mOtherTyping ) +	{ +		mOtherTyping = false; + +		// Revert the title to saved one +		setTitle(mSavedTitle); + +		if ( im_info ) +		{ +			// Update speaker +			LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID); +			if ( speaker_mgr ) +			{ +				speaker_mgr->setSpeakerTyping(im_info->mFromID, FALSE); +			} +		} + +	}  }  void LLIMFloater::chatFromLogFile(LLLogChat::ELogLineType type, std::string line, void* userdata) diff --git a/indra/newview/llimfloater.h b/indra/newview/llimfloater.h index 99810b6d6d..3559e14c89 100644 --- a/indra/newview/llimfloater.h +++ b/indra/newview/llimfloater.h @@ -55,6 +55,8 @@ public:  	// LLView overrides  	/*virtual*/ BOOL postBuild();  	/*virtual*/ void setVisible(BOOL visible); +	// Check typing timeout timer. +	/*virtual*/ void draw();  	// LLFloater overrides  	/*virtual*/ void onClose(bool app_quitting); @@ -85,6 +87,7 @@ public:  	void setPositioned(bool b) { mPositioned = b; };  	void onVisibilityChange(const LLSD& new_visibility); +	void processIMTyping(const LLIMInfo* im_info, BOOL typing);  private:  	// process focus events to set a currently active session @@ -94,7 +97,7 @@ private:  	static void		onInputEditorFocusReceived( LLFocusableElement* caller, void* userdata );  	static void		onInputEditorFocusLost(LLFocusableElement* caller, void* userdata);  	static void		onInputEditorKeystroke(LLLineEditor* caller, void* userdata); -	void			setTyping(BOOL typing); +	void			setTyping(bool typing);  	void			onSlide();  	static void*	createPanelIMControl(void* userdata);  	static void*	createPanelGroupControl(void* userdata); @@ -103,6 +106,11 @@ private:  	static void chatFromLogFile(LLLogChat::ELogLineType type, std::string line, void* userdata); +	// Add the "User is typing..." indicator. +	void addTypingIndicator(const LLIMInfo* im_info); + +	// Remove the "User is typing..." indicator. +	void removeTypingIndicator(const LLIMInfo* im_info = NULL);  	LLPanelChatControlPanel* mControlPanel;  	LLUUID mSessionID; @@ -114,6 +122,14 @@ private:  	LLLineEditor* mInputEditor;  	bool mPositioned; +	std::string mSavedTitle; +	LLUIString mTypingStart; +	bool mMeTyping; +	bool mOtherTyping; +	bool mShouldSendTypingState; +	LLFrameTimer mTypingTimer; +	LLFrameTimer mTypingTimeoutTimer; +  	bool mSessionInitialized;  	LLSD mQueuedMsgsForInit;  }; diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 8d72ffdfcc..59cd9cec86 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -272,7 +272,8 @@ void LLIMModel::testMessages()  } -bool LLIMModel::newSession(LLUUID session_id, std::string name, EInstantMessage type, LLUUID other_participant_id, const std::vector<LLUUID>& ids) +bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type,  +						   const LLUUID& other_participant_id, const std::vector<LLUUID>& ids)  {  	if (is_in_map(sSessionsMap, session_id))  	{ @@ -289,7 +290,7 @@ bool LLIMModel::newSession(LLUUID session_id, std::string name, EInstantMessage  } -bool LLIMModel::clearSession(LLUUID session_id) +bool LLIMModel::clearSession(const LLUUID& session_id)  {  	if (sSessionsMap.find(session_id) == sSessionsMap.end()) return false;  	delete (sSessionsMap[session_id]); @@ -297,16 +298,13 @@ bool LLIMModel::clearSession(LLUUID session_id)  	return true;  } -//*TODO remake it, instead of returing the list pass it as as parameter (IB) -std::list<LLSD> LLIMModel::getMessages(LLUUID session_id, int start_index) +void LLIMModel::getMessages(const LLUUID& session_id, std::list<LLSD>& messages, int start_index)  { -	std::list<LLSD> return_list; -  	LLIMSession* session = findIMSession(session_id);  	if (!session)   	{  		llwarns << "session " << session_id << "does not exist " << llendl; -		return return_list; +		return;  	}  	int i = session->mMsgs.size() - start_index; @@ -317,7 +315,7 @@ std::list<LLSD> LLIMModel::getMessages(LLUUID session_id, int start_index)  	{  		LLSD msg;  		msg = *iter; -		return_list.push_back(*iter); +		messages.push_back(*iter);  		i--;  	} @@ -327,14 +325,9 @@ std::list<LLSD> LLIMModel::getMessages(LLUUID session_id, int start_index)  	arg["session_id"] = session_id;  	arg["num_unread"] = 0;  	mNoUnreadMsgsSignal(arg); - -    // TODO: in the future is there a more efficient way to return these -	//of course there is - return as parameter (IB) -	return return_list; -  } -bool LLIMModel::addToHistory(LLUUID session_id, std::string from, LLUUID from_id, std::string utf8_text) {  +bool LLIMModel::addToHistory(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text) {  	LLIMSession* session = findIMSession(session_id); @@ -383,8 +376,8 @@ bool LLIMModel::logToFile(const LLUUID& session_id, const std::string& from, con  	return false;  } -//*TODO add const qualifier and pass by references (IB) -bool LLIMModel::addMessage(LLUUID session_id, std::string from, LLUUID from_id, std::string utf8_text, bool log2file /* = true */) {  +bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, const LLUUID& from_id,  +						   const std::string& utf8_text, bool log2file /* = true */) {   	LLIMSession* session = findIMSession(session_id);  	if (!session)  @@ -506,7 +499,7 @@ void LLIMModel::sendTypingState(LLUUID session_id, LLUUID other_participant_id,  	gAgent.sendReliableMessage();  } -void LLIMModel::sendLeaveSession(LLUUID session_id, LLUUID other_participant_id)  +void LLIMModel::sendLeaveSession(const LLUUID& session_id, const LLUUID& other_participant_id)  {  	if(session_id.notNull())  	{ @@ -1114,29 +1107,6 @@ void LLIncomingCallDialog::processCallResponse(S32 response)  	}  } -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLIMViewFriendObserver -// -// Bridge to suport knowing when the inventory has changed. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -class LLIMViewFriendObserver : public LLFriendObserver -{ -public: -	LLIMViewFriendObserver(LLIMMgr* tv) : mTV(tv) {} -	virtual ~LLIMViewFriendObserver() {} -	virtual void changed(U32 mask) -	{ -		if(mask & (LLFriendObserver::ADD | LLFriendObserver::REMOVE | LLFriendObserver::ONLINE)) -		{ -			mTV->refresh(); -		} -	} -protected: -	LLIMMgr* mTV; -}; - -  bool inviteUserResponse(const LLSD& notification, const LLSD& response)  {  	const LLSD& payload = notification["payload"]; @@ -1237,7 +1207,6 @@ bool inviteUserResponse(const LLSD& notification, const LLSD& response)  //  LLIMMgr::LLIMMgr() : -	mFriendObserver(NULL),  	mIMReceived(FALSE)  {  	static bool registered_dialog = false; @@ -1246,21 +1215,11 @@ LLIMMgr::LLIMMgr() :  		LLFloaterReg::add("incoming_call", "floater_incoming_call.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLIncomingCallDialog>);  		registered_dialog = true;  	} -		 -	mFriendObserver = new LLIMViewFriendObserver(this); -	LLAvatarTracker::instance().addObserver(mFriendObserver);  	mPendingInvitations = LLSD::emptyMap();  	mPendingAgentListUpdates = LLSD::emptyMap();  } -LLIMMgr::~LLIMMgr() -{ -	LLAvatarTracker::instance().removeObserver(mFriendObserver); -	delete mFriendObserver; -	// Children all cleaned up by default view destructor. -} -  // Add a message to a session.   void LLIMMgr::addMessage(  	const LLUUID& session_id, @@ -1299,7 +1258,8 @@ void LLIMMgr::addMessage(  		fixed_session_name = session_name;  	} -	if (!LLIMModel::getInstance()->findIMSession(new_session_id)) +	bool new_session = !hasSession(session_id); +	if (new_session)  	{  		LLIMModel::getInstance()->newSession(session_id, fixed_session_name, dialog, other_participant_id);  	} @@ -1318,15 +1278,16 @@ void LLIMMgr::addMessage(  	// create IM window as necessary  	if(!floater)  	{ - -		  		floater = createFloater(  			new_session_id,  			other_participant_id,  			fixed_session_name,  			dialog,  			FALSE); +	} +	if (new_session) +	{  		// When we get a new IM, and if you are a god, display a bit  		// of information about the source. This is to help liaisons  		// when answering questions. @@ -1336,7 +1297,7 @@ void LLIMMgr::addMessage(  			std::ostringstream bonus_info;  			bonus_info << LLTrans::getString("***")+ " "+ LLTrans::getString("IMParentEstate") + ":" + " "  				<< parent_estate_id -			<< ((parent_estate_id == 1) ? "," + LLTrans::getString("IMMainland") : "") +				<< ((parent_estate_id == 1) ? "," + LLTrans::getString("IMMainland") : "")  				<< ((parent_estate_id == 5) ? "," + LLTrans::getString ("IMTeen") : "");  			// once we have web-services (or something) which returns @@ -1439,10 +1400,7 @@ S32 LLIMMgr::getNumberOfUnreadIM()  	S32 num = 0;  	for(it = LLIMModel::sSessionsMap.begin(); it != LLIMModel::sSessionsMap.end(); ++it)  	{ -		if((*it).first != mBeingRemovedSessionID) -		{ -			num += (*it).second->mNumUnread; -		} +		num += (*it).second->mNumUnread;  	}  	return num; @@ -1551,41 +1509,25 @@ bool LLIMMgr::leaveSession(const LLUUID& session_id)  	return true;  } -// This removes the panel referenced by the uuid, and then restores -// internal consistency. The internal pointer is not deleted? Did you mean -// a pointer to the corresponding LLIMSession? Session data is cleared now. -// Put a copy of UUID to avoid problem when passed reference becames invalid -// if it has been come from the object removed in observer. -void LLIMMgr::removeSession(LLUUID session_id) +// Removes data associated with a particular session specified by session_id +void LLIMMgr::removeSession(const LLUUID& session_id)  { -	if (mBeingRemovedSessionID == session_id) -	{ -		return; -	} +	llassert_always(hasSession(session_id)); +	//*TODO remove this floater thing when Communicate Floater is being deleted (IB)  	LLFloaterIMPanel* floater = findFloaterBySession(session_id);  	if(floater)  	{  		mFloaters.erase(floater->getHandle());  		LLFloaterChatterBox::getInstance()->removeFloater(floater); -		//mTabContainer->removeTabPanel(floater); - -		clearPendingInvitation(session_id); -		clearPendingAgentListUpdates(session_id);  	} -	// for some purposes storing ID of a sessios that is being removed -	mBeingRemovedSessionID = session_id; -	notifyObserverSessionRemoved(session_id); +	clearPendingInvitation(session_id); +	clearPendingAgentListUpdates(session_id); -	//if we don't clear session data on removing the session -	//we can't use LLBottomTray as observer of session creation/delettion and  -	//creating chiclets only on session created even, we need to handle chiclets creation -	//the same way as LLFloaterIMPanels were managed.  	LLIMModel::getInstance()->clearSession(session_id); -	// now this session is completely removed -	mBeingRemovedSessionID.setNull(); +	notifyObserverSessionRemoved(session_id);  }  void LLIMMgr::inviteToSession( @@ -1714,10 +1656,6 @@ void LLIMMgr::onInviteNameLookup(LLSD payload, const LLUUID& id, const std::stri  	}  } -void LLIMMgr::refresh() -{ -} -  void LLIMMgr::disconnectAllSessions()  {  	LLFloaterIMPanel* floater = NULL; @@ -2029,6 +1967,12 @@ void LLIMMgr::processIMTypingCore(const LLIMInfo* im_info, BOOL typing)  	{  		floater->processIMTyping(im_info, typing);  	} + +	LLIMFloater* im_floater = LLIMFloater::findInstance(session_id); +	if ( im_floater ) +	{ +		im_floater->processIMTyping(im_info, typing); +	}  }  class LLViewerChatterBoxSessionStartReply : public LLHTTPNode diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h index 79513fb7d5..e3d0a50557 100644 --- a/indra/newview/llimview.h +++ b/indra/newview/llimview.h @@ -104,18 +104,35 @@ public:  	boost::signals2::connection addNewMsgCallback( session_callback_t cb ) { return mNewMsgSignal.connect(cb); }  	boost::signals2::connection addNoUnreadMsgsCallback( session_callback_t cb ) { return mNoUnreadMsgsSignal.connect(cb); } -	bool newSession(LLUUID session_id, std::string name, EInstantMessage type, LLUUID other_participant_id,  +	/** +	 * Create new session object in a model +	 */ +	bool newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id,   		const std::vector<LLUUID>& ids = std::vector<LLUUID>()); -	bool clearSession(LLUUID session_id); -	std::list<LLSD> getMessages(LLUUID session_id, int start_index = 0); -	bool addMessage(LLUUID session_id, std::string from, LLUUID other_participant_id, std::string utf8_text, bool log2file = true); -	bool addToHistory(LLUUID session_id, std::string from, LLUUID from_id, std::string utf8_text);  +	/** +	 * Remove all session data associated with a session specified by session_id +	 */ +	bool clearSession(const LLUUID& session_id); -	bool logToFile(const LLUUID& session_id, const std::string& from, const std::string& utf8_text); +	/** +	 * Populate supplied std::list with messages starting from index specified by start_index +	 */ +	void getMessages(const LLUUID& session_id, std::list<LLSD>& messages, int start_index = 0); -	//used to get the name of the session, for use as the title -	//currently just the other avatar name +	/** +	 * Add a message to an IM Model - the message is saved in a message store associated with a session specified by session_id +	 * and also saved into a file if log2file is specified. +	 * It sends new message signal for each added message. +	 */ +	bool addMessage(const LLUUID& session_id, const std::string& from, const LLUUID& other_participant_id, const std::string& utf8_text, bool log2file = true); +	 +	/** +	 * Get a session's name.  +	 * For a P2P chat - it's an avatar's name,  +	 * For a group chat - it's a group's name +	 * For an ad-hoc chat - is received from the server and is in a from of "<Avatar's name> conference" +	 */  	const std::string& getName(const LLUUID& session_id) const;  	/**  @@ -150,7 +167,7 @@ public:  	*/  	LLIMSpeakerMgr* getSpeakerManager(const LLUUID& session_id) const; -	static void sendLeaveSession(LLUUID session_id, LLUUID other_participant_id); +	static void sendLeaveSession(const LLUUID& session_id, const LLUUID& other_participant_id);  	static bool sendStartSession(const LLUUID& temp_session_id, const LLUUID& other_participant_id,  						  const std::vector<LLUUID>& ids, EInstantMessage dialog);  	static void sendTypingState(LLUUID session_id, LLUUID other_participant_id, BOOL typing); @@ -158,6 +175,19 @@ public:  								const LLUUID& other_participant_id, EInstantMessage dialog);  	void testMessages(); + +private: +	 +	/** +	 * Add message to a list of message associated with session specified by session_id +	 */ +	bool addToHistory(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text);  + +	/** +	 * Save an IM message into a file +	 */ +	//*TODO should also save uuid of a sender +	bool logToFile(const LLUUID& session_id, const std::string& from, const std::string& utf8_text);  };  class LLIMSessionObserver @@ -183,7 +213,7 @@ public:  	};  	LLIMMgr(); -	virtual ~LLIMMgr(); +	virtual ~LLIMMgr() {};  	// Add a message to a session. The session can keyed to sesion id  	// or agent id. @@ -245,9 +275,6 @@ public:  	void processIMTypingStart(const LLIMInfo* im_info);  	void processIMTypingStop(const LLIMInfo* im_info); -	// Rebuild stuff -	void refresh(); -  	void notifyNewIM();  	void clearNewIMNotification(); @@ -263,10 +290,6 @@ public:  	// good connection.  	void disconnectAllSessions(); -	// This is a helper function to determine what kind of im session -	// should be used for the given agent. -	static EInstantMessage defaultIMTypeForAgent(const LLUUID& agent_id); -  	BOOL hasSession(const LLUUID& session_id);  	// This method returns the im panel corresponding to the uuid @@ -285,6 +308,7 @@ public:  	void clearPendingAgentListUpdates(const LLUUID& session_id);  	//HACK: need a better way of enumerating existing session, or listening to session create/destroy events +	//@deprecated, is used only by LLToolBox, which is not used anywhere, right? (IB)  	const std::set<LLHandle<LLFloater> >& getIMFloaterHandles() { return mFloaters; }  	void addSessionObserver(LLIMSessionObserver *); @@ -303,10 +327,11 @@ public:  	bool endCall(const LLUUID& session_id);  private: -	// This removes the panel referenced by the uuid, and then -	// restores internal consistency. The internal pointer is not -	// deleted. -	void removeSession(LLUUID session_id); + +	/** +	 * Remove data associated with a particular session specified by session_id +	 */ +	void removeSession(const LLUUID& session_id);  	// create a panel and update internal representation for  	// consistency. Returns the pointer, caller (the class instance @@ -335,8 +360,9 @@ private:  	void notifyObserverSessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id);  private: +	 +	//*TODO should be deleted when Communicate Floater is being deleted  	std::set<LLHandle<LLFloater> > mFloaters; -	LLFriendObserver* mFriendObserver;  	typedef std::list <LLIMSessionObserver *> session_observers_list_t;  	session_observers_list_t mSessionObservers; @@ -346,9 +372,6 @@ private:  	LLSD mPendingInvitations;  	LLSD mPendingAgentListUpdates; -	// ID of a session that is being removed: observers are already told -	// that this session is being removed, but it is still present in the sessions' map -	LLUUID	mBeingRemovedSessionID;  };  class LLIncomingCallDialog : public LLModalDialog diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp index 1683d113a9..383e540394 100644 --- a/indra/newview/llscreenchannel.cpp +++ b/indra/newview/llscreenchannel.cpp @@ -519,6 +519,7 @@ void LLScreenChannel::createStartUpToast(S32 notif_num, F32 timer)  	LLRect toast_rect;  	LLToast::Params p;  	p.lifetime_secs = timer; +	p.enable_hide_btn = false;  	mStartUpToastPanel = new LLToast(p);  	if(!mStartUpToastPanel) diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp index 86290e6695..93a931dc78 100644 --- a/indra/newview/llsyswellwindow.cpp +++ b/indra/newview/llsyswellwindow.cpp @@ -113,6 +113,12 @@ void LLSysWellWindow::connectListUpdaterToSignal(std::string notification_type)  }  //--------------------------------------------------------------------------------- +void LLSysWellWindow::onStartUpToastClick(S32 x, S32 y, MASK mask) +{ +	onChicletClick(); +} + +//---------------------------------------------------------------------------------  void LLSysWellWindow::onChicletClick()  {  	// 1 - remove StartUp toast and channel if present diff --git a/indra/newview/llsyswellwindow.h b/indra/newview/llsyswellwindow.h index fa6a1abea4..cbc5f7358f 100644 --- a/indra/newview/llsyswellwindow.h +++ b/indra/newview/llsyswellwindow.h @@ -76,6 +76,7 @@ public:  	void onItemClose(LLSysWellItem* item);  	void onStoreToast(LLPanel* info_panel, LLUUID id);  	void onChicletClick(); +	void onStartUpToastClick(S32 x, S32 y, MASK mask);  	// size constants for the window and for its elements  	static const S32 MAX_WINDOW_HEIGHT		= 200; diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index 57a4117d5d..366e5602bd 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -42,7 +42,6 @@  #include "llconsole.h"  #include "llinventorymodel.h"  #include "llnotify.h" -#include "llimview.h"  #include "llgesturemgr.h"  #include "llinventorybridge.h" diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index a1c15d9d0f..d46f155ad6 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -3511,7 +3511,6 @@ void set_god_level(U8 god_level)  {  	U8 old_god_level = gAgent.getGodLevel();  	gAgent.setGodLevel( god_level ); -	gIMMgr->refresh();  	LLViewerParcelMgr::getInstance()->notifyObservers();  	// God mode changes sim visibility diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index c659e58e47..f3c1cf191a 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -142,7 +142,6 @@  #include "llstatview.h"  #include "llsurface.h"  #include "llsurfacepatch.h" -#include "llimview.h"  #include "lltexlayer.h"  #include "lltextbox.h"  #include "lltexturecache.h" diff --git a/indra/newview/skins/default/xui/en/floater_nearby_chat.xml b/indra/newview/skins/default/xui/en/floater_nearby_chat.xml index 25d337ccec..d24d1b7064 100644 --- a/indra/newview/skins/default/xui/en/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/en/floater_nearby_chat.xml @@ -14,6 +14,7 @@   save_rect="true"   title="Nearby Chat"   save_visibility="true" + single_instance="true"   width="320">              <chat_history               allow_html="true"  diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 4c19b22ac5..7efda2b882 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -264,10 +264,6 @@  	<string name="TrackYourCamera">Track your camera</string>  	<string name="ControlYourCamera">Control your camera</string> -	<!-- IM --> -	<string name="IM_logging_string">-- Instant message logging enabled --</string> -	<string name="Unnamed">(Unnamed)</string> -	  	<!-- Sim Access labels -->  	<string name="SIM_ACCESS_PG">PG</string>  	<string name="SIM_ACCESS_MATURE">Mature</string> @@ -2884,7 +2880,11 @@ If you continue to receive this message, contact the [SUPPORT_SITE].  	  Failed to start viewer  	</string> -  <!-- IM system messages --> +	<!-- IM system messages --> +	<string name="IM_logging_string">-- Instant message logging enabled --</string> +	<string name="IM_typing_start_string">[NAME] is typing...</string> +	<string name="Unnamed">(Unnamed)</string> +    <string name="ringing-im">      Joining Voice Chat...    </string>  | 
