1 /*
2 * program: Rubrica
3 * file: groups_cb.c
4 *
5 *
6 * Copyright (C) 2000-2005 Nicola Fragale <nicolafragale@libero.it>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 3 of the License
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 */
21
22
23 #include <glib/gi18n-lib.h>
24 #include <gtk/gtk.h>
25 #include <glade/glade.h>
26
27 #include "libral.h"
28
29 #include "app.h"
30 #include "groups_view.h"
31 #include "groups_cb.h"
32 #include "themes.h"
33 #include "types.h"
34
35
36
37 static void on_entry_activated (GtkWidget* entry, gpointer data);
38 static void on_add_group (GtkWidget* button, gpointer data);
39 static void on_remove_group (GtkWidget* button, gpointer data);
40 static void on_modify_group (GtkWidget* button, gpointer data);
41
42
43 static void
on_entry_activated(GtkWidget * entry,gpointer data)44 on_entry_activated(GtkWidget* entry, gpointer data)
45 {
46 g_signal_emit_by_name(G_OBJECT(data), "clicked", NULL);
47 }
48
49
50 static void
on_add_group(GtkWidget * button,gpointer data)51 on_add_group (GtkWidget* button, gpointer data)
52 {
53 GladeXML* gui;
54 RubricaGroupsView* view = RUBRICA_GROUPS_VIEW(data);
55 RGroupBox* groups_box;
56 RGroup* group;
57 GtkWidget* win_lbl;
58 GtkWidget* entry;
59 GtkWidget* loadbt;
60 GtkWidget* ok;
61 GtkWidget* dialog;
62 GtkImage* image;
63 gchar* label;
64 gchar* str; /* group name */
65 gchar* uri = NULL; /* pixmap uri */
66 gint response;
67 char *markup;
68
69 groups_box = rubrica_groups_view_get_group_box(view);
70
71 gui = glade_xml_new (RUBRICA_GUI_DIR"/GroupManager.glade", NULL, NULL);
72 if (!gui)
73 g_error("\nCan't load interface");
74
75 dialog = glade_xml_get_widget(gui, "GroupManager");
76 win_lbl = glade_xml_get_widget(gui, "win_lbl");
77 ok = glade_xml_get_widget(gui, "okbutton1");
78 entry = glade_xml_get_widget(gui, "group_entry");
79 loadbt = glade_xml_get_widget(gui, "loadbt");
80 image = (GtkImage*) glade_xml_get_widget(gui, "image");
81 g_object_unref(gui);
82
83 label = g_strdup(_("Add new group"));
84 markup = g_markup_printf_escaped ("<b>%s</b>", label);
85 gtk_label_set_markup (GTK_LABEL (win_lbl), markup);
86 g_free (markup);
87 g_free (label);
88
89 g_object_set_data(G_OBJECT(loadbt), "uri", uri);
90
91 g_signal_connect(G_OBJECT(entry), "activate",
92 G_CALLBACK(on_entry_activated), ok);
93
94 g_signal_connect(G_OBJECT(loadbt), "clicked",
95 G_CALLBACK(rubrica_themes_load_pixmap), image);
96
97 response = gtk_dialog_run(GTK_DIALOG(dialog));
98 switch (response)
99 {
100 case GTK_RESPONSE_OK:
101 str = g_strdup(gtk_entry_get_text(GTK_ENTRY(entry)));
102 uri = g_object_get_data(G_OBJECT(loadbt), "uri");
103
104 group = r_group_new();
105 g_object_set(group,
106 "group-name", str, "group-label", str,
107 "group-owner", "user", "group-pixmap", uri,
108 "enabled", FALSE, NULL);
109 r_group_box_add_group(groups_box, group);
110 break;
111
112 case GTK_RESPONSE_CANCEL:
113 break;
114
115 default:
116 break;
117 }
118
119 gtk_widget_destroy(dialog);
120 }
121
122
123 static void
on_remove_group(GtkWidget * button,gpointer data)124 on_remove_group (GtkWidget* button, gpointer data)
125 {
126 RubricaGroupsView* view = RUBRICA_GROUPS_VIEW(data);
127 RGroupBox* box;
128 RGroup* group;
129 GtkTreeView* tree;
130 GtkTreeIter iter;
131 GtkTreeModel* model;
132 GtkTreeSelection *selection;
133 gchar* user = NULL;
134 gchar* name = NULL;
135
136 box = rubrica_groups_view_get_group_box(view);
137 tree = GTK_TREE_VIEW(rubrica_view_get_tree(RUBRICA_VIEW(view)));
138 model = gtk_tree_view_get_model(GTK_TREE_VIEW(tree));
139 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree));
140
141 if (gtk_tree_selection_get_selected(selection, &model, &iter))
142 {
143 gtk_tree_model_get(model, &iter,
144 GROUP_NAME_COLUMN, &name,
145 GROUP_OWNER_COLUMN, &user,
146 -1);
147
148 if (user && (g_ascii_strcasecmp("user", user) == 0))
149 {
150 group = r_group_box_find(box, name);
151 if (group)
152 r_group_box_delete_group(box, group);
153 }
154 }
155 }
156
157
158 static void
on_modify_group(GtkWidget * button,gpointer data)159 on_modify_group (GtkWidget* button, gpointer data)
160 {
161 RubricaGroupsView* view = RUBRICA_GROUPS_VIEW(data);
162 GladeXML* gui;
163 RGroupBox* box;
164 GtkTreeView* tree;
165 GtkTreeIter iter;
166 GtkTreeModel* model;
167 GtkTreeSelection *selection;
168 gchar* user = NULL;
169 gchar* name = NULL;
170 gchar* uri = NULL; /* pixmap uri */
171
172 box = rubrica_groups_view_get_group_box(view);
173 tree = GTK_TREE_VIEW(rubrica_view_get_tree(RUBRICA_VIEW(view)));
174 model = gtk_tree_view_get_model(GTK_TREE_VIEW(tree));
175 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree));
176
177 if (gtk_tree_selection_get_selected(selection, &model, &iter))
178 {
179 gtk_tree_model_get(model, &iter,
180 GROUP_NAME_COLUMN, &name,
181 GROUP_OWNER_COLUMN, &user,
182 GROUP_PIXMAP_PATH, &uri,
183 -1);
184
185 if (user && (g_ascii_strcasecmp("user", user) == 0))
186 {
187 GtkWidget* win_lbl;
188 GtkWidget* entry;
189 GtkWidget* loadbt;
190 GtkWidget* ok;
191 GtkWidget* dialog;
192 GtkImage* image;
193 gchar* label;
194 gint response;
195 char *markup;
196 gchar* newname;
197
198 gui = glade_xml_new (RUBRICA_GUI_DIR"/GroupManager.glade",
199 NULL, NULL);
200 if (!gui)
201 g_error("\nCan't load interface");
202
203 dialog = glade_xml_get_widget(gui, "GroupManager");
204 win_lbl = glade_xml_get_widget(gui, "win_lbl");
205 ok = glade_xml_get_widget(gui, "okbutton1");
206 entry = glade_xml_get_widget(gui, "group_entry");
207 loadbt = glade_xml_get_widget(gui, "loadbt");
208 image = (GtkImage*) glade_xml_get_widget(gui, "image");
209 g_object_unref(gui);
210
211 label = g_strdup(_("Modify group"));
212 markup = g_markup_printf_escaped ("<b>%s</b>", label);
213 gtk_label_set_markup (GTK_LABEL (win_lbl), markup);
214 g_free (markup);
215 g_free (label);
216
217 gtk_entry_set_text(GTK_ENTRY(entry), name);
218 if (uri)
219 {
220 GdkPixbuf *pixbuf;
221
222 g_object_set_data(G_OBJECT(loadbt), "uri", uri);
223
224 pixbuf = gdk_pixbuf_new_from_file_at_size (uri, 24, 24, NULL);
225 gtk_image_set_from_pixbuf (GTK_IMAGE (image), pixbuf);
226 if (pixbuf)
227 gdk_pixbuf_unref (pixbuf);
228 }
229
230 g_signal_connect(G_OBJECT(entry), "activate",
231 G_CALLBACK(on_entry_activated), ok);
232
233 g_signal_connect(G_OBJECT(loadbt), "clicked",
234 G_CALLBACK(rubrica_themes_load_pixmap), image);
235
236 response = gtk_dialog_run(GTK_DIALOG(dialog));
237 switch (response)
238 {
239 case GTK_RESPONSE_OK:
240 newname = g_strdup(gtk_entry_get_text(GTK_ENTRY(entry)));
241 uri = g_object_get_data(G_OBJECT(loadbt), "uri");
242
243 r_group_box_modify_group_pixmap(box, name, uri);
244 r_group_box_modify_group_name(box, name, newname);
245 break;
246
247 case GTK_RESPONSE_CANCEL:
248 break;
249
250 default:
251 break;
252 }
253
254 gtk_widget_destroy(dialog);
255 }
256 }
257 }
258
259
260
261 /* Public
262 */
263
264 gboolean
on_app_group_view_event_occurred(GtkTreeView * tree,GdkEvent * event,gpointer data)265 on_app_group_view_event_occurred (GtkTreeView* tree, GdkEvent *event,
266 gpointer data)
267 {
268 RubricaApp* app = (RubricaApp*) data;
269 GdkEventButton *ev = (GdkEventButton *)event;
270 GtkTreeModel *model;
271 GtkTreeSelection *selection;
272 GtkTreePath *path = NULL;
273 GtkTreeIter iter;
274 GtkWidget* view;
275
276 view = rubrica_app_get_groups_view(RUBRICA_APP(app));
277 model = gtk_tree_view_get_model(GTK_TREE_VIEW(tree));
278 selection = gtk_tree_view_get_selection(tree);
279 gtk_tree_selection_unselect_all(selection);
280
281 if (gtk_tree_view_get_path_at_pos(tree, ev->x, ev->y, &path, NULL,
282 NULL, NULL))
283 {
284 gtk_tree_selection_select_path(selection, path);
285 gtk_tree_model_get_iter(model, &iter, path);
286 gtk_tree_path_free(path);
287
288 if ((ev->type == GDK_BUTTON_PRESS) && (ev->button == 3))
289 {
290 GtkMenu* menu;
291 GtkWidget *remove;
292 GtkWidget *rename;
293 GtkWidget *add;
294 gchar* user = NULL;
295
296 gtk_tree_model_get(model, &iter, GROUP_OWNER_COLUMN, &user, -1);
297
298 menu = (GtkMenu*) gtk_menu_new();
299
300 add = gtk_menu_item_new_with_mnemonic (_("add a ne_w group"));
301 gtk_widget_show (add);
302 gtk_container_add (GTK_CONTAINER (menu), add);
303
304 rename = gtk_menu_item_new_with_mnemonic (_("_modify the group"));
305 gtk_widget_show (rename);
306 gtk_container_add (GTK_CONTAINER (menu), rename);
307
308 remove = gtk_menu_item_new_with_mnemonic (_("_remove the group"));
309 gtk_widget_show (remove);
310 gtk_container_add (GTK_CONTAINER (menu), remove);
311
312 if (user && (g_ascii_strcasecmp("user", user) == 0))
313 {
314 gtk_widget_set_sensitive(remove, TRUE);
315 gtk_widget_set_sensitive(rename, TRUE);
316 }
317 else
318 {
319 gtk_widget_set_sensitive(remove, FALSE);
320 gtk_widget_set_sensitive(rename, FALSE);
321 }
322
323 g_signal_connect (G_OBJECT(add), "activate",
324 G_CALLBACK (on_add_group), view);
325
326 g_signal_connect (G_OBJECT(remove), "activate",
327 G_CALLBACK (on_remove_group), view);
328
329 g_signal_connect (G_OBJECT(rename), "activate",
330 G_CALLBACK (on_modify_group), view);
331
332 gtk_widget_show_all(GTK_WIDGET(menu));
333 gtk_menu_popup (menu, NULL, NULL, NULL, NULL, ev->button, ev->time);
334
335 }
336 else
337 if ((ev->type == GDK_BUTTON_PRESS) && (ev->button == 1))
338 {
339 gchar* group;
340
341 gtk_tree_model_get(model, &iter, GROUP_NAME_COLUMN, &group, -1);
342
343 rubrica_app_display_cards_by_group(app, group);
344 }
345 }
346
347 return FALSE;
348 }
349
350
351
352 gboolean
on_form_group_view_event_occurred(GtkTreeView * tree,GdkEvent * event,gpointer data)353 on_form_group_view_event_occurred (GtkTreeView* tree, GdkEvent *event,
354 gpointer data)
355 {
356 GdkEventButton *ev = (GdkEventButton *)event;
357 GtkTreeSelection *selection;
358 GtkTreeModel *model;
359 GtkTreePath *path = NULL;
360 GtkTreeIter iter;
361 GtkWidget* group_view = (GtkWidget*) data;
362
363 model = gtk_tree_view_get_model(GTK_TREE_VIEW(tree));
364 selection = gtk_tree_view_get_selection(tree);
365 gtk_tree_selection_unselect_all(selection);
366
367 if (gtk_tree_view_get_path_at_pos(tree, ev->x, ev->y, &path, NULL,
368 NULL, NULL))
369 {
370 gtk_tree_selection_select_path(selection, path);
371 gtk_tree_model_get_iter(model, &iter, path);
372 gtk_tree_path_free(path);
373
374 if ((ev->type == GDK_BUTTON_PRESS) && (ev->button == 3))
375 {
376 GtkMenu* menu;
377 GtkWidget *remove;
378 GtkWidget *rename;
379 GtkWidget *add;
380 gchar* user = NULL;
381
382 gtk_tree_model_get(model, &iter, GROUP_OWNER_COLUMN, &user, -1);
383
384 menu = (GtkMenu*) gtk_menu_new();
385
386 add = gtk_menu_item_new_with_mnemonic (_("add a ne_w group"));
387 gtk_widget_show (add);
388 gtk_container_add (GTK_CONTAINER (menu), add);
389
390 rename = gtk_menu_item_new_with_mnemonic (_("_modify the group"));
391 gtk_widget_show (rename);
392 gtk_container_add (GTK_CONTAINER (menu), rename);
393
394 remove = gtk_menu_item_new_with_mnemonic (_("_remove the group"));
395 gtk_widget_show (remove);
396 gtk_container_add (GTK_CONTAINER (menu), remove);
397
398 if (user && (g_ascii_strcasecmp("user", user) == 0))
399 {
400 gtk_widget_set_sensitive(remove, TRUE);
401 gtk_widget_set_sensitive(rename, TRUE);
402 }
403 else
404 {
405 gtk_widget_set_sensitive(remove, FALSE);
406 gtk_widget_set_sensitive(rename, FALSE);
407 }
408
409 g_signal_connect (G_OBJECT(add), "activate",
410 G_CALLBACK (on_add_group), group_view);
411
412 g_signal_connect (G_OBJECT(remove), "activate",
413 G_CALLBACK (on_remove_group), group_view);
414
415 g_signal_connect (G_OBJECT(rename), "activate",
416 G_CALLBACK (on_modify_group), group_view);
417
418 gtk_widget_show_all(GTK_WIDGET(menu));
419 gtk_menu_popup (menu, NULL, NULL, NULL, NULL, ev->button, ev->time);
420 }
421 }
422
423 return FALSE;
424 }
425
426 /*
427 gint
428 on_key_press_event (GtkWidget *widget, GdkEventKey *event, gpointer data)
429 {
430 evaluate event so calendar is navigable with keyboard
431 switch (event->keyval)
432 {
433 case GDK_Escape:
434 break;
435
436 case GDK_Return:
437 case GDK_KP_Enter:
438 case
439 break;
440
441 default:
442 return FALSE;
443 }
444
445 g_signal_stop_emission_by_name (widget, "key_press_event");
446 hide_popup (RUBRICA_CALENDAR(data));
447
448 return TRUE;
449 }
450 */
451