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