314 lines
9.6 KiB
C++
314 lines
9.6 KiB
C++
/**
|
|
* @file fsfloaterim.h
|
|
* @brief LLIMFloater class definition
|
|
*
|
|
* $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
|
|
* http://www.firestormviewer.org
|
|
* $/LicenseInfo$
|
|
*/
|
|
|
|
// Original file: llimfloater.h
|
|
|
|
#ifndef FS_FLOATERIM_H
|
|
#define FS_FLOATERIM_H
|
|
|
|
#include "llchat.h"
|
|
#include "llinstantmessage.h"
|
|
#include "lllogchat.h"
|
|
#include "lltooldraganddrop.h"
|
|
#include "lltransientdockablefloater.h"
|
|
#include "llvoicechannel.h"
|
|
|
|
class FSChatHistory;
|
|
class FSFloaterIMTimer;
|
|
class FSPanelChatControlPanel;
|
|
class LLAvatarName;
|
|
class LLButton; // support sysinfo button -Zi
|
|
class LLChatEntry;
|
|
class LLInventoryCategory;
|
|
class LLInventoryItem;
|
|
class LLLayoutPanel;
|
|
class LLLayoutStack;
|
|
class LLPanelEmojiComplete;
|
|
class LLTextBox;
|
|
class LLTextEditor;
|
|
|
|
typedef boost::signals2::signal<void(const LLUUID& session_id)> floater_showed_signal_t;
|
|
|
|
/**
|
|
* Individual IM window that appears at the bottom of the screen,
|
|
* optionally "docked" to the bottom tray.
|
|
*/
|
|
class FSFloaterIM : public LLTransientDockableFloater, LLVoiceClientStatusObserver, LLFriendObserver, LLEventTimer
|
|
{
|
|
LOG_CLASS(FSFloaterIM);
|
|
public:
|
|
FSFloaterIM(const LLUUID& session_id);
|
|
|
|
virtual ~FSFloaterIM();
|
|
|
|
// LLView overrides
|
|
/*virtual*/ BOOL postBuild();
|
|
/*virtual*/ void setVisible(BOOL visible);
|
|
/*virtual*/ BOOL getVisible();
|
|
/*virtual*/ void setMinimized(BOOL b);
|
|
|
|
// LLFloater overrides
|
|
/*virtual*/ void onClose(bool app_quitting);
|
|
/*virtual*/ void setDocked(bool docked, bool pop_on_undock = true);
|
|
/*virtual*/ void onSnooze();
|
|
|
|
/*virtual*/ BOOL tick();
|
|
|
|
// Make IM conversion visible and update the message history
|
|
static FSFloaterIM* show(const LLUUID& session_id);
|
|
|
|
// Toggle panel specified by session_id
|
|
// Returns true iff panel became visible
|
|
static bool toggle(const LLUUID& session_id);
|
|
|
|
static FSFloaterIM* findInstance(const LLUUID& session_id);
|
|
|
|
static FSFloaterIM* getInstance(const LLUUID& session_id);
|
|
|
|
void sessionInitReplyReceived(const LLUUID& im_session_id);
|
|
|
|
// get new messages from LLIMModel
|
|
void updateMessages();
|
|
void reloadMessages(bool clean_messages = false);
|
|
void sendMsgFromInputEditor(EChatType type);
|
|
void sendMsg(const std::string& msg);
|
|
|
|
// callback for LLIMModel on new messages
|
|
// route to specific floater if it is visible
|
|
static void newIMCallback(const LLSD& data);
|
|
|
|
//AO: Callbacks for voice handling formerly in llPanelImControlPanel
|
|
void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state);
|
|
void onChange(EStatusType status, const LLSD& channelInfo, bool proximal);
|
|
void updateButtons(bool is_call_started);
|
|
void updateCallButton();
|
|
void changed(U32 mask);
|
|
// ## Zi: overridden to fix the IM focus bug - FIRE-3989 etc.
|
|
BOOL focusFirstItem(BOOL prefer_text_fields = FALSE, BOOL focus_flash = TRUE );
|
|
|
|
void onVisibilityChange(BOOL new_visibility);
|
|
void processIMTyping(const LLUUID& from_id, BOOL typing);
|
|
void processAgentListUpdates(const LLSD& body);
|
|
|
|
void updateChatHistoryStyle();
|
|
static void processChatHistoryStyleUpdate(const LLSD& newvalue);
|
|
|
|
static void clearAllOpenHistories(); // <FS:CR> FIRE-11734
|
|
|
|
void onChatSearchButtonClicked();
|
|
|
|
BOOL handleDragAndDrop(S32 x, S32 y, MASK mask,
|
|
BOOL drop, EDragAndDropType cargo_type,
|
|
void *cargo_data, EAcceptance *accept,
|
|
std::string& tooltip_msg);
|
|
|
|
virtual BOOL handleKeyHere( KEY key, MASK mask );
|
|
|
|
/**
|
|
* Returns true if chat is displayed in multi tabbed floater
|
|
* false if chat is displayed in multiple windows
|
|
*/
|
|
static bool isChatMultiTab();
|
|
|
|
void initIMSession(const LLUUID& session_id);
|
|
static void initIMFloater();
|
|
|
|
//used as a callback on receiving new IM message
|
|
static void sRemoveTypingIndicator(const LLSD& data);
|
|
|
|
static void onNewIMReceived(const LLUUID& session_id);
|
|
|
|
virtual LLTransientFloaterMgr::ETransientGroup getGroup() { return LLTransientFloaterMgr::IM; }
|
|
|
|
static boost::signals2::connection setIMFloaterShowedCallback(const floater_showed_signal_t::slot_type& cb);
|
|
static floater_showed_signal_t sIMFloaterShowedSignal;
|
|
|
|
S32 getLastChatMessageIndex() {return mLastMessageIndex;}
|
|
|
|
LLVoiceChannel* getVoiceChannel() { return mVoiceChannel; }
|
|
|
|
void updateUnreadMessageNotification(S32 unread_messages);
|
|
|
|
void loadInitialInvitedIDs();
|
|
|
|
bool isP2PChat() const { return mIsP2PChat; }
|
|
|
|
void handleMinimized(bool minimized);
|
|
|
|
void timedUpdate();
|
|
|
|
void onEmojiPickerToggleBtnClicked();
|
|
|
|
protected:
|
|
/* virtual */
|
|
void onClickCloseBtn(bool app_quitting = false);
|
|
/*virtual*/ bool applyRectControl();
|
|
|
|
// support sysinfo button -Zi
|
|
void onSysinfoButtonVisibilityChanged(const LLSD& yes);
|
|
LLButton* mSysinfoButton;
|
|
// support sysinfo button -Zi
|
|
|
|
BOOL enableViewerVersionCallback(const LLSD& notification,const LLSD& response); // <FS:Zi> Viewer version popup
|
|
void reshapeChatLayoutPanel();
|
|
private:
|
|
// process focus events to set a currently active session
|
|
/* virtual */ void onFocusLost();
|
|
/* virtual */ void onFocusReceived();
|
|
|
|
// Update the window title, input field help text, etc.
|
|
void updateSessionName(const std::string& ui_title, const std::string& ui_label);
|
|
|
|
// For display name lookups for IM window titles
|
|
void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name);
|
|
void fetchAvatarName(LLUUID& agent_id);
|
|
|
|
bool dropCallingCard(LLInventoryItem* item, bool drop);
|
|
bool dropCategory(LLInventoryCategory* category, bool drop);
|
|
bool dropPerson(LLUUID* person_id, bool drop);
|
|
|
|
BOOL isInviteAllowed() const;
|
|
BOOL inviteToSession(const uuid_vec_t& agent_ids);
|
|
|
|
void onInputEditorFocusReceived();
|
|
void onInputEditorFocusLost();
|
|
void onInputEditorKeystroke();
|
|
|
|
void doToSelected(const LLSD& userdata);
|
|
bool checkEnabled(const LLSD& userdata);
|
|
|
|
// support sysinfo button -Zi
|
|
void onSysinfoButtonClicked();
|
|
BOOL onSendSysinfo(const LLSD& notification,const LLSD& response);
|
|
// support sysinfo button -Zi
|
|
|
|
// connection to voice channel state change signal
|
|
boost::signals2::connection mVoiceChannelStateChangeConnection;
|
|
|
|
void setTyping(bool typing);
|
|
void onSlide();
|
|
static void* createPanelIMControl(void* userdata);
|
|
static void* createPanelGroupControl(void* userdata);
|
|
static void* createPanelAdHocControl(void* userdata);
|
|
|
|
// Add the "User is typing..." indicator.
|
|
void addTypingIndicator(const LLUUID& from_id);
|
|
|
|
// Remove the "User is typing..." indicator.
|
|
void removeTypingIndicator(const LLUUID& from_id = LLUUID::null);
|
|
|
|
static void closeHiddenIMToasts();
|
|
|
|
static void confirmLeaveCallCallback(const LLSD& notification, const LLSD& response);
|
|
|
|
void sendParticipantsAddedNotification(const uuid_vec_t& uuids);
|
|
|
|
void confirmSnooze();
|
|
void snoozeDurationCallback(const LLSD& notification, const LLSD& response);
|
|
void snooze(S32 duration = -1);
|
|
|
|
void onAddButtonClicked();
|
|
bool canAddSelectedToChat(const uuid_vec_t& uuids);
|
|
void addSessionParticipants(const uuid_vec_t& uuids);
|
|
void addP2PSessionParticipants(const LLSD& notification, const LLSD& response, const uuid_vec_t& uuids);
|
|
|
|
void onChatOptionsContextMenuItemClicked(const LLSD& userdata);
|
|
bool onChatOptionsCheckContextMenuItem(const LLSD& userdata);
|
|
bool onChatOptionsVisibleContextMenuItem(const LLSD& userdata);
|
|
bool onChatOptionsEnableContextMenuItem(const LLSD& userdata);
|
|
|
|
void onEmojiRecentPanelToggleBtnClicked();
|
|
void initEmojiRecentPanel();
|
|
void onRecentEmojiPicked(const LLSD& value);
|
|
|
|
FSPanelChatControlPanel* mControlPanel;
|
|
LLUUID mSessionID;
|
|
S32 mLastMessageIndex;
|
|
S32 mPendingMessages;
|
|
|
|
EInstantMessage mDialog;
|
|
LLUUID mOtherParticipantUUID;
|
|
FSChatHistory* mChatHistory;
|
|
LLChatEntry* mInputEditor;
|
|
LLLayoutPanel* mChatLayoutPanel;
|
|
LLLayoutStack* mInputPanels;
|
|
LLLayoutPanel* mUnreadMessagesNotificationPanel;
|
|
LLTextBox* mUnreadMessagesNotificationTextBox;
|
|
LLButton* mEmojiRecentPanelToggleBtn;
|
|
LLButton* mEmojiPickerToggleBtn;
|
|
LLLayoutPanel* mEmojiRecentPanel;
|
|
LLTextBox* mEmojiRecentEmptyText;
|
|
LLPanelEmojiComplete* mEmojiRecentIconsCtrl;
|
|
|
|
std::string mSavedTitle;
|
|
LLUIString mTypingStart;
|
|
bool mMeTyping;
|
|
bool mOtherTyping;
|
|
bool mShouldSendTypingState;
|
|
LLFrameTimer mTypingTimer;
|
|
LLFrameTimer mTypingTimeoutTimer;
|
|
LLFrameTimer mMeTypingTimer;
|
|
LLFrameTimer mOtherTypingTimer;
|
|
LLFrameTimer mRefreshNameTimer;
|
|
|
|
bool mSessionInitialized;
|
|
LLSD mQueuedMsgsForInit;
|
|
|
|
bool mIsP2PChat;
|
|
|
|
LLVoiceChannel* mVoiceChannel;
|
|
|
|
S32 mInputEditorPad;
|
|
S32 mChatLayoutPanelHeight;
|
|
S32 mFloaterHeight;
|
|
|
|
uuid_vec_t mInvitedParticipants;
|
|
uuid_vec_t mPendingParticipants;
|
|
|
|
boost::signals2::connection mAvatarNameCacheConnection;
|
|
|
|
bool mApplyRect;
|
|
|
|
FSFloaterIMTimer* mIMFloaterTimer;
|
|
|
|
boost::signals2::connection mRecentEmojisUpdatedCallbackConnection{};
|
|
};
|
|
|
|
class FSFloaterIMTimer : public LLEventTimer
|
|
{
|
|
public:
|
|
typedef boost::function<void()> callback_t;
|
|
|
|
FSFloaterIMTimer(callback_t callback);
|
|
/*virtual*/ BOOL tick();
|
|
|
|
private:
|
|
callback_t mCallback;
|
|
};
|
|
|
|
#endif // FS_FLOATERIM_H
|