1#include "Application.h"
2#include "Resources.h"
3#include "Window.h"
4#include "View.h"
5#include "Region.h"
6#include "Alert.h"
7#include "Button.h"
8#include "FindDirectory.h"
9#include "Mime.h"
10
11#include "string.h"
12#include "dirent.h"
13
14#include "ColumnListView.h"
15#include "CLVColumn.h"
16#include "CLVListItem.h"
17#include "CLVEasyItem.h"
18#include "NewStrings.h"
19
20#include "TreeControl.h"
21#include "ListControl.h"
22#include "Groups.h"
23#include "GroupProperties.h"
24#include "Icons.h"
25#include "besure_auth.h"
26
27#define WARN_REMOVE_GROUP	"Removing this group may prevent access to network resources and may permanently relinquish any rights held by users not specifically granted access by user account or via membership in another group.  Are you sure you want to remove this group?"
28
29const int32 MSG_GROUP_NEW			= 'GNew';
30const int32 MSG_GROUP_EDIT			= 'GEdt';
31const int32 MSG_GROUP_GONE			= 'GGon';
32
33
34GroupItem::GroupItem(BView *headerView, ColumnListView *listView, const char *text0, const char *text1) :
35  ListItem(headerView, text0, text1, "")
36{
37	BBitmap *icon;
38	BMessage archive;
39	size_t size;
40
41	list = listView;
42
43	char *bits = (char *) be_app->AppResources()->LoadResource(type_code('BBMP'), ICON_GROUP_SMALL, &size);
44	if (bits)
45		if (archive.Unflatten(bits) == B_OK)
46		{
47			icon = new BBitmap(&archive);
48
49			SetColumnContent(0, icon, 2.0);
50			SetColumnContent(1, text0);
51			SetColumnContent(2, text1);
52		}
53}
54
55GroupItem::~GroupItem()
56{
57}
58
59bool GroupItem::ItemInvoked()
60{
61	BRect r;
62	BRect frame = GetAssociatedHeader()->Window()->Frame();
63	status_t exitStatus;
64
65	r.Set(frame.left + 150, frame.top + 25, frame.left + 520, frame.top + 375);		// 370 x 350
66	GroupPropertiesPanel *info = new GroupPropertiesPanel(r, GetColumnContentText(1), NULL);
67	wait_for_thread(info->Thread(), &exitStatus);
68	return (!info->isCancelled());
69}
70
71void GroupItem::ItemSelected()
72{
73}
74
75void GroupItem::ItemDeselected()
76{
77}
78
79void GroupItem::ItemDeleted()
80{
81	removeGroup((char *) GetColumnContentText(1));
82}
83
84bool GroupItem::IsDeleteable()
85{
86	BAlert *alert = new BAlert("Remove Group?", WARN_REMOVE_GROUP, "Yes", "No");
87	alert->SetShortcut(1, B_ESCAPE);
88	alert->SetShortcut(0, 'y');
89	alert->SetShortcut(1, 'n');
90	return (alert->Go() == 0);
91}
92
93
94GroupsItem::GroupsItem(uint32 level, bool superitem, bool expanded, int32 resourceID, BView *headerView, ColumnListView *listView, char *text) :
95  TreeItem(level, superitem, expanded, resourceID, headerView, listView, text)
96{
97}
98
99void GroupsItem::ItemSelected()
100{
101	DIR *dir;
102	struct dirent *dirInfo;
103	ColumnListView *listView;
104	BView *headerView;
105
106	PurgeRows();
107	PurgeColumns();
108	PurgeHeader();
109	BuildHeader();
110
111	listView = GetAssociatedList();
112	headerView = GetAssociatedHeader();
113
114	listView->AddColumn(new CLVColumn(NULL, 20.0, CLV_LOCK_AT_BEGINNING | CLV_NOT_MOVABLE |
115		CLV_NOT_RESIZABLE | CLV_PUSH_PASS | CLV_MERGE_WITH_RIGHT));
116	listView->AddColumn(new CLVColumn("Group", 85.0, CLV_SORT_KEYABLE, 50.0));
117	listView->AddColumn(new CLVColumn("Description", 150.0, CLV_SORT_KEYABLE));
118
119	dir = OpenGroups();
120	if (dir)
121	{
122		while ((dirInfo = ReadGroup(dir)) != NULL)
123		{
124			char desc[64];
125			getGroupDesc(dirInfo->d_name, desc, sizeof(desc));
126			listView->AddItem(new GroupItem(headerView, listView, dirInfo->d_name, desc));
127		}
128
129		CloseGroups(dir);
130	}
131}
132
133void GroupsItem::ListItemSelected()
134{
135	btnEdit->SetEnabled(true);
136	btnRemove->SetEnabled(true);
137}
138
139void GroupsItem::ListItemDeselected()
140{
141	btnEdit->SetEnabled(false);
142	btnRemove->SetEnabled(false);
143}
144
145void GroupsItem::ListItemUpdated(int index, ListItem *item)
146{
147	ColumnListView *list = GetAssociatedList();
148	char desc[64];
149
150	getGroupDesc((char *) item->GetColumnContentText(1), desc, sizeof(desc));
151
152	list->LockLooper();
153	item->SetColumnContent(2, desc);
154	list->InvalidateItem(index);
155	list->UnlockLooper();
156}
157
158void GroupsItem::BuildHeader()
159{
160	BRect r;
161	BView *headerView = GetAssociatedHeader();
162	if (headerView)
163	{
164		r.Set(10, 55, 90, 75);
165		headerView->AddChild(new BButton(r, "AddUserBtn", "Add Group", new BMessage(MSG_GROUP_NEW)));
166
167		r.Set(100, 55, 180, 75);
168		btnEdit = new BButton(r, "EditUserBtn", "Edit Group", new BMessage(MSG_GROUP_EDIT));
169		btnEdit->SetEnabled(false);
170		headerView->AddChild(btnEdit);
171
172		r.Set(190, 55, 280, 75);
173		btnRemove = new BButton(r, "RemoveUserBtn", "Remove Group", new BMessage(MSG_GROUP_GONE));
174		btnRemove->SetEnabled(false);
175		headerView->AddChild(btnRemove);
176	}
177}
178
179bool GroupsItem::HeaderMessageReceived(BMessage *msg)
180{
181	GroupPropertiesPanel *info;
182	status_t exitStatus;
183	BRect r;
184	BRect frame = GetAssociatedHeader()->Window()->Frame();
185	r.Set(frame.left + 150, frame.top + 25, frame.left + 520, frame.top + 375);
186
187	SmartColumnListView *listView = (SmartColumnListView *) GetAssociatedList();
188	GroupItem *item = NULL;
189	int index = listView->CurrentSelection();
190	if (index >= 0)
191		item = (GroupItem *) listView->ItemAt(index);
192
193	switch (msg->what)
194	{
195		case MSG_GROUP_NEW:
196			info = new GroupPropertiesPanel(r, NULL, NULL);
197			wait_for_thread(info->Thread(), &exitStatus);
198			if (!info->isCancelled())
199			{
200				listView->LockLooper();
201				listView->AddItem(new GroupItem(GetAssociatedHeader(), listView, info->getGroup(), info->getDesc()));
202				listView->UnlockLooper();
203			}
204			break;
205
206		case MSG_GROUP_EDIT:
207			if (item)
208				if (item->ItemInvoked())
209					ListItemUpdated(index, item);
210			break;
211
212		case MSG_GROUP_GONE:
213			if (item)
214				listView->DeleteItem(index, item);
215			break;
216
217		default:
218			return false;
219	}
220
221	return false;
222}
223