summaryrefslogtreecommitdiff
path: root/indra/newview/llfloaterfriends.h
blob: e3f3f96d00cfbd96fb25d1a80a35608e9e2d1cfa (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
/** 
 * @file llfloaterfriends.h
 * @author Phoenix
 * @date 2005-01-13
 * @brief Declaration of class for displaying the local agent's friends.
 *
 * $LicenseInfo:firstyear=2005&license=viewergpl$
 * 
 * Copyright (c) 2005-2007, Linden Research, Inc.
 * 
 * Second Life Viewer Source Code
 * The source code in this file ("Source Code") is provided by Linden Lab
 * to you under the terms of the GNU General Public License, version 2.0
 * ("GPL"), unless you have obtained a separate licensing agreement
 * ("Other License"), formally executed by you and Linden Lab.  Terms of
 * the GPL can be found in doc/GPL-license.txt in this distribution, or
 * online at http://secondlife.com/developers/opensource/gplv2
 * 
 * There are special exceptions to the terms and conditions of the GPL as
 * it is applied to this Source Code. View the full text of the exception
 * in the file doc/FLOSS-exception.txt in this software distribution, or
 * online at http://secondlife.com/developers/opensource/flossexception
 * 
 * By copying, modifying or distributing this software, you acknowledge
 * that you have read and understood your obligations described above,
 * and agree to abide by those obligations.
 * 
 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
 * COMPLETENESS OR PERFORMANCE.
 * $/LicenseInfo$
 */

#ifndef LL_LLFLOATERFRIENDS_H
#define LL_LLFLOATERFRIENDS_H

#include "llpanel.h"
#include "llstring.h"
#include "lluuid.h"
#include "lltimer.h"
#include "llcallingcard.h"

class LLFriendObserver;
class LLRelationship;
class LLScrollListItem;
class LLScrollListCtrl;

/** 
 * @class LLPanelFriends
 * @brief An instance of this class is used for displaying your friends
 * and gives you quick access to all agents which a user relationship.
 *
 * @sa LLFloater
 */
class LLPanelFriends : public LLPanel, public LLEventTimer
{
public:
	LLPanelFriends();
	virtual ~LLPanelFriends();

	/** 
	 * @brief This method either creates or brings to the front the
	 * current instantiation of this floater. There is only once since
	 * you can currently only look at your local friends.
	 */
	virtual BOOL tick();

	/** 
	 * @brief This method is called in response to the LLAvatarTracker
	 * sending out a changed() message.
	 */
	void updateFriends(U32 changed_mask);

	virtual BOOL postBuild();

	// Show a dialog explaining what friendship entails, then request
	// friendship. JC
	static void requestFriendshipDialog(const LLUUID& target_id, 
										const std::string& target_name);

	// Just request friendship, no dialog.
	static void requestFriendship(const LLUUID& target_id,
								  const std::string& target_name, const std::string& message);

private:

	enum FRIENDS_COLUMN_ORDER
	{
		LIST_ONLINE_STATUS,
		LIST_FRIEND_NAME,
		LIST_VISIBLE_ONLINE,
		LIST_VISIBLE_MAP,
		LIST_EDIT_MINE,
		LIST_EDIT_THEIRS,
		LIST_FRIEND_UPDATE_GEN
	};

	// protected members
	typedef std::map<LLUUID, S32> rights_map_t;
	void refreshNames(U32 changed_mask);
	BOOL refreshNamesSync(const LLAvatarTracker::buddy_map_t & all_buddies);
	BOOL refreshNamesPresence(const LLAvatarTracker::buddy_map_t & all_buddies);
	void refreshUI();
	void refreshRightsChangeList();
	void applyRightsToFriends();
	BOOL addFriend(const LLUUID& agent_id);	
	BOOL updateFriendItem(const LLUUID& agent_id, const LLRelationship* relationship);

	typedef enum 
	{
		GRANT,
		REVOKE
	} EGrantRevoke;
	void confirmModifyRights(rights_map_t& ids, EGrantRevoke command);
	void sendRightsGrant(rights_map_t& ids);

	// return LLUUID::null if nothing is selected
	LLDynamicArray<LLUUID> getSelectedIDs();

	// callback methods
	static void onSelectName(LLUICtrl* ctrl, void* user_data);
	static void callbackAddFriendWithMessage(S32 option, const std::string& text, void* user_data);
	static void callbackAddFriend(S32 option, void* user_data);
	static void onPickAvatar(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* user_data);
	static void onMaximumSelect(void* user_data);

	static void onClickIM(void* user_data);
	static void onClickProfile(void* user_data);
	static void onClickAddFriend(void* user_data);
	static void onClickRemove(void* user_data);

	static void onClickOfferTeleport(void* user_data);
	static void onClickPay(void* user_data);

	static void onClickModifyStatus(LLUICtrl* ctrl, void* user_data);

	static void handleRemove(S32 option, void* user_data);
	static void modifyRightsConfirmation(S32 option, void* user_data);

private:
	// member data
	LLFriendObserver* mObserver;
	LLUUID mAddFriendID;
	std::string mAddFriendName;
	LLScrollListCtrl* mFriendsList;
	BOOL mShowMaxSelectWarning;
	BOOL mAllowRightsChange;
	S32 mNumRightsChanged;
};


#endif // LL_LLFLOATERFRIENDS_H