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