diff options
Diffstat (limited to 'indra/newview/llconversationview.cpp')
| -rw-r--r-- | indra/newview/llconversationview.cpp | 726 | 
1 files changed, 364 insertions, 362 deletions
diff --git a/indra/newview/llconversationview.cpp b/indra/newview/llconversationview.cpp index 7e592ab468..a5b2ee29c7 100644 --- a/indra/newview/llconversationview.cpp +++ b/indra/newview/llconversationview.cpp @@ -1,25 +1,25 @@ -/**  +/**   * @file llconversationview.cpp   * @brief Implementation of conversations list widgets and views   *   * $LicenseInfo:firstyear=2009&license=viewerlgpl$   * 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. - *  + *   * 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. - *  + *   * 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 - *  + *   * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA   * $/LicenseInfo$   */ @@ -53,48 +53,48 @@ class LLNearbyVoiceClientStatusObserver : public LLVoiceClientStatusObserver  {  public: -	LLNearbyVoiceClientStatusObserver(LLConversationViewSession* conv) -	:	conversation(conv) -	{} +    LLNearbyVoiceClientStatusObserver(LLConversationViewSession* conv) +    :   conversation(conv) +    {} -	virtual void onChange(EStatusType status, const std::string &channelURI, bool proximal) -	{ -		conversation->showVoiceIndicator(conversation -			&& status != STATUS_JOINING -			&& status != STATUS_LEFT_CHANNEL -			&& LLVoiceClient::getInstance()->voiceEnabled() -			&& LLVoiceClient::getInstance()->isVoiceWorking()); -	} +    virtual void onChange(EStatusType status, const std::string &channelURI, bool proximal) +    { +        conversation->showVoiceIndicator(conversation +            && status != STATUS_JOINING +            && status != STATUS_LEFT_CHANNEL +            && LLVoiceClient::getInstance()->voiceEnabled() +            && LLVoiceClient::getInstance()->isVoiceWorking()); +    }  private: -	LLConversationViewSession* conversation; +    LLConversationViewSession* conversation;  }; -LLConversationViewSession::Params::Params() :	 -	container() +LLConversationViewSession::Params::Params() : +    container()  {}  LLConversationViewSession::LLConversationViewSession(const LLConversationViewSession::Params& p): -	LLFolderViewFolder(p), -	mContainer(p.container), -	mItemPanel(NULL), -	mCallIconLayoutPanel(NULL), -	mSessionTitle(NULL), -	mSpeakingIndicator(NULL), -	mVoiceClientObserver(NULL), -	mCollapsedMode(false), +    LLFolderViewFolder(p), +    mContainer(p.container), +    mItemPanel(NULL), +    mCallIconLayoutPanel(NULL), +    mSessionTitle(NULL), +    mSpeakingIndicator(NULL), +    mVoiceClientObserver(NULL), +    mCollapsedMode(false),      mHasArrow(true), -	mIsInActiveVoiceChannel(false), -	mFlashStateOn(false), -	mFlashStarted(false) +    mIsInActiveVoiceChannel(false), +    mFlashStateOn(false), +    mFlashStarted(false)  { -	mFlashTimer = new LLFlashTimer(); -	mAreChildrenInited = true; // inventory only +    mFlashTimer = new LLFlashTimer(); +    mAreChildrenInited = true; // inventory only  }  LLConversationViewSession::~LLConversationViewSession()  { -	mActiveVoiceChannelConnection.disconnect(); +    mActiveVoiceChannelConnection.disconnect();      if (mVoiceClientObserver)      { @@ -105,7 +105,9 @@ LLConversationViewSession::~LLConversationViewSession()          delete mVoiceClientObserver;      } -	mFlashTimer->unset(); +    mFlashTimer->unset(); +    delete mFlashTimer; +    mFlashStateOn = false;  }  void LLConversationViewSession::destroyView() @@ -160,216 +162,216 @@ void LLConversationViewSession::destroyView()  void LLConversationViewSession::setFlashState(bool flash_state)  { -	if (flash_state && !mFlashStateOn) -	{ -		// flash chat toolbar button if scrolled out of sight (because flashing will not be visible) -		if (mContainer->isScrolledOutOfSight(this)) -		{ -			gToolBarView->flashCommand(LLCommandId("chat"), true); -		} -	} +    if (flash_state && !mFlashStateOn) +    { +        // flash chat toolbar button if scrolled out of sight (because flashing will not be visible) +        if (mContainer->isScrolledOutOfSight(this)) +        { +            gToolBarView->flashCommand(LLCommandId("chat"), true); +        } +    } -	mFlashStateOn = flash_state; -	mFlashStarted = false; -	mFlashTimer->stopFlashing(); +    mFlashStateOn = flash_state; +    mFlashStarted = false; +    mFlashTimer->stopFlashing();  }  void LLConversationViewSession::setHighlightState(bool hihglight_state)  { -	mFlashStateOn = hihglight_state; -	mFlashStarted = true; -	mFlashTimer->stopFlashing(); +    mFlashStateOn = hihglight_state; +    mFlashStarted = true; +    mFlashTimer->stopFlashing();  }  void LLConversationViewSession::startFlashing()  { -	// Need to start flashing only when "Conversations" is opened or brought on top -	if (isInVisibleChain() -		&& mFlashStateOn -		&& !mFlashStarted -		&& ! LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container")->isMinimized() ) -	{ -		mFlashStarted = true; -		mFlashTimer->startFlashing(); -	} +    // Need to start flashing only when "Conversations" is opened or brought on top +    if (isInVisibleChain() +        && mFlashStateOn +        && !mFlashStarted +        && ! LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container")->isMinimized() ) +    { +        mFlashStarted = true; +        mFlashTimer->startFlashing(); +    }  }  bool LLConversationViewSession::isHighlightAllowed()  { -	return mFlashStateOn || mIsSelected; +    return mFlashStateOn || mIsSelected;  }  bool LLConversationViewSession::isHighlightActive()  { -	return (mFlashStateOn ? (mFlashTimer->isFlashingInProgress() ? mFlashTimer->isCurrentlyHighlighted() : true) : mIsCurSelection); +    return (mFlashStateOn ? (mFlashTimer->isFlashingInProgress() ? mFlashTimer->isCurrentlyHighlighted() : true) : mIsCurSelection);  }  bool LLConversationViewSession::postBuild()  { -	LLFolderViewItem::postBuild(); - -	mItemPanel = LLUICtrlFactory::getInstance()->createFromFile<LLPanel>("panel_conversation_list_item.xml", NULL, LLPanel::child_registry_t::instance()); -	addChild(mItemPanel); - -	mCallIconLayoutPanel = mItemPanel->getChild<LLPanel>("call_icon_panel"); -	mSessionTitle = mItemPanel->getChild<LLTextBox>("conversation_title"); - -	mActiveVoiceChannelConnection = LLVoiceChannel::setCurrentVoiceChannelChangedCallback(boost::bind(&LLConversationViewSession::onCurrentVoiceSessionChanged, this, _1)); -	mSpeakingIndicator = getChild<LLOutputMonitorCtrl>("speaking_indicator"); - -	LLConversationItem* vmi = dynamic_cast<LLConversationItem*>(getViewModelItem()); -	if (vmi) -	{ -		switch(vmi->getType()) -		{ -		case LLConversationItem::CONV_PARTICIPANT: -		case LLConversationItem::CONV_SESSION_1_ON_1: -		{ -			LLIMModel::LLIMSession* session=  LLIMModel::instance().findIMSession(vmi->getUUID()); -			if (session) -			{ -				LLAvatarIconCtrl* icon = mItemPanel->getChild<LLAvatarIconCtrl>("avatar_icon"); -				icon->setVisible(true); -				icon->setValue(session->mOtherParticipantID); -				mSpeakingIndicator->setSpeakerId(session->mOtherParticipantID, session->mSessionID, true); +    LLFolderViewItem::postBuild(); + +    mItemPanel = LLUICtrlFactory::getInstance()->createFromFile<LLPanel>("panel_conversation_list_item.xml", NULL, LLPanel::child_registry_t::instance()); +    addChild(mItemPanel); + +    mCallIconLayoutPanel = mItemPanel->getChild<LLPanel>("call_icon_panel"); +    mSessionTitle = mItemPanel->getChild<LLTextBox>("conversation_title"); + +    mActiveVoiceChannelConnection = LLVoiceChannel::setCurrentVoiceChannelChangedCallback(boost::bind(&LLConversationViewSession::onCurrentVoiceSessionChanged, this, _1)); +    mSpeakingIndicator = getChild<LLOutputMonitorCtrl>("speaking_indicator"); + +    LLConversationItem* vmi = dynamic_cast<LLConversationItem*>(getViewModelItem()); +    if (vmi) +    { +        switch(vmi->getType()) +        { +        case LLConversationItem::CONV_PARTICIPANT: +        case LLConversationItem::CONV_SESSION_1_ON_1: +        { +            LLIMModel::LLIMSession* session=  LLIMModel::instance().findIMSession(vmi->getUUID()); +            if (session) +            { +                LLAvatarIconCtrl* icon = mItemPanel->getChild<LLAvatarIconCtrl>("avatar_icon"); +                icon->setVisible(true); +                icon->setValue(session->mOtherParticipantID); +                mSpeakingIndicator->setSpeakerId(session->mOtherParticipantID, session->mSessionID, true);                  mHasArrow = false; -			} -			break; -		} -		case LLConversationItem::CONV_SESSION_AD_HOC: -		{ -			LLGroupIconCtrl* icon = mItemPanel->getChild<LLGroupIconCtrl>("group_icon"); -			icon->setVisible(true); -			mSpeakingIndicator->setSpeakerId(gAgentID, vmi->getUUID(), true); -			break; -		} -		case LLConversationItem::CONV_SESSION_GROUP: -		{ -			LLGroupIconCtrl* icon = mItemPanel->getChild<LLGroupIconCtrl>("group_icon"); -			icon->setVisible(true); -			icon->setValue(vmi->getUUID()); -			mSpeakingIndicator->setSpeakerId(gAgentID, vmi->getUUID(), true); -			break; -		} -		case LLConversationItem::CONV_SESSION_NEARBY: -		{ -			LLIconCtrl* icon = mItemPanel->getChild<LLIconCtrl>("nearby_chat_icon"); -			icon->setVisible(true); -			mSpeakingIndicator->setSpeakerId(gAgentID, LLUUID::null, true); -			mIsInActiveVoiceChannel = true; -			if(LLVoiceClient::instanceExists()) -			{ +            } +            break; +        } +        case LLConversationItem::CONV_SESSION_AD_HOC: +        { +            LLGroupIconCtrl* icon = mItemPanel->getChild<LLGroupIconCtrl>("group_icon"); +            icon->setVisible(true); +            mSpeakingIndicator->setSpeakerId(gAgentID, vmi->getUUID(), true); +            break; +        } +        case LLConversationItem::CONV_SESSION_GROUP: +        { +            LLGroupIconCtrl* icon = mItemPanel->getChild<LLGroupIconCtrl>("group_icon"); +            icon->setVisible(true); +            icon->setValue(vmi->getUUID()); +            mSpeakingIndicator->setSpeakerId(gAgentID, vmi->getUUID(), true); +            break; +        } +        case LLConversationItem::CONV_SESSION_NEARBY: +        { +            LLIconCtrl* icon = mItemPanel->getChild<LLIconCtrl>("nearby_chat_icon"); +            icon->setVisible(true); +            mSpeakingIndicator->setSpeakerId(gAgentID, LLUUID::null, true); +            mIsInActiveVoiceChannel = true; +            if(LLVoiceClient::instanceExists()) +            {                  if (mVoiceClientObserver)                  {                      LLVoiceClient::getInstance()->removeObserver(mVoiceClientObserver);                      delete mVoiceClientObserver;                  } -				mVoiceClientObserver = new LLNearbyVoiceClientStatusObserver(this); -				LLVoiceClient::getInstance()->addObserver(mVoiceClientObserver); -			} -			break; -		} -		default: -			break; -		} +                mVoiceClientObserver = new LLNearbyVoiceClientStatusObserver(this); +                LLVoiceClient::getInstance()->addObserver(mVoiceClientObserver); +            } +            break; +        } +        default: +            break; +        }          refresh(); // requires vmi -	} +    } -	return true; +    return true;  }  void LLConversationViewSession::draw()  { -	getViewModelItem()->update(); - -	const LLFolderViewItem::Params& default_params = LLUICtrlFactory::getDefaultParams<LLFolderViewItem>(); -	const bool show_context = (getRoot() ? getRoot()->getShowSelectionContext() : false); - -	// Indicate that flash can start (moot operation if already started, done or not flashing) -	startFlashing(); - -	// draw highlight for selected items -	drawHighlight(show_context, true, sHighlightBgColor, sFlashBgColor, sFocusOutlineColor, sMouseOverColor); - -	// Draw children if root folder, or any other folder that is open. Do not draw children when animating to closed state or you get rendering overlap. -	bool draw_children = getRoot() == static_cast<LLFolderViewFolder*>(this) || isOpen(); - -	// Todo/fix this: arrange hides children 'out of bonds', session 'slowly' adjusts container size, unhides children -	// this process repeats until children fit -	for (folders_t::iterator iter = mFolders.begin(); -		iter != mFolders.end();) -	{ -		folders_t::iterator fit = iter++; -		(*fit)->setVisible(draw_children); -	} -	for (items_t::iterator iter = mItems.begin(); -		iter != mItems.end();) -	{ -		items_t::iterator iit = iter++; -		(*iit)->setVisible(draw_children); -	} - -	// we don't draw the open folder arrow in minimized mode -	if (mHasArrow && !mCollapsedMode) -	{ -		// update the rotation angle of open folder arrow -		updateLabelRotation(); -		drawOpenFolderArrow(default_params, sFgColor); -	} -	LLView::draw(); +    getViewModelItem()->update(); + +    const LLFolderViewItem::Params& default_params = LLUICtrlFactory::getDefaultParams<LLFolderViewItem>(); +    const bool show_context = (getRoot() ? getRoot()->getShowSelectionContext() : false); + +    // Indicate that flash can start (moot operation if already started, done or not flashing) +    startFlashing(); + +    // draw highlight for selected items +    drawHighlight(show_context, true, sHighlightBgColor, sFlashBgColor, sFocusOutlineColor, sMouseOverColor); + +    // Draw children if root folder, or any other folder that is open. Do not draw children when animating to closed state or you get rendering overlap. +    bool draw_children = getRoot() == static_cast<LLFolderViewFolder*>(this) || isOpen(); + +    // Todo/fix this: arrange hides children 'out of bonds', session 'slowly' adjusts container size, unhides children +    // this process repeats until children fit +    for (folders_t::iterator iter = mFolders.begin(); +        iter != mFolders.end();) +    { +        folders_t::iterator fit = iter++; +        (*fit)->setVisible(draw_children); +    } +    for (items_t::iterator iter = mItems.begin(); +        iter != mItems.end();) +    { +        items_t::iterator iit = iter++; +        (*iit)->setVisible(draw_children); +    } + +    // we don't draw the open folder arrow in minimized mode +    if (mHasArrow && !mCollapsedMode) +    { +        // update the rotation angle of open folder arrow +        updateLabelRotation(); +        drawOpenFolderArrow(default_params, sFgColor); +    } +    LLView::draw();  }  bool LLConversationViewSession::handleMouseDown( S32 x, S32 y, MASK mask )  { -	//Will try to select a child node and then itself (if a child was not selected) +    //Will try to select a child node and then itself (if a child was not selected)      bool result = LLFolderViewFolder::handleMouseDown(x, y, mask);      //This node (conversation) was selected and a child (participant) was not      if(result && getRoot())      { -		if(getRoot()->getCurSelectedItem() == this) -		{ -			LLConversationItem* item = dynamic_cast<LLConversationItem *>(getViewModelItem()); -			LLUUID session_id = item? item->getUUID() : LLUUID(); +        if(getRoot()->getCurSelectedItem() == this) +        { +            LLConversationItem* item = dynamic_cast<LLConversationItem *>(getViewModelItem()); +            LLUUID session_id = item? item->getUUID() : LLUUID(); -			LLFloaterIMContainer *im_container = LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container"); -			if (im_container->isConversationsPaneCollapsed() && im_container->getSelectedSession() == session_id) -			{ -				im_container->collapseMessagesPane(!im_container->isMessagesPaneCollapsed()); -			} -			else -			{ -				im_container->collapseMessagesPane(false); -			} -		} -		selectConversationItem(); +            LLFloaterIMContainer *im_container = LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container"); +            if (im_container->isConversationsPaneCollapsed() && im_container->getSelectedSession() == session_id) +            { +                im_container->collapseMessagesPane(!im_container->isMessagesPaneCollapsed()); +            } +            else +            { +                im_container->collapseMessagesPane(false); +            } +        } +        selectConversationItem();      } -	return result; +    return result;  }  bool LLConversationViewSession::handleMouseUp( S32 x, S32 y, MASK mask )  { -	bool result = LLFolderViewFolder::handleMouseUp(x, y, mask); +    bool result = LLFolderViewFolder::handleMouseUp(x, y, mask); -	LLFloater* volume_floater = LLFloaterReg::findInstance("floater_voice_volume"); -	LLFloater* chat_volume_floater = LLFloaterReg::findInstance("chat_voice"); -	if (result  -		&& getRoot() && (getRoot()->getCurSelectedItem() == this) -		&& !(volume_floater && volume_floater->isShown() && volume_floater->hasFocus()) -		&& !(chat_volume_floater && chat_volume_floater->isShown() && chat_volume_floater->hasFocus())) -	{ -		LLConversationItem* item = dynamic_cast<LLConversationItem *>(getViewModelItem()); -		LLUUID session_id = item? item->getUUID() : LLUUID(); -		LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::findConversation(session_id); -		if(session_floater && !session_floater->hasFocus()) -		{ -			session_floater->setFocus(true); -		} +    LLFloater* volume_floater = LLFloaterReg::findInstance("floater_voice_volume"); +    LLFloater* chat_volume_floater = LLFloaterReg::findInstance("chat_voice"); +    if (result +        && getRoot() && (getRoot()->getCurSelectedItem() == this) +        && !(volume_floater && volume_floater->isShown() && volume_floater->hasFocus()) +        && !(chat_volume_floater && chat_volume_floater->isShown() && chat_volume_floater->hasFocus())) +    { +        LLConversationItem* item = dynamic_cast<LLConversationItem *>(getViewModelItem()); +        LLUUID session_id = item? item->getUUID() : LLUUID(); +        LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::findConversation(session_id); +        if(session_floater && !session_floater->hasFocus()) +        { +            session_floater->setFocus(true); +        }      } -	return result; +    return result;  }  bool LLConversationViewSession::handleRightMouseDown( S32 x, S32 y, MASK mask ) @@ -378,23 +380,23 @@ bool LLConversationViewSession::handleRightMouseDown( S32 x, S32 y, MASK mask )      if(result)      { -		selectConversationItem(); +        selectConversationItem();      } -	return result; +    return result;  }  void LLConversationViewSession::selectConversationItem()  { -	if(getRoot()->getCurSelectedItem() == this) -	{ -		LLConversationItem* item = dynamic_cast<LLConversationItem *>(getViewModelItem()); -		LLUUID session_id = item? item->getUUID() : LLUUID(); +    if(getRoot()->getCurSelectedItem() == this) +    { +        LLConversationItem* item = dynamic_cast<LLConversationItem *>(getViewModelItem()); +        LLUUID session_id = item? item->getUUID() : LLUUID(); -		LLFloaterIMContainer *im_container = LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container"); -		im_container->flashConversationItemWidget(session_id,false); -		im_container->selectConversationPair(session_id, false); -	} +        LLFloaterIMContainer *im_container = LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container"); +        im_container->flashConversationItemWidget(session_id,false); +        im_container->selectConversationPair(session_id, false); +    }  }  // virtual @@ -404,92 +406,92 @@ S32 LLConversationViewSession::arrange(S32* width, S32* height)      S32 arranged = LLFolderViewFolder::arrange(width, height);      S32 h_pad = mHasArrow ? getIndentation() + mArrowSize : getIndentation(); -	 -	LLRect rect(mCollapsedMode ? getLocalRect().mLeft : h_pad, -				getLocalRect().mTop, -				getLocalRect().mRight, -				getLocalRect().mTop - getItemHeight()); -	mItemPanel->setShape(rect); -	return arranged; +    LLRect rect(mCollapsedMode ? getLocalRect().mLeft : h_pad, +                getLocalRect().mTop, +                getLocalRect().mRight, +                getLocalRect().mTop - getItemHeight()); +    mItemPanel->setShape(rect); + +    return arranged;  }  // virtual  void LLConversationViewSession::toggleOpen()  { -	// conversations should not be opened while in minimized mode -	if (!mCollapsedMode) -	{ -		LLFolderViewFolder::toggleOpen(); +    // conversations should not be opened while in minimized mode +    if (!mCollapsedMode) +    { +        LLFolderViewFolder::toggleOpen(); -		// do item's selection when opened -		if (LLFolderViewFolder::isOpen()) -		{ -			getParentFolder()->setSelection(this, true); -		} -		mContainer->reSelectConversation(); -	} +        // do item's selection when opened +        if (LLFolderViewFolder::isOpen()) +        { +            getParentFolder()->setSelection(this, true); +        } +        mContainer->reSelectConversation(); +    }  }  void LLConversationViewSession::toggleCollapsedMode(bool is_collapsed)  { -	mCollapsedMode = is_collapsed; +    mCollapsedMode = is_collapsed; -	// hide the layout stack which contains all item's child widgets -	// except for the icon which we display in minimized mode -	getChild<LLView>("conversation_item_stack")->setVisible(!mCollapsedMode); +    // hide the layout stack which contains all item's child widgets +    // except for the icon which we display in minimized mode +    getChild<LLView>("conversation_item_stack")->setVisible(!mCollapsedMode);      S32 h_pad = mHasArrow ? getIndentation() + mArrowSize : getIndentation(); -	mItemPanel->translate(mCollapsedMode ? -h_pad : h_pad, 0); +    mItemPanel->translate(mCollapsedMode ? -h_pad : h_pad, 0);  }  void LLConversationViewSession::setVisibleIfDetached(bool visible)  { -	// Do this only if the conversation floater has been torn off (i.e. no multi floater host) and is not minimized -	// Note: minimized dockable floaters are brought to front hence unminimized when made visible and we don't want that here -	LLFloater* session_floater = getSessionFloater(); -	if (session_floater && session_floater->isDetachedAndNotMinimized()) -	{ -		session_floater->setVisible(visible); -	} +    // Do this only if the conversation floater has been torn off (i.e. no multi floater host) and is not minimized +    // Note: minimized dockable floaters are brought to front hence unminimized when made visible and we don't want that here +    LLFloater* session_floater = getSessionFloater(); +    if (session_floater && session_floater->isDetachedAndNotMinimized()) +    { +        session_floater->setVisible(visible); +    }  }  LLFloater* LLConversationViewSession::getSessionFloater()  { -	LLFolderViewModelItem* item = mViewModelItem; -	LLUUID session_uuid = dynamic_cast<LLConversationItem*>(item)->getUUID(); -	return LLFloaterIMSessionTab::getConversation(session_uuid); +    LLFolderViewModelItem* item = mViewModelItem; +    LLUUID session_uuid = dynamic_cast<LLConversationItem*>(item)->getUUID(); +    return LLFloaterIMSessionTab::getConversation(session_uuid);  }  LLConversationViewParticipant* LLConversationViewSession::findParticipant(const LLUUID& participant_id)  { -	// This is *not* a general tree parsing algorithm. We search only in the mItems list -	// assuming there is no mFolders which makes sense for sessions (sessions don't contain -	// sessions). -	LLConversationViewParticipant* participant = NULL; -	items_t::const_iterator iter; -	for (iter = getItemsBegin(); iter != getItemsEnd(); iter++) -	{ -		participant = dynamic_cast<LLConversationViewParticipant*>(*iter); -		if (participant->hasSameValue(participant_id)) -		{ -			break; -		} -	} -	return (iter == getItemsEnd() ? NULL : participant); +    // This is *not* a general tree parsing algorithm. We search only in the mItems list +    // assuming there is no mFolders which makes sense for sessions (sessions don't contain +    // sessions). +    LLConversationViewParticipant* participant = NULL; +    items_t::const_iterator iter; +    for (iter = getItemsBegin(); iter != getItemsEnd(); iter++) +    { +        participant = dynamic_cast<LLConversationViewParticipant*>(*iter); +        if (participant->hasSameValue(participant_id)) +        { +            break; +        } +    } +    return (iter == getItemsEnd() ? NULL : participant);  }  void LLConversationViewSession::showVoiceIndicator(bool visible)  { -	mCallIconLayoutPanel->setVisible(visible && LLVoiceChannel::getCurrentVoiceChannel()->getSessionID().isNull()); -	requestArrange(); +    mCallIconLayoutPanel->setVisible(visible && LLVoiceChannel::getCurrentVoiceChannel()->getSessionID().isNull()); +    requestArrange();  }  void LLConversationViewSession::refresh()  { -	// Refresh the session view from its model data -	LLConversationItem* vmi = dynamic_cast<LLConversationItem*>(getViewModelItem()); +    // Refresh the session view from its model data +    LLConversationItem* vmi = dynamic_cast<LLConversationItem*>(getViewModelItem());      if (vmi)      {          vmi->resetRefresh(); @@ -505,28 +507,28 @@ void LLConversationViewSession::refresh()          }      } -	// Update all speaking indicators -	LLSpeakingIndicatorManager::updateSpeakingIndicators(); - -	// we should show indicator for specified voice session only if this is current channel. EXT-5562. -	if (mSpeakingIndicator) -	{ -		mSpeakingIndicator->setIsActiveChannel(mIsInActiveVoiceChannel); -		mSpeakingIndicator->setShowParticipantsSpeaking(mIsInActiveVoiceChannel); -	} - -	LLConversationViewParticipant* participant = NULL; -	items_t::const_iterator iter; -	for (iter = getItemsBegin(); iter != getItemsEnd(); iter++) -	{ -		participant = dynamic_cast<LLConversationViewParticipant*>(*iter); -		if (participant) -		{ -			participant->allowSpeakingIndicator(mIsInActiveVoiceChannel); -		} -	} - -	requestArrange(); +    // Update all speaking indicators +    LLSpeakingIndicatorManager::updateSpeakingIndicators(); + +    // we should show indicator for specified voice session only if this is current channel. EXT-5562. +    if (mSpeakingIndicator) +    { +        mSpeakingIndicator->setIsActiveChannel(mIsInActiveVoiceChannel); +        mSpeakingIndicator->setShowParticipantsSpeaking(mIsInActiveVoiceChannel); +    } + +    LLConversationViewParticipant* participant = NULL; +    items_t::const_iterator iter; +    for (iter = getItemsBegin(); iter != getItemsEnd(); iter++) +    { +        participant = dynamic_cast<LLConversationViewParticipant*>(*iter); +        if (participant) +        { +            participant->allowSpeakingIndicator(mIsInActiveVoiceChannel); +        } +    } + +    requestArrange();      if (vmi)      {          // Do the regular upstream refresh @@ -536,34 +538,34 @@ void LLConversationViewSession::refresh()  void LLConversationViewSession::onCurrentVoiceSessionChanged(const LLUUID& session_id)  { -	LLConversationItem* vmi = dynamic_cast<LLConversationItem*>(getViewModelItem()); +    LLConversationItem* vmi = dynamic_cast<LLConversationItem*>(getViewModelItem()); -	if (vmi) -	{ -		bool old_value = mIsInActiveVoiceChannel; -		mIsInActiveVoiceChannel = vmi->getUUID() == session_id; -		mCallIconLayoutPanel->setVisible(mIsInActiveVoiceChannel); -		if (old_value != mIsInActiveVoiceChannel) -		{ -			refresh(); -		} -	} +    if (vmi) +    { +        bool old_value = mIsInActiveVoiceChannel; +        mIsInActiveVoiceChannel = vmi->getUUID() == session_id; +        mCallIconLayoutPanel->setVisible(mIsInActiveVoiceChannel); +        if (old_value != mIsInActiveVoiceChannel) +        { +            refresh(); +        } +    }  }  bool LLConversationViewSession::highlightFriendTitle(LLConversationItem* vmi)  { -	if(vmi->getType() == LLConversationItem::CONV_PARTICIPANT || vmi->getType() == LLConversationItem::CONV_SESSION_1_ON_1) -	{ -		LLIMModel::LLIMSession* session=  LLIMModel::instance().findIMSession(vmi->getUUID()); -		if (session && LLAvatarActions::isFriend(session->mOtherParticipantID)) -		{ -			LLStyle::Params title_style; -			title_style.color = LLUIColorTable::instance().getColor("ConversationFriendColor"); -			mSessionTitle->setText(vmi->getDisplayName(), title_style); -			return true; -		} -	} -	return false; +    if(vmi->getType() == LLConversationItem::CONV_PARTICIPANT || vmi->getType() == LLConversationItem::CONV_SESSION_1_ON_1) +    { +        LLIMModel::LLIMSession* session=  LLIMModel::instance().findIMSession(vmi->getUUID()); +        if (session && LLAvatarActions::isFriend(session->mOtherParticipantID)) +        { +            LLStyle::Params title_style; +            title_style.color = LLUIColorTable::instance().getColor("ConversationFriendColor"); +            mSessionTitle->setText(vmi->getDisplayName(), title_style); +            return true; +        } +    } +    return false;  }  // @@ -574,7 +576,7 @@ static LLDefaultChildRegistry::Register<LLConversationViewParticipant> r("conver  bool LLConversationViewParticipant::sStaticInitialized = false;  S32 LLConversationViewParticipant::sChildrenWidths[LLConversationViewParticipant::ALIC_COUNT]; -LLConversationViewParticipant::Params::Params() :	 +LLConversationViewParticipant::Params::Params() :  container(),  participant_id(),  avatar_icon("avatar_icon"), @@ -583,7 +585,7 @@ output_monitor("output_monitor")  {}  LLConversationViewParticipant::LLConversationViewParticipant( const LLConversationViewParticipant::Params& p ): -	LLFolderViewItem(p), +    LLFolderViewItem(p),      mAvatarIcon(NULL),      mInfoBtn(NULL),      mSpeakingIndicator(NULL), @@ -593,20 +595,20 @@ LLConversationViewParticipant::LLConversationViewParticipant( const LLConversati  LLConversationViewParticipant::~LLConversationViewParticipant()  { -	mActiveVoiceChannelConnection.disconnect(); +    mActiveVoiceChannelConnection.disconnect();  }  void LLConversationViewParticipant::initFromParams(const LLConversationViewParticipant::Params& params) -{	 +{      LLAvatarIconCtrl::Params avatar_icon_params(params.avatar_icon());      applyXUILayout(avatar_icon_params, this);      LLAvatarIconCtrl * avatarIcon = LLUICtrlFactory::create<LLAvatarIconCtrl>(avatar_icon_params); -    addChild(avatarIcon);	 -     -	LLButton::Params info_button_params(params.info_button()); +    addChild(avatarIcon); + +    LLButton::Params info_button_params(params.info_button());      applyXUILayout(info_button_params, this); -	LLButton * button = LLUICtrlFactory::create<LLButton>(info_button_params); -	addChild(button);	 +    LLButton * button = LLUICtrlFactory::create<LLButton>(info_button_params); +    addChild(button);      LLOutputMonitorCtrl::Params output_monitor_params(params.output_monitor());      applyXUILayout(output_monitor_params, this); @@ -618,11 +620,11 @@ bool LLConversationViewParticipant::postBuild()  {      mAvatarIcon = getChild<LLAvatarIconCtrl>("avatar_icon"); -	mInfoBtn = getChild<LLButton>("info_btn"); -	mInfoBtn->setClickedCallback(boost::bind(&LLConversationViewParticipant::onInfoBtnClick, this)); -	mInfoBtn->setVisible(false); +    mInfoBtn = getChild<LLButton>("info_btn"); +    mInfoBtn->setClickedCallback(boost::bind(&LLConversationViewParticipant::onInfoBtnClick, this)); +    mInfoBtn->setVisible(false); -	mSpeakingIndicator = getChild<LLOutputMonitorCtrl>("speaking_indicator"); +    mSpeakingIndicator = getChild<LLOutputMonitorCtrl>("speaking_indicator");      if (!sStaticInitialized)      { @@ -644,7 +646,7 @@ bool LLConversationViewParticipant::postBuild()  void LLConversationViewParticipant::draw()  {      static LLUIColor sFgColor = LLUIColorTable::instance().getColor("MenuItemEnabledColor", DEFAULT_WHITE); -	static LLUIColor sFgDisabledColor = LLUIColorTable::instance().getColor("MenuItemDisabledColor", DEFAULT_WHITE); +    static LLUIColor sFgDisabledColor = LLUIColorTable::instance().getColor("MenuItemDisabledColor", DEFAULT_WHITE);      static LLUIColor sHighlightFgColor = LLUIColorTable::instance().getColor("MenuItemHighlightFgColor", DEFAULT_WHITE);      static LLUIColor sHighlightBgColor = LLUIColorTable::instance().getColor("MenuItemHighlightBgColor", DEFAULT_WHITE);      static LLUIColor sFlashBgColor = LLUIColorTable::instance().getColor("MenuItemFlashBgColor", DEFAULT_WHITE); @@ -658,32 +660,32 @@ void LLConversationViewParticipant::draw()      F32 y = (F32)getRect().getHeight() - font->getLineHeight() - (F32)mTextPad;      F32 text_left = (F32)getLabelXPos(); -	 -	LLColor4 color; - -	LLLocalSpeakerMgr *speakerMgr = LLLocalSpeakerMgr::getInstance(); - -	if (speakerMgr && speakerMgr->isSpeakerToBeRemoved(mUUID)) -	{ -		color = sFgDisabledColor; -	} -	else -	{ -		if (LLAvatarActions::isFriend(mUUID)) -		{ -			color = LLUIColorTable::instance().getColor("ConversationFriendColor"); -		} -		else -		{ -			color = mIsSelected ? sHighlightFgColor : sFgColor; -		} -	} - -	LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>(getViewModelItem()); -	if (participant_model) -	{ -		mSpeakingIndicator->setIsModeratorMuted(participant_model->isModeratorMuted()); -	} + +    LLColor4 color; + +    LLLocalSpeakerMgr *speakerMgr = LLLocalSpeakerMgr::getInstance(); + +    if (speakerMgr && speakerMgr->isSpeakerToBeRemoved(mUUID)) +    { +        color = sFgDisabledColor; +    } +    else +    { +        if (LLAvatarActions::isFriend(mUUID)) +        { +            color = LLUIColorTable::instance().getColor("ConversationFriendColor"); +        } +        else +        { +            color = mIsSelected ? sHighlightFgColor : sFgColor; +        } +    } + +    LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>(getViewModelItem()); +    if (participant_model) +    { +        mSpeakingIndicator->setIsModeratorMuted(participant_model->isModeratorMuted()); +    }      drawHighlight(show_context, mIsSelected, sHighlightBgColor, sFlashBgColor, sFocusOutlineColor, sMouseOverColor);      drawLabel(font, text_left, y, color, right_x); @@ -698,7 +700,7 @@ S32 LLConversationViewParticipant::arrange(S32* width, S32* height)      S32 arranged = LLFolderViewItem::arrange(width, height);      //Adjusts the avatar icon based upon the indentation -    LLRect avatarRect(getIndentation(),  +    LLRect avatarRect(getIndentation(),                          mAvatarIcon->getRect().mTop,                          getIndentation() + mAvatarIcon->getRect().getWidth(),                          mAvatarIcon->getRect().mBottom); @@ -713,15 +715,15 @@ S32 LLConversationViewParticipant::arrange(S32* width, S32* height)  // virtual  void LLConversationViewParticipant::refresh()  { -	// Refresh the participant view from its model data -	LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>(getViewModelItem()); +    // Refresh the participant view from its model data +    LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>(getViewModelItem());      if (participant_model)      {          participant_model->resetRefresh();          // *TODO: We should also do something with vmi->isModerator() to echo that state in the UI somewhat          mSpeakingIndicator->setIsModeratorMuted(participant_model->isModeratorMuted()); -         +          // Do the regular upstream refresh          LLFolderViewItem::refresh();      } @@ -731,7 +733,7 @@ void LLConversationViewParticipant::addToFolder(LLFolderViewFolder* folder)  {      // Add the item to the folder (conversation)      LLFolderViewItem::addToFolder(folder); -	 +      // Retrieve the folder (conversation) UUID, which is also the speaker session UUID      LLFolderViewFolder *prnt = getParentFolder();      if (prnt) @@ -751,36 +753,36 @@ void LLConversationViewParticipant::addToFolder(LLFolderViewFolder* folder)  void LLConversationViewParticipant::addToSession(const LLUUID& session_id)  { -	//Allows speaking icon image to be loaded based on mUUID -	mAvatarIcon->setValue(mUUID); -	 -	//Allows the speaker indicator to be activated based on the user and conversation -	mSpeakingIndicator->setSpeakerId(mUUID, session_id);  +    //Allows speaking icon image to be loaded based on mUUID +    mAvatarIcon->setValue(mUUID); + +    //Allows the speaker indicator to be activated based on the user and conversation +    mSpeakingIndicator->setSpeakerId(mUUID, session_id);  }  void LLConversationViewParticipant::onInfoBtnClick()  { -	LLFloaterReg::showInstance("inspect_avatar", LLSD().with("avatar_id", mUUID)); +    LLFloaterReg::showInstance("inspect_avatar", LLSD().with("avatar_id", mUUID));  }  bool LLConversationViewParticipant::handleMouseDown( S32 x, S32 y, MASK mask )  { -	bool result = LLFolderViewItem::handleMouseDown(x, y, mask); +    bool result = LLFolderViewItem::handleMouseDown(x, y, mask);      if(result && getRoot())      { -    	if(getRoot()->getCurSelectedItem() == this) -		{ -    		LLConversationItem* vmi = getParentFolder() ? dynamic_cast<LLConversationItem*>(getParentFolder()->getViewModelItem()) : NULL; -    		LLUUID session_id = vmi? vmi->getUUID() : LLUUID(); - -    		LLFloaterIMContainer *im_container = LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container"); -    		LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::findConversation(session_id); -			im_container->setSelectedSession(session_id); -			im_container->flashConversationItemWidget(session_id,false); -			im_container->selectFloater(session_floater); -			im_container->collapseMessagesPane(false); -		} +        if(getRoot()->getCurSelectedItem() == this) +        { +            LLConversationItem* vmi = getParentFolder() ? dynamic_cast<LLConversationItem*>(getParentFolder()->getViewModelItem()) : NULL; +            LLUUID session_id = vmi? vmi->getUUID() : LLUUID(); + +            LLFloaterIMContainer *im_container = LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container"); +            LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::findConversation(session_id); +            im_container->setSelectedSession(session_id); +            im_container->flashConversationItemWidget(session_id,false); +            im_container->selectFloater(session_floater); +            im_container->collapseMessagesPane(false); +        }      }      return result;  } @@ -877,7 +879,7 @@ LLView* LLConversationViewParticipant::getItemChildView(EAvatarListItemChildInde  void LLConversationViewParticipant::allowSpeakingIndicator(bool val)  { -	mSpeakingIndicator->setIsActiveChannel(val); +    mSpeakingIndicator->setIsActiveChannel(val);  }  // EOF  | 
