HEAD: rearrange things a bit so we can have a libwvbase.so, which contains
[wvapps.git] / evolution / acldialog.cc
blobda5c16e3d727a02ef3f4536b42afafc114eb2c58
1 #include "acldialog.h"
2 #include "uniconf.h"
4 void dialog_closed(GtkWidget *widget, gpointer data)
6 AclDialog *dialog = (AclDialog *)data;
7 delete dialog;
10 void read_toggled(GtkCellRendererToggle *cell,
11 gchar *path_str,
12 gpointer data)
14 AclDialog *dialog = (AclDialog *)data;
15 WvString eit_path = dialog->get_eit_path();
16 UniConf state = dialog->get_state();
18 GtkTreeModel *model = dialog->get_model();
19 GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
20 GtkTreeIter iter;
21 gboolean read;
22 gchar *username;
24 gtk_tree_model_get_iter (model, &iter, path);
25 gtk_tree_model_get (model, &iter, READ_ACCESS, &read, -1);
26 gtk_tree_model_get (model, &iter, USERNAME, &username, -1);
28 read ^= 1;
29 gtk_list_store_set (GTK_LIST_STORE (model), &iter,
30 READ_ACCESS, read, -1);
32 state["setacl"][eit_path].setmeint(1);
34 if (!read)
36 gtk_list_store_set (GTK_LIST_STORE (model), &iter,
37 WRITE_ACCESS, FALSE, -1);
38 gtk_list_store_set (GTK_LIST_STORE (model), &iter,
39 ADMIN_ACCESS, FALSE, -1);
40 state[eit_path]["acl"][username].setmeint(0);
42 else
43 state[eit_path]["acl"][username].setmeint(1);
45 gtk_tree_path_free (path);
46 g_free (username);
49 void write_toggled(GtkCellRendererToggle *cell,
50 gchar *path_str,
51 gpointer data)
53 AclDialog *dialog = (AclDialog *)data;
54 WvString eit_path = dialog->get_eit_path();
55 UniConf state = dialog->get_state();
57 GtkTreeModel *model = dialog->get_model();
58 GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
59 GtkTreeIter iter;
60 gboolean write;
61 gchar *username;
63 gtk_tree_model_get_iter (model, &iter, path);
64 gtk_tree_model_get (model, &iter, WRITE_ACCESS, &write, -1);
65 gtk_tree_model_get (model, &iter, USERNAME, &username, -1);
67 write ^= 1;
68 gtk_list_store_set (GTK_LIST_STORE (model), &iter,
69 WRITE_ACCESS, write, -1);
71 state["setacl"][eit_path].setmeint(1);
73 if (write)
75 gtk_list_store_set (GTK_LIST_STORE (model), &iter,
76 READ_ACCESS, TRUE, -1);
77 state[eit_path]["acl"][username].setmeint(2);
79 else
81 gtk_list_store_set (GTK_LIST_STORE (model), &iter,
82 ADMIN_ACCESS, FALSE, -1);
83 state[eit_path]["acl"][username].setmeint(1);
86 gtk_tree_path_free (path);
87 g_free (username);
90 void admin_toggled(GtkCellRendererToggle *cell,
91 gchar *path_str,
92 gpointer data)
94 AclDialog *dialog = (AclDialog *)data;
95 WvString eit_path = dialog->get_eit_path();
96 UniConf state = dialog->get_state();
98 GtkTreeModel *model = dialog->get_model();
99 GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
100 GtkTreeIter iter;
101 gboolean admin;
102 gchar *username;
105 gtk_tree_model_get_iter (model, &iter, path);
106 gtk_tree_model_get (model, &iter, ADMIN_ACCESS, &admin, -1);
107 gtk_tree_model_get (model, &iter, USERNAME, &username, -1);
109 admin ^= 1;
111 gtk_list_store_set (GTK_LIST_STORE (model), &iter,
112 ADMIN_ACCESS, admin, -1);
114 state["setacl"][eit_path].setmeint(1);
116 if (admin)
118 gtk_list_store_set (GTK_LIST_STORE (model), &iter,
119 READ_ACCESS, TRUE, -1);
120 gtk_list_store_set (GTK_LIST_STORE (model), &iter,
121 WRITE_ACCESS, TRUE, -1);
122 state[eit_path]["acl"][username].setmeint(3);
124 else
125 state[eit_path]["acl"][username].setmeint(2);
127 gtk_tree_path_free (path);
130 gint bool_compare(GtkTreeModel *model,
131 GtkTreeIter *a,
132 GtkTreeIter *b,
133 gpointer userdata)
135 gboolean on1 = FALSE;
136 gboolean on2 = FALSE;
137 gint sortcol = GPOINTER_TO_INT(userdata);
139 gtk_tree_model_get(model, a, sortcol, &on1, -1);
140 gtk_tree_model_get(model, b, sortcol, &on2, -1);
142 if (on1 == on2)
143 return 0;
144 else if (on1 > on2)
145 return 1;
146 else
147 return -1;
150 AclDialog::AclDialog(const WvStringParm _eit_path,
151 const WvStringParm _folder_name,
152 const UniConf &_state,
153 bool active) :
154 eit_path(_eit_path), folder_name(_folder_name), state(_state)
156 dialog = create_dialog(active);
159 AclDialog::~AclDialog()
161 gtk_widget_destroy(dialog);
164 GtkTreeModel *AclDialog::create_model()
166 gint acl = 0;
167 GtkListStore *store;
168 GtkTreeIter iter;
170 store = gtk_list_store_new (N_COLUMNS,
171 G_TYPE_STRING,
172 G_TYPE_BOOLEAN,
173 G_TYPE_BOOLEAN,
174 G_TYPE_BOOLEAN);
176 UniConf users = state["users"];
177 UniConf acls = state[eit_path]["acl"];
178 UniConf::Iter i(users);
179 for (i.rewind(); i.next(); )
181 acl = acls[i().key().printable()].getmeint();
182 acl = MAX(acl, 0);
184 gtk_list_store_append (store, &iter);
185 gtk_list_store_set (store, &iter,
186 USERNAME, i().key().printable().cstr(),
187 READ_ACCESS, MAX(acl, 0),
188 WRITE_ACCESS, MAX(acl - 1, 0),
189 ADMIN_ACCESS, MAX(acl - 2, 0),
190 -1);
193 return GTK_TREE_MODEL (store);
196 void AclDialog::add_columns(GtkTreeView *treeview)
198 GtkCellRenderer *render;
199 GtkTreeViewColumn *column;
201 /* column for usernames */
202 render = gtk_cell_renderer_text_new ();
203 column = gtk_tree_view_column_new_with_attributes ("Username",
204 render,
205 "text",
206 USERNAME,
207 NULL);
208 gtk_tree_view_column_set_min_width (column, USERNAME_COL_WIDTH);
209 gtk_tree_view_column_set_resizable (column, TRUE);
210 gtk_tree_view_column_set_sort_column_id (column, USERNAME);
211 gtk_tree_view_append_column (treeview, column);
213 /* column for read access */
214 render = gtk_cell_renderer_toggle_new ();
215 g_signal_connect (render, "toggled",
216 G_CALLBACK (read_toggled), this);
217 column = gtk_tree_view_column_new_with_attributes ("Read",
218 render,
219 "active",
220 READ_ACCESS,
221 NULL);
222 gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED);
223 gtk_tree_view_column_set_fixed_width (column, ACCESS_COL_WIDTH);
224 gtk_tree_view_column_set_sort_column_id (column, READ_ACCESS);
225 gtk_tree_view_append_column (treeview, column);
227 /* column for write access */
228 render = gtk_cell_renderer_toggle_new ();
229 g_signal_connect (render, "toggled",
230 G_CALLBACK (write_toggled), this);
231 column = gtk_tree_view_column_new_with_attributes ("Write",
232 render,
233 "active",
234 WRITE_ACCESS,
235 NULL);
236 gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED);
237 gtk_tree_view_column_set_fixed_width (column, ACCESS_COL_WIDTH);
238 gtk_tree_view_column_set_sort_column_id (column, WRITE_ACCESS);
239 gtk_tree_view_append_column (treeview, column);
241 /* column for admin access */
242 render = gtk_cell_renderer_toggle_new ();
243 g_signal_connect (render, "toggled",
244 G_CALLBACK (admin_toggled), this);
245 column = gtk_tree_view_column_new_with_attributes ("Admin",
246 render,
247 "active",
248 ADMIN_ACCESS,
249 NULL);
250 gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED);
251 gtk_tree_view_column_set_fixed_width (column, ACCESS_COL_WIDTH);
252 gtk_tree_view_column_set_sort_column_id (column, ADMIN_ACCESS);
253 gtk_tree_view_append_column (treeview, column);
256 GtkWidget *AclDialog::create_dialog(bool active)
258 WvString title("Permissions for %s", folder_name);
259 GdkGeometry hints;
260 GtkWidget *perm_dialog;
261 GtkWidget *vbox;
262 GtkWidget *scr_window;
263 GtkWidget *action_area;
264 GtkWidget *closebutton;
265 GtkWidget *permlist;
267 /* not actually a GtkDialog, but modelled after one */
268 perm_dialog = gtk_window_new (GTK_WINDOW_TOPLEVEL);
269 gtk_container_set_border_width (GTK_CONTAINER (perm_dialog), BORDER_WIDTH);
270 gtk_window_set_title (GTK_WINDOW (perm_dialog),
271 title);
272 g_signal_connect (perm_dialog, "close",
273 G_CALLBACK (dialog_closed), this);
275 vbox = gtk_vbox_new (FALSE, PADDING);
276 gtk_container_add (GTK_CONTAINER (perm_dialog), vbox);
278 scr_window = gtk_scrolled_window_new (NULL, NULL);
279 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scr_window),
280 GTK_SHADOW_ETCHED_IN);
281 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr_window),
282 GTK_POLICY_NEVER,
283 GTK_POLICY_ALWAYS);
284 gtk_box_pack_start (GTK_BOX (vbox), scr_window, TRUE, TRUE, 0);
286 /* create tree model */
287 model = create_model ();
288 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (model),
289 USERNAME, GTK_SORT_ASCENDING);
290 gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (model),
291 READ_ACCESS,
292 &bool_compare,
293 GINT_TO_POINTER(READ_ACCESS),
294 NULL);
295 gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (model),
296 WRITE_ACCESS,
297 &bool_compare,
298 GINT_TO_POINTER(WRITE_ACCESS),
299 NULL);
300 gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (model),
301 ADMIN_ACCESS,
302 &bool_compare,
303 GINT_TO_POINTER(ADMIN_ACCESS),
304 NULL);
306 /* create tree view */
307 permlist = gtk_tree_view_new_with_model (model);
308 gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (permlist), TRUE);
309 gtk_tree_view_set_search_column (GTK_TREE_VIEW (permlist),
310 USERNAME);
312 g_object_unref (model);
314 gtk_container_add (GTK_CONTAINER (scr_window), permlist);
316 add_columns (GTK_TREE_VIEW (permlist));
318 /* set up action area and button */
319 action_area = GTK_DIALOG (perm_dialog)->action_area;
320 action_area = gtk_hbox_new (FALSE, PADDING);
321 gtk_box_pack_start (GTK_BOX (vbox), action_area, FALSE, FALSE, 0);
323 closebutton = gtk_button_new_from_stock ("gtk-close");
324 GTK_WIDGET_SET_FLAGS (closebutton, GTK_CAN_DEFAULT);
325 g_signal_connect (closebutton, "clicked",
326 G_CALLBACK (dialog_closed), this);
327 gtk_box_pack_end (GTK_BOX (action_area), closebutton, FALSE, FALSE, 0);
329 /* make dialog inactive if the user doesn't have admin acces */
330 if (!active)
332 WvString msg("You do not have admin access to %s, "
333 "so you cannot modify permissions.", folder_name);
334 GtkWidget *label = gtk_label_new (msg);
336 gtk_widget_set_sensitive (permlist, FALSE);
337 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
338 gtk_box_pack_end (GTK_BOX (action_area), label, TRUE, TRUE, 0);
341 /* set hints for size, etc. */
342 memset(&hints, 0, sizeof(GdkGeometry));
343 hints.min_width = DIALOG_WIDTH;
344 hints.min_height = DIALOG_HEIGHT;
345 hints.max_width = DIALOG_WIDTH;
346 hints.max_height = DIALOG_HEIGHT;
347 hints.base_width = DIALOG_WIDTH;
348 hints.base_height = DIALOG_HEIGHT;
349 gtk_window_set_geometry_hints (GTK_WINDOW (perm_dialog),
350 GTK_WIDGET (vbox),
351 &hints,
352 GdkWindowHints (
353 GDK_HINT_MIN_SIZE |
354 GDK_HINT_MAX_SIZE |
355 GDK_HINT_BASE_SIZE));
357 /* finish and show */
358 gtk_widget_show_all (perm_dialog);
360 return perm_dialog;