summaryrefslogtreecommitdiff
path: root/indra/newview/llfloaterimsession.h
blob: 7be68ccfc7c4553f66cd304d27599f6bbc514b23 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
/**
 * @file llfloaterimsession.h
 * @brief LLFloaterIMSession 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
 * $/LicenseInfo$
 */

#ifndef LL_FLOATERIMSESSION_H
#define LL_FLOATERIMSESSION_H

#include "llimview.h"
#include "llfloaterimsessiontab.h"
#include "llinstantmessage.h"
#include "lllogchat.h"
#include "lltooldraganddrop.h"
#include "llvoicechannel.h"
#include "llvoiceclient.h"

class LLAvatarName;
class LLButton;
class LLChatEntry;
class LLTextEditor;
class LLPanelChatControlPanel;
class LLChatHistory;
class LLInventoryItem;
class LLInventoryCategory;

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 LLFloaterIMSession
    : public LLVoiceClientStatusObserver
    , public LLFloaterIMSessionTab
{
    LOG_CLASS(LLFloaterIMSession);
public:
    LLFloaterIMSession(const LLUUID& session_id);

    virtual ~LLFloaterIMSession();

    void initIMSession(const LLUUID& session_id);
    void initIMFloater();

    // LLView overrides
    /*virtual*/ BOOL postBuild();
    /*virtual*/ void setMinimized(BOOL b);
    /*virtual*/ void setVisible(BOOL visible);
    /*virtual*/ BOOL getVisible();
    /*virtual*/ void setFocus(BOOL focus);
    // Check typing timeout timer.

    /*virtual*/ void draw();
    /*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
        EDragAndDropType cargo_type,
        void* cargo_data,
        EAcceptance* accept,
        std::string& tooltip_msg);

    static LLFloaterIMSession* findInstance(const LLUUID& session_id);
    static LLFloaterIMSession* getInstance(const LLUUID& session_id);

    // LLFloater overrides
    /*virtual*/ void onClose(bool app_quitting);
    /*virtual*/ void setDocked(bool docked, bool pop_on_undock = true);
    // Make IM conversion visible and update the message history
    static LLFloaterIMSession* show(const LLUUID& session_id);

    // Toggle panel specified by session_id
    // Returns true iff panel became visible
    static bool toggle(const LLUUID& session_id);

    void sessionInitReplyReceived(const LLUUID& im_session_id);

    // get new messages from LLIMModel
    /*virtual*/ void updateMessages();
    void reloadMessages(bool clean_messages = false);
    static void onSendMsg(LLUICtrl*, void*);
    void sendMsgFromInputEditor();
    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);

    // called when docked floater's position has been set by chiclet
    void setPositioned(bool b) { mPositioned = b; };

    void onVisibilityChanged(const LLSD& new_visibility);
    bool enableGearMenuItem(const LLSD& userdata);
    void GearDoToSelected(const LLSD& userdata);
    bool checkGearMenuItem(const LLSD& userdata);

    // Implements LLVoiceClientStatusObserver::onChange() to enable the call
    // button when voice is available
    void onChange(EStatusType status, const std::string &channelURI,
            bool proximal);

    virtual LLTransientFloaterMgr::ETransientGroup getGroup() { return LLTransientFloaterMgr::IM; }
    virtual void onVoiceChannelStateChanged(
            const LLVoiceChannel::EState& old_state,
            const LLVoiceChannel::EState& new_state);

    void processIMTyping(const LLUUID& from_id, BOOL typing);
    void processAgentListUpdates(const LLSD& body);
    void processSessionUpdate(const LLSD& session_update);

    //used as a callback on receiving new IM message
    static void sRemoveTypingIndicator(const LLSD& data);
    static void onIMChicletCreated(const LLUUID& session_id);
    const LLUUID& getOtherParticipantUUID() {return mOtherParticipantUUID;}

    static boost::signals2::connection setIMFloaterShowedCallback(const floater_showed_signal_t::slot_type& cb);
    static floater_showed_signal_t sIMFloaterShowedSignal;

    bool needsTitleOverwrite() { return mSessionNameUpdatedForTyping && mOtherTyping; }
    S32 getLastChatMessageIndex() {return mLastMessageIndex;}
private:

    /*virtual*/ void refresh();

    /*virtual*/ void onTearOffClicked();
    /*virtual*/ void onClickCloseBtn(bool app_qutting);

    // Update the window title and input field help text
    /*virtual*/ void updateSessionName(const std::string& name);

    bool dropPerson(LLUUID* person_id, bool drop);

    BOOL isInviteAllowed() const;
    BOOL inviteToSession(const uuid_vec_t& agent_ids);
    static void onInputEditorFocusReceived( LLFocusableElement* caller,void* userdata );
    static void onInputEditorFocusLost(LLFocusableElement* caller, void* userdata);
    static void onInputEditorKeystroke(LLTextEditor* caller, void* userdata);
    void setTyping(bool typing);
    void onAddButtonClicked();
    void addSessionParticipants(const uuid_vec_t& uuids);
    void addP2PSessionParticipants(const LLSD& notification, const LLSD& response, const uuid_vec_t& uuids);
    void sendParticipantsAddedNotification(const uuid_vec_t& uuids);
    bool canAddSelectedToChat(const uuid_vec_t& uuids);

    void onCallButtonClicked();

    void boundVoiceChannel();

    // 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);

    S32 mLastMessageIndex;

    EInstantMessage mDialog;
    LLUUID mOtherParticipantUUID;
    bool mPositioned;

    LLUIString mTypingStart;
    bool mMeTyping;
    bool mOtherTyping;
    bool mShouldSendTypingState;
    LLFrameTimer mTypingTimer;
    LLFrameTimer mTypingTimeoutTimer;
    bool mSessionNameUpdatedForTyping;
    LLFrameTimer mMeTypingTimer;
    LLFrameTimer mOtherTypingTimer;

    bool mSessionInitialized;
    LLSD mQueuedMsgsForInit;

    uuid_vec_t mInvitedParticipants;
    uuid_vec_t mPendingParticipants;

    // connection to voice channel state change signal
    boost::signals2::connection mVoiceChannelStateChangeConnection;

    LLUUID mImFromId;
};

#endif  // LL_FLOATERIMSESSION_H