summaryrefslogtreecommitdiff
path: root/indra/newview/llgrouplist.h
blob: 0e9da25c583c0265631e880696c3e6f161d6e3c9 (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
/** 
 * @file llgrouplist.h
 * @brief List of the groups the agent belongs to.
 *
 * $LicenseInfo:firstyear=2009&license=viewergpl$
 * 
 * Copyright (c) 2009, 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://secondlifegrid.net/programs/open_source/licensing/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://secondlifegrid.net/programs/open_source/licensing/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_LLGROUPLIST_H
#define LL_LLGROUPLIST_H

#include "llevent.h"
#include "llflatlistview.h"
#include "llpanel.h"
#include "llpointer.h"
#include "llstyle.h"
#include "llgroupmgr.h"

/**
 * Auto-updating list of agent groups.
 * 
 * Can use optional group name filter.
 * 
 * @see setNameFilter()
 */
class LLGroupList: public LLFlatListView, public LLOldEvents::LLSimpleListener
{
	LOG_CLASS(LLGroupList);
public:
	struct Params : public LLInitParam::Block<Params, LLFlatListView::Params> 
	{
		/**
		 * Contains a message for empty list when user is not a member of any group
		 */
		Optional<std::string>	no_groups_msg;

		/**
		 * Contains a message for empty list when all groups don't match passed filter
		 */
		Optional<std::string>	no_filtered_groups_msg;
		Params();
	};

	LLGroupList(const Params& p);
	virtual ~LLGroupList();

	virtual void draw(); // from LLView
	/*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); // from LLView

	void setNameFilter(const std::string& filter);
	void toggleIcons();
	bool getIconsVisible() const { return mShowIcons; }

	// *WORKAROUND: two methods to overload appropriate Params due to localization issue:
	// no_groups_msg & no_filtered_groups_msg attributes are not defined as translatable in VLT. See EXT-5931
	void setNoGroupsMsg(const std::string& msg) { mNoGroupsMsg = msg; }
	void setNoFilteredGroupsMsg(const std::string& msg) { mNoFilteredGroupsMsg = msg; }
	
private:
	void setDirty(bool val = true)		{ mDirty = val; }
	void refresh();
	void addNewItem(const LLUUID& id, const std::string& name, const LLUUID& icon_id, EAddPosition pos = ADD_BOTTOM);
	bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); // called on agent group list changes

	bool onContextMenuItemClick(const LLSD& userdata);
	bool onContextMenuItemEnable(const LLSD& userdata);

	LLHandle<LLView>	mContextMenuHandle;

	bool mShowIcons;
	bool mDirty;
	std::string mNameFilter;
	std::string mNoFilteredGroupsMsg;
	std::string mNoGroupsMsg;
};

class LLButton;
class LLIconCtrl;
class LLTextBox;

class LLGroupListItem : public LLPanel
	, public LLGroupMgrObserver
{
public:
	LLGroupListItem();
	~LLGroupListItem();
	/*virtual*/ BOOL postBuild();
	/*virtual*/ void setValue(const LLSD& value);
	void onMouseEnter(S32 x, S32 y, MASK mask);
	void onMouseLeave(S32 x, S32 y, MASK mask);

	const LLUUID& getGroupID() const			{ return mGroupID; }
	const std::string& getGroupName() const		{ return mGroupName; }

	void setName(const std::string& name, const std::string& highlight = LLStringUtil::null);
	void setGroupID(const LLUUID& group_id);
	void setGroupIconID(const LLUUID& group_icon_id);
	void setGroupIconVisible(bool visible);

	virtual void changed(LLGroupChange gc);
private:
	void setActive(bool active);
	void onInfoBtnClick();
	void onProfileBtnClick();

	LLTextBox*	mGroupNameBox;
	LLUUID		mGroupID;
	LLIconCtrl* mGroupIcon;
	LLButton*	mInfoBtn;

	std::string	mGroupName;
	LLStyle::Params mGroupNameStyle;

	static S32	sIconWidth; // icon width + padding
};
#endif // LL_LLGROUPLIST_H