4 void dialog_closed(GtkWidget
*widget
, gpointer data
)
6 AclDialog
*dialog
= (AclDialog
*)data
;
10 void read_toggled(GtkCellRendererToggle
*cell
,
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
);
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);
29 gtk_list_store_set (GTK_LIST_STORE (model
), &iter
,
30 READ_ACCESS
, read
, -1);
32 state
["setacl"][eit_path
].setmeint(1);
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);
43 state
[eit_path
]["acl"][username
].setmeint(1);
45 gtk_tree_path_free (path
);
49 void write_toggled(GtkCellRendererToggle
*cell
,
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
);
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);
68 gtk_list_store_set (GTK_LIST_STORE (model
), &iter
,
69 WRITE_ACCESS
, write
, -1);
71 state
["setacl"][eit_path
].setmeint(1);
75 gtk_list_store_set (GTK_LIST_STORE (model
), &iter
,
76 READ_ACCESS
, TRUE
, -1);
77 state
[eit_path
]["acl"][username
].setmeint(2);
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
);
90 void admin_toggled(GtkCellRendererToggle
*cell
,
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
);
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);
111 gtk_list_store_set (GTK_LIST_STORE (model
), &iter
,
112 ADMIN_ACCESS
, admin
, -1);
114 state
["setacl"][eit_path
].setmeint(1);
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);
125 state
[eit_path
]["acl"][username
].setmeint(2);
127 gtk_tree_path_free (path
);
130 gint
bool_compare(GtkTreeModel
*model
,
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);
150 AclDialog::AclDialog(const WvStringParm _eit_path
,
151 const WvStringParm _folder_name
,
152 const UniConf
&_state
,
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()
170 store
= gtk_list_store_new (N_COLUMNS
,
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();
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),
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",
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",
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",
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",
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
);
260 GtkWidget
*perm_dialog
;
262 GtkWidget
*scr_window
;
263 GtkWidget
*action_area
;
264 GtkWidget
*closebutton
;
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
),
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
),
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
),
293 GINT_TO_POINTER(READ_ACCESS
),
295 gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (model
),
298 GINT_TO_POINTER(WRITE_ACCESS
),
300 gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (model
),
303 GINT_TO_POINTER(ADMIN_ACCESS
),
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
),
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 */
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
),
355 GDK_HINT_BASE_SIZE
));
357 /* finish and show */
358 gtk_widget_show_all (perm_dialog
);