1 /*
2 *  Program: Rubrica
3 *  file: preferences.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 #include <glib/gi18n-lib.h>
23 #include <gtk/gtk.h>
24 #include <glade/glade.h>
25 #include <gconf/gconf-client.h>
26 #include "libral.h"
27 
28 #include "app.h"
29 #include "search.h"
30 #include "models.h"
31 #include "preferences.h"
32 #include "themes.h"
33 #include "types.h"
34 
35 
36 enum {
37   FILES_COLUMN,
38   TYPE_COLUMN,
39   FILES_LAST_COLUMN
40 };
41 
42 
43 static GConfEnumStringPair toolbar_pairs[] = {
44   {RUB_ICONS, "only icons"         },
45   {RUB_TEXT,  "only text"          },
46   {RUB_BOTH,  "both icons and text"},
47   {RUB_GNOME, "gnome default"      },
48   {0, NULL}
49 };
50 
51 static GConfEnumStringPair search_pairs[] = {
52   {PRINT_COLUMN,      "print"     },
53   {CARD_COLUMN,       "card"      },
54   {FIRST_NAME_COLUMN, "first name"},
55   {LAST_NAME_COLUMN,  "last name" },
56   {PROFESSION_COLUMN, "profession"},
57   {CITY_COLUMN,       "city"      },
58   {COUNTRY_COLUMN,    "country"   },
59   {WEB_CARD_COLUMN,   "web"       },
60   {EMAIL_CARD_COLUMN, "emails"    },
61   {TELEPHONE_COLUMN,  "telephone" },
62   {ASSIGNMENT_COLUMN, "assignment"},
63   {COMPANY_COLUMN,    "company"   },
64   {0, NULL}
65 };
66 
67 
68 static GConfEnumStringPair browser_pairs[] = {
69   {RUB_EPIPHANY,      "epiphany"  },
70   {RUB_FIREFOX,       "firefox"   },
71   {RUB_GALEON,        "galeon"    },
72   {RUB_KONQUEROR,     "konqueror" },
73   {RUB_MOZILLA,       "mozilla"   },
74   {RUB_SEAMONKEY,     "seamonkey" },
75   {RUB_OPERA,         "opera"     },
76   {RUB_OTHER_BROWSER, "other"     },
77   {0, NULL}
78 };
79 
80 static GConfEnumStringPair emailer_pairs[] = {
81   {RUB_BALSA,          "balsa"      },
82   {RUB_EVOLUTION,      "evolution"  },
83   {RUB_MOZILLA_MAIL,   "mozilla"    },
84   {RUB_SEAMONKEY_MAIL, "seamonkey"  },  // seamonkey -mail
85   {RUB_THUNDERBIRD,    "thunderbird"},
86   {RUB_OTHER_EMAILER,  "other"      },
87   {0, NULL}
88 };
89 
90 static GConfEnumStringPair irc_pairs[] = {
91   {RUB_PIDGIN,    "pidgin"    },
92   {RUB_GAIM,      "gaim"    },
93   {RUB_GABBER,    "gabber"  },
94   {RUB_GAJIM,     "gajim"   },
95   {RUB_GADU,      "GNU gadu"},
96   {RUB_GOSSIP,    "gossip"  },
97   {RUB_OTHER_IRC, "other"   },
98   {0, NULL}
99 };
100 
101 
102 
103 static RubricaThemedItem  toolbar[] = {
104   {N_("Only icons"),          "", NULL},
105   {N_("Only text"),           "", NULL},
106   {N_("Both icons and text"), "", NULL},
107   {N_("Icons and text alongside each other"), "", NULL},
108   {N_("Use Gnome settings"),  "", NULL},
109   {NULL}
110 };
111 
112 
113 static RubricaThemedItem browser[] = {
114   {"Epiphany",  "epiphany",       "epiphany"    },
115   {"Firefox",   "firefox",        "firefox"     },
116   {"Galeon",    "galeon",         "galeon"      },
117   {"Konqueror", "konqueror",      "konqueror"   },
118   {"Mozilla",   "mozilla-icon",   "mozilla"     },
119   {"Seamonkey", "seamonkey-icon", "seamonkey"   },
120   {"Opera",     "opera",          "opera"       },
121   {N_("Other"), "application-x-executable", NULL},
122   {NULL}
123 };
124 
125 static RubricaThemedItem emailer[] = {
126   {"Balsa",          "balsa_icon",               "balsa"      },
127   {"Evolution",      "evolution",                "evolution"  },
128   {"Mozilla mail",   "mozilla_mail",             "mozilla"    },
129   {"Seamonkey mail", "seamonkey-mail-icon",      "seamonkey"  },
130   {"Thunderbird",    "thunderbird",              "thunderbird"},
131   {N_("Other"),      "application-x-executable", NULL},
132   {NULL}
133 };
134 
135 static RubricaThemedItem ircs[] = {
136   {"Pidgin",    "pidgin",  "pidgin"},
137   {"Empathy",   "empathy", "empathy"},
138   {"Gabber",    "gabber",  "gabber"},
139   /*
140   {"Gajim",     "application-x-executable", ""},
141   {"GNU Gadu",  "application-x-executable", ""},
142   {"Gossip",    "application-x-executable", ""},
143   */
144   {N_("Other"), "application-x-executable", NULL},
145   {NULL}
146 };
147 
148 
149 typedef struct _prefer {
150   GtkWidget* dialog;
151 
152   GtkWidget* folder_chooser;
153 
154   GtkWidget* file_chooser;
155   GtkWidget* load_check;
156   GtkWidget* load_vbox;
157   GtkWidget* load_view;
158   GtkWidget* add;
159   GtkWidget* del;
160 
161   GtkWidget* compress;
162   GtkWidget* autosave;
163   GtkWidget* backup;
164 
165   GtkWidget* toolbar_combo;
166   GtkWidget* font_button;
167   GtkWidget* exit;
168 
169   GtkWidget* web_combo;
170   GtkWidget* email_combo;
171   GtkWidget* irc_combo;
172   GtkWidget* ekiga;
173 
174   GtkWidget* web_box;
175   GtkWidget* email_box;
176   GtkWidget* irc_box;
177   GtkWidget* web_entry;
178   GtkWidget* email_entry;
179   GtkWidget* irc_entry;
180 } RubricaPrefer;
181 
182 
183 
184 void on_load_check_cb           (GtkWidget* check, gpointer data);
185 void on_load_view_event         (GtkTreeView* tree, GdkEvent *event,
186 				 gpointer data);
187 void on_folder_chooser_cb       (GtkFileChooser *chooser, gpointer data);
188 void on_remove_addressbook      (GtkWidget* button, gpointer data);
189 void on_add_cb                  (GtkWidget* button, gpointer data);
190 
191 void on_compress_cb             (GtkWidget* spin,  gpointer data);
192 void on_autosave_cb             (GtkWidget* check, gpointer data);
193 void on_backup_cb               (GtkWidget* check, gpointer data);
194 void on_exit_cb                 (GtkWidget* check, gpointer data);
195 
196 void on_toolbar_style_cb        (GtkWidget* combo, gpointer data);
197 void on_font_set_cb             (GtkFontButton *widget, gpointer data);
198 // void on_search_changed_cb       (GtkWidget* combo, gpointer data);
199 void on_browser_changed_cb      (GtkWidget* combo, gpointer data);
200 void on_emailer_changed_cb      (GtkWidget* combo, gpointer data);
201 void on_irc_changed_cb          (GtkWidget* combo, gpointer data);
202 
203 void on_web_entry_activate_cb   (GtkWidget* combo, gpointer data);
204 void on_email_entry_activate_cb (GtkWidget* combo, gpointer data);
205 void on_irc_entry_activate_cb   (GtkWidget* combo, gpointer data);
206 
207 void on_ekiga_cb                (GtkWidget* check, gpointer data);
208 
209 
210 void rubrica_preferences_change_toolbar (GConfClient *client, guint cnxn_id,
211 					 GConfEntry *entry, gpointer data);
212 void rubrica_preferences_show_column    (GConfClient *client, guint cnxn_id,
213 					 GConfEntry *entry, gpointer data);
214 
215 void rubrica_preferences_font_changed   (GConfClient *client, guint cnxn_id,
216 					 GConfEntry *entry, gpointer data);
217 
218 void rubrica_preferences_gui_setup     (RubricaPrefer* prefer, gpointer data);
219 void rubrica_preferences_set_status    (RubricaPrefer* prefer,
220 					const gchar* key);
221 
222 void
on_load_check_cb(GtkWidget * check,gpointer data)223 on_load_check_cb(GtkWidget* check, gpointer data)
224 {
225   GConfClient* client;
226   RubricaPrefer* prefer = (RubricaPrefer*) data;
227   gboolean bool;
228 
229   client = gconf_client_get_default();
230   bool   = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(check));
231 
232   gtk_widget_set_sensitive(prefer->load_vbox, bool);
233   gconf_client_set_bool(client, RUBRICA_GCONF_LOAD_FILES, bool, NULL);
234 
235   g_object_unref(client);
236 }
237 
238 
239 void
on_load_view_event(GtkTreeView * tree,GdkEvent * event,gpointer data)240 on_load_view_event(GtkTreeView* tree, GdkEvent *event, gpointer data)
241 {
242   GdkEventButton *ev  = (GdkEventButton *) event;
243   GtkTreeModel *model;
244   GtkTreeSelection *selection;
245   GtkTreePath *path = NULL;
246   GtkTreeIter iter;
247 
248   model      = gtk_tree_view_get_model(GTK_TREE_VIEW(tree));
249   selection  = gtk_tree_view_get_selection(tree);
250 
251   if (gtk_tree_view_get_path_at_pos(tree, ev->x, ev->y, &path,
252 				    NULL, NULL, NULL))
253     {
254       gtk_tree_selection_select_path(selection, path);
255       gtk_tree_model_get_iter(model, &iter, path);
256       gtk_tree_path_free(path);
257 
258       if ((ev->type == GDK_BUTTON_PRESS) && (ev->button == 3))
259 	{
260 	  GtkMenu* menu;
261 	  GtkWidget *remove;
262 
263 	  menu = (GtkMenu*) gtk_menu_new();
264 
265 	  remove = gtk_menu_item_new_with_mnemonic(_("_remove the addressbook"));
266 	  gtk_widget_show (remove);
267 	  gtk_container_add (GTK_CONTAINER (menu), remove);
268 
269 	  g_signal_connect (G_OBJECT(remove), "activate",
270 			    G_CALLBACK (on_remove_addressbook), tree);
271 
272 	  gtk_widget_show_all(GTK_WIDGET(menu));
273 	  gtk_menu_popup (menu, NULL, NULL, NULL, NULL, ev->button, ev->time);
274 	}
275     }
276 }
277 
278 
279 
280 void
on_remove_addressbook(GtkWidget * button,gpointer data)281 on_remove_addressbook(GtkWidget* button, gpointer data)
282 {
283   GtkTreeView* tree = (GtkTreeView*) data;
284   GtkTreeModel *model;
285   GtkTreeSelection *selection;
286   GtkTreeIter iter;
287   GConfClient *client;
288 
289   model      = gtk_tree_view_get_model(GTK_TREE_VIEW(tree));
290   selection  = gtk_tree_view_get_selection(tree);
291   client     = gconf_client_get_default();
292 
293   if (gtk_tree_selection_get_selected(selection, &model, &iter))
294     {
295       gchar* file = NULL;
296       GSList* files = NULL;
297       GSList* l = NULL;
298 
299       gtk_tree_model_get(model, &iter, FILES_COLUMN, &file, -1);
300       gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
301 
302       files = gconf_client_get_list(client, RUBRICA_GCONF_FILES,
303 				    GCONF_VALUE_STRING, NULL);
304 
305       for(l = files; l; l = l->next)
306 	{
307 	  if (g_ascii_strcasecmp(file, (gchar*) l->data) == 0)
308 	    {
309 	      files = g_slist_remove_link(files, l);
310 	      g_free(file);
311 	      g_slist_free_1(l);
312 	      break;
313 	    }
314 	}
315 
316       gconf_client_set_list(client, RUBRICA_GCONF_FILES, GCONF_VALUE_STRING,
317 			    files, NULL);
318     }
319   else
320     {
321       g_warning("\nNo addressbook selected");
322     }
323 }
324 
325 
326 void
on_folder_chooser_cb(GtkFileChooser * chooser,gpointer data)327 on_folder_chooser_cb (GtkFileChooser *chooser, gpointer data)
328 {
329   gchar* folder = NULL;
330   GConfClient* client;
331 
332   client = gconf_client_get_default();
333   folder = gtk_file_chooser_get_current_folder (chooser);
334 
335   if (folder)
336     gconf_client_set_string(client, RUBRICA_GCONF_FOLDER, folder, NULL);
337 
338   g_object_unref(client);
339 }
340 
341 
342 
343 
344 void
on_add_cb(GtkWidget * button,gpointer data)345 on_add_cb (GtkWidget* button, gpointer data)
346 {
347   gchar* file = NULL;
348   GConfClient* client;
349   GtkTreeModel* model;
350   GtkTreeIter   iter;
351   RubricaPrefer* prefer = (RubricaPrefer*) data;
352 
353   client = gconf_client_get_default();
354 
355   file = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(prefer->file_chooser));
356   if (file)
357     {
358       GSList* files = NULL;
359 
360       files = gconf_client_get_list(client, RUBRICA_GCONF_FILES,
361 				    GCONF_VALUE_STRING, NULL);
362       files = g_slist_append(files, file);
363 
364       model = gtk_tree_view_get_model(GTK_TREE_VIEW(prefer->load_view));
365       gtk_list_store_append(GTK_LIST_STORE(model), &iter);
366       gtk_list_store_set(GTK_LIST_STORE(model), &iter, FILES_COLUMN, file, -1);
367 
368       gconf_client_set_list(client, RUBRICA_GCONF_FILES, GCONF_VALUE_STRING,
369 			    files, NULL);
370     }
371 
372   g_object_unref(client);
373 }
374 
375 void
on_del_cb(GtkWidget * button,gpointer data)376 on_del_cb(GtkWidget* button, gpointer data)
377 {
378   RubricaPrefer* prefer = (RubricaPrefer*) data;
379 
380   on_remove_addressbook(NULL, GTK_TREE_VIEW(prefer->load_view));
381 }
382 
383 
384 void
on_compress_cb(GtkWidget * spin,gpointer data)385 on_compress_cb (GtkWidget* spin, gpointer data)
386 {
387   GConfClient* client;
388   gint val;
389 
390   client = gconf_client_get_default();
391   val = (gint) gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin));
392   gconf_client_set_int(client, RUBRICA_GCONF_RATE, val, NULL);
393 
394   g_object_unref(client);
395 }
396 
397 
398 void
on_autosave_cb(GtkWidget * check,gpointer data)399 on_autosave_cb (GtkWidget* check, gpointer data)
400 {
401   GConfClient* client;
402   gboolean bool;
403 
404   client = gconf_client_get_default();
405   bool   = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(check));
406   gconf_client_set_bool(client, RUBRICA_GCONF_AUTOSAVE, bool, NULL);
407 
408   g_object_unref(client);
409 }
410 
411 
412 void
on_backup_cb(GtkWidget * check,gpointer data)413 on_backup_cb (GtkWidget* check, gpointer data)
414 {
415   GConfClient* client;
416   gboolean bool;
417 
418   client = gconf_client_get_default();
419   bool   = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(check));
420   gconf_client_set_bool(client, RUBRICA_GCONF_BACKUP, bool, NULL);
421 
422   g_object_unref(client);
423 }
424 
425 
426 /* notificare
427 void
428 on_tooltips_cb (GtkWidget* check, gpointer data)
429 {
430   GConfClient* client;
431   gboolean bool;
432 
433   client = gconf_client_get_default();
434   bool   = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(check));
435   gconf_client_set_bool(client, RUBRICA_GCONF_TOOLTIPS, bool, NULL);
436 
437   g_object_unref(client);
438 }
439 */
440 
441 void
on_exit_cb(GtkWidget * check,gpointer data)442 on_exit_cb (GtkWidget* check, gpointer data)
443 {
444   GConfClient* client;
445   gboolean bool;
446 
447   client = gconf_client_get_default();
448   bool   = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(check));
449   gconf_client_set_bool(client, RUBRICA_GCONF_CONFIRM_EXIT, bool, NULL);
450 
451   g_object_unref(client);
452 }
453 
454 
on_ekiga_cb(GtkWidget * check,gpointer data)455 void on_ekiga_cb (GtkWidget* check, gpointer data)
456 {
457   GConfClient* client;
458   gboolean bool;
459 
460   client = gconf_client_get_default();
461   bool   = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(check));
462   gconf_client_set_bool(client, RUBRICA_GCONF_EKIGA, bool, NULL);
463 
464   g_object_unref(client);
465 }
466 
467 
468 void
on_font_set_cb(GtkFontButton * button,gpointer data)469 on_font_set_cb (GtkFontButton *button, gpointer data)
470 {
471   const gchar* font = NULL;
472   GConfClient* client;
473 
474   client = gconf_client_get_default();
475   font =  gtk_font_button_get_font_name(GTK_FONT_BUTTON(button));
476 
477   if (font)
478     gconf_client_set_string(client, RUBRICA_GCONF_FONT, font, NULL);
479 
480   g_object_unref(client);
481 
482 }
483 
484 
485 void
on_toolbar_style_cb(GtkWidget * combo,gpointer data)486 on_toolbar_style_cb (GtkWidget* combo, gpointer data)
487 {
488   GConfClient* client;
489   gint active;
490   const gchar* val;
491 
492   client = gconf_client_get_default();
493   active = gtk_combo_box_get_active(GTK_COMBO_BOX(combo));
494   val    = gconf_enum_to_string (toolbar_pairs, active);
495   gconf_client_set_string(client, RUBRICA_GCONF_TOOLBAR, val, NULL);
496 
497   g_object_unref(client);
498 }
499 
500 
501 
502 void
on_browser_changed_cb(GtkWidget * combo,gpointer data)503 on_browser_changed_cb (GtkWidget* combo, gpointer data)
504 {
505   RubricaPrefer* prefer = (RubricaPrefer*) data;
506   GConfClient* client;
507   gint active;
508   const gchar* val;
509 
510   client = gconf_client_get_default();
511   active = gtk_combo_box_get_active(GTK_COMBO_BOX(combo));
512   val    = gconf_enum_to_string (browser_pairs, active);
513   gconf_client_set_string(client, RUBRICA_GCONF_BROWSER, val, NULL);
514 
515   if (active == RUB_OTHER_BROWSER)
516     gtk_widget_set_sensitive(prefer->web_box, TRUE);
517   else
518     gtk_widget_set_sensitive(prefer->web_box, FALSE);
519 
520   g_object_unref(client);
521 }
522 
523 
524 void
on_emailer_changed_cb(GtkWidget * combo,gpointer data)525 on_emailer_changed_cb (GtkWidget* combo, gpointer data)
526 {
527   RubricaPrefer* prefer = (RubricaPrefer*) data;
528   GConfClient* client;
529   gint active;
530   const gchar* val;
531 
532   client = gconf_client_get_default();
533   active = gtk_combo_box_get_active(GTK_COMBO_BOX(combo));
534   val    = gconf_enum_to_string (emailer_pairs, active);
535   gconf_client_set_string(client, RUBRICA_GCONF_EMAILS, val, NULL);
536 
537   if (active == RUB_OTHER_EMAILER)
538     gtk_widget_set_sensitive(prefer->email_box, TRUE);
539   else
540     gtk_widget_set_sensitive(prefer->email_box, FALSE);
541 
542   g_object_unref(client);
543 }
544 
545 
546 void
on_irc_changed_cb(GtkWidget * combo,gpointer data)547 on_irc_changed_cb (GtkWidget* combo, gpointer data)
548 {
549   RubricaPrefer* prefer = (RubricaPrefer*) data;
550   GConfClient* client;
551   gint active;
552   const gchar* val;
553 
554   client = gconf_client_get_default();
555   active = gtk_combo_box_get_active(GTK_COMBO_BOX(combo));
556   val    = gconf_enum_to_string (irc_pairs, active);
557   gconf_client_set_string(client, RUBRICA_GCONF_IRC, val, NULL);
558 
559   if (active == RUB_OTHER_IRC)
560     gtk_widget_set_sensitive(prefer->irc_box, TRUE);
561   else
562     gtk_widget_set_sensitive(prefer->irc_box, FALSE);
563 
564   g_object_unref(client);
565 }
566 
567 
568 void
on_web_entry_activate_cb(GtkWidget * combo,gpointer data)569 on_web_entry_activate_cb   (GtkWidget* combo, gpointer data)
570 {
571   RubricaPrefer* prefer = (RubricaPrefer*) data;
572   GConfClient* client;
573   const gchar* str;
574 
575   client = gconf_client_get_default();
576   str = gtk_entry_get_text(GTK_ENTRY(prefer->web_entry));
577   gconf_client_set_string(client, RUBRICA_GCONF_BROWSER_UD, str, NULL);
578 
579   g_object_unref(client);
580 }
581 
582 void
on_email_entry_activate_cb(GtkWidget * combo,gpointer data)583 on_email_entry_activate_cb (GtkWidget* combo, gpointer data)
584 {
585   RubricaPrefer* prefer = (RubricaPrefer*) data;
586   GConfClient* client;
587   const gchar* str;
588 
589   client = gconf_client_get_default();
590   str = gtk_entry_get_text(GTK_ENTRY(prefer->email_entry));
591   gconf_client_set_string(client, RUBRICA_GCONF_EMAILS_UD, str, NULL);
592 
593   g_object_unref(client);
594 }
595 
596 
597 void
on_irc_entry_activate_cb(GtkWidget * combo,gpointer data)598 on_irc_entry_activate_cb   (GtkWidget* combo, gpointer data)
599 {
600   RubricaPrefer* prefer = (RubricaPrefer*) data;
601   GConfClient* client;
602   const gchar* str;
603 
604   client = gconf_client_get_default();
605   str = gtk_entry_get_text(GTK_ENTRY(prefer->irc_entry));
606   gconf_client_set_string(client, RUBRICA_GCONF_IRC_UD, str, NULL);
607 
608   g_object_unref(client);
609 }
610 
611 
612 
613 void
rubrica_preferences_set_status(RubricaPrefer * prefer,const gchar * key)614 rubrica_preferences_set_status(RubricaPrefer* prefer, const gchar* key)
615 {
616   GConfClient* client;
617   gchar* str;
618   gint value;
619 
620   client = gconf_client_get_default();
621 
622   if (g_ascii_strcasecmp(key, RUBRICA_GCONF_TOOLBAR) == 0)
623     {
624       str = gconf_client_get_string(client, RUBRICA_GCONF_TOOLBAR, NULL);
625       gconf_string_to_enum(toolbar_pairs, str, &value);
626       gtk_combo_box_set_active(GTK_COMBO_BOX(prefer->toolbar_combo), value);
627     }
628 
629   if (g_ascii_strcasecmp(key, RUBRICA_GCONF_BROWSER) == 0)
630     {
631       str = gconf_client_get_string(client, RUBRICA_GCONF_BROWSER, NULL);
632       gconf_string_to_enum(browser_pairs, str, &value);
633       gtk_combo_box_set_active(GTK_COMBO_BOX(prefer->web_combo), value);
634 
635       if (value == RUB_OTHER_BROWSER)
636 	{
637 	  str = gconf_client_get_string(client, RUBRICA_GCONF_BROWSER_UD,
638 					NULL);
639 	  gtk_entry_set_text(GTK_ENTRY(prefer->web_entry), str);
640 	  gtk_widget_set_sensitive(prefer->web_box, TRUE);
641 	}
642       else
643 	gtk_widget_set_sensitive(prefer->web_box, FALSE);
644     }
645 
646   if (g_ascii_strcasecmp(key, RUBRICA_GCONF_EMAILS) == 0)
647     {
648       str = gconf_client_get_string(client, RUBRICA_GCONF_EMAILS, NULL);
649       gconf_string_to_enum(emailer_pairs, str, &value);
650       gtk_combo_box_set_active(GTK_COMBO_BOX(prefer->email_combo), value);
651 
652       if (value == RUB_OTHER_EMAILER)
653 	{
654 	  str = gconf_client_get_string(client, RUBRICA_GCONF_EMAILS_UD, NULL);
655 	  gtk_entry_set_text(GTK_ENTRY(prefer->email_entry), str);
656 	  gtk_widget_set_sensitive(prefer->email_box, TRUE);
657 	}
658       else
659 	gtk_widget_set_sensitive(prefer->email_box, FALSE);
660     }
661 
662   if (g_ascii_strcasecmp(key, RUBRICA_GCONF_IRC) == 0)
663     {
664       str = gconf_client_get_string(client, RUBRICA_GCONF_IRC, NULL);
665       gconf_string_to_enum(irc_pairs, str, &value);
666       gtk_combo_box_set_active(GTK_COMBO_BOX(prefer->irc_combo), value);
667 
668       if (value == RUB_OTHER_IRC)
669 	{
670 	  str = gconf_client_get_string(client, RUBRICA_GCONF_IRC_UD, NULL);
671 	  gtk_entry_set_text(GTK_ENTRY(prefer->irc_entry), str);
672 	  gtk_widget_set_sensitive(prefer->irc_box, TRUE);
673 	}
674       else
675 	gtk_widget_set_sensitive(prefer->irc_box, FALSE);
676     }
677 
678   g_object_unref(client);
679 }
680 
681 
682 void
rubrica_preferences_change_toolbar(GConfClient * client,guint cnxn_id,GConfEntry * entry,gpointer data)683 rubrica_preferences_change_toolbar(GConfClient *client, guint cnxn_id,
684 				   GConfEntry *entry, gpointer data)
685 {
686   RubricaApp* app = (RubricaApp*) data;
687   gchar* str;
688   gint style;
689 
690   str = gconf_client_get_string(client, RUBRICA_GCONF_TOOLBAR, NULL);
691   gconf_string_to_enum(toolbar_pairs, str, &style);
692   rubrica_app_set_toolbar_style(app, style);
693 }
694 
695 
696 void
rubrica_preferences_show_column(GConfClient * client,guint cnxn_id,GConfEntry * entry,gpointer data)697 rubrica_preferences_show_column(GConfClient *client, guint cnxn_id,
698 				GConfEntry *entry, gpointer data)
699 {
700   gboolean bool;
701   GtkTreeViewColumn* column = (GtkTreeViewColumn*) data;
702 
703   bool = gconf_value_get_bool (entry->value);
704   gtk_tree_view_column_set_visible(column, bool);
705 }
706 
707 void
rubrica_preferences_font_changed(GConfClient * client,guint cnxn_id,GConfEntry * entry,gpointer data)708 rubrica_preferences_font_changed (GConfClient *client, guint cnxn_id,
709 				  GConfEntry *entry, gpointer data)
710 {
711   RubricaApp* app = (RubricaApp*) data;
712   gchar* str;
713 
714   str = gconf_client_get_string(client, RUBRICA_GCONF_FONT, NULL);
715   rubrica_app_set_font(app, str);
716 }
717 
718 
719 
720 void
rubrica_preferences_gui_setup(RubricaPrefer * prefer,gpointer data)721 rubrica_preferences_gui_setup(RubricaPrefer* prefer, gpointer data)
722 {
723   RubricaApp* app = (RubricaApp*) data;
724   GConfClient* client;
725   GtkTreeModel* model;
726   GtkTreeIter  iter;
727   GtkTreeSelection* selection;
728   GtkCellRenderer *renderer;
729   GSList* files = NULL;
730   gboolean bool;
731   gint rate;
732   gchar* folder;
733   gchar* font = NULL;
734 
735   client = gconf_client_get_default();
736 
737   /* Addressbook page */
738   /* addressbooks files list view */
739   model  = (GtkTreeModel*) gtk_list_store_new(FILES_LAST_COLUMN,
740 					      G_TYPE_STRING,
741 					      G_TYPE_STRING);
742   gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(model),
743 				       FILES_COLUMN, GTK_SORT_ASCENDING);
744   gtk_tree_view_set_model(GTK_TREE_VIEW(prefer->load_view), model);
745   selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(prefer->load_view));
746   renderer  = gtk_cell_renderer_text_new();
747   gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(prefer->load_view),
748 					      -1, _("Addressbook"),
749 					      renderer, "text",
750 					      FILES_COLUMN, NULL);
751 
752   renderer  = gtk_cell_renderer_text_new();
753   gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(prefer->load_view),
754 					      -1, _("Type"),
755 					      renderer, "text",
756 					      TYPE_COLUMN, NULL);
757 
758   /* default addressbooks's folder */
759   folder = gconf_client_get_string(client, RUBRICA_GCONF_FOLDER, NULL);
760   gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(prefer->folder_chooser),
761 				      folder);
762 
763   /* addressbooks to load at startup */
764   bool = gconf_client_get_bool(client, RUBRICA_GCONF_LOAD_FILES, NULL);
765   gtk_widget_set_sensitive(prefer->load_vbox, bool);
766   gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(prefer->load_check), bool);
767 
768   /* addressbooks list */
769   files  = gconf_client_get_list(client, RUBRICA_GCONF_FILES,
770 				 GCONF_VALUE_STRING, NULL);
771   for (; files; files = files->next)
772     {
773       gtk_list_store_append(GTK_LIST_STORE(model), &iter);
774       gtk_list_store_set(GTK_LIST_STORE(model), &iter,
775 			 FILES_COLUMN, (gchar*) files->data,
776 			 -1);
777     }
778 
779   /* combo buttons */
780   rubrica_themes_create_themed_list(GTK_COMBO_BOX(prefer->toolbar_combo),
781 				    toolbar);
782   rubrica_themes_create_themed_list(GTK_COMBO_BOX(prefer->web_combo), browser);
783   rubrica_themes_create_themed_list(GTK_COMBO_BOX(prefer->email_combo),
784 				    emailer);
785   rubrica_themes_create_themed_list(GTK_COMBO_BOX(prefer->irc_combo), ircs);
786 
787   rubrica_preferences_set_status (prefer, RUBRICA_GCONF_TOOLBAR);
788   rubrica_preferences_set_status (prefer, RUBRICA_GCONF_BROWSER);
789   rubrica_preferences_set_status (prefer, RUBRICA_GCONF_EMAILS);
790   rubrica_preferences_set_status (prefer, RUBRICA_GCONF_IRC);
791   rubrica_preferences_set_status (prefer, RUBRICA_GCONF_SEARCH_ON);
792 
793   /* toolbar settings change */
794   gconf_client_notify_add(client, RUBRICA_GCONF_TOOLBAR,
795 			  rubrica_preferences_change_toolbar,
796 			  app, NULL, NULL);
797 
798   /* font button */
799   font = gconf_client_get_string(client, RUBRICA_GCONF_FONT, NULL);
800   gtk_font_button_set_font_name (GTK_FONT_BUTTON(prefer->font_button), font);
801 
802   gconf_client_notify_add(client, RUBRICA_GCONF_FONT,
803 			  rubrica_preferences_font_changed, app, NULL, NULL);
804 
805   /* compression rate*/
806   rate = gconf_client_get_int(client, RUBRICA_GCONF_RATE, NULL);
807   gtk_spin_button_set_value(GTK_SPIN_BUTTON(prefer->compress), rate);
808 
809   /* autosave */
810   bool = gconf_client_get_bool (client, RUBRICA_GCONF_AUTOSAVE, NULL);
811   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(prefer->autosave), bool);
812 
813   /* bakcup */
814   bool = gconf_client_get_bool (client, RUBRICA_GCONF_BACKUP, NULL);
815   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(prefer->backup), bool);
816 
817   /* tooltips
818   bool = gconf_client_get_bool (client, RUBRICA_GCONF_TOOLTIPS, NULL);
819   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(prefer->tooltips), bool);
820   */
821 
822   /* confirm exit */
823   bool = gconf_client_get_bool (client, RUBRICA_GCONF_CONFIRM_EXIT, NULL);
824   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(prefer->exit), bool);
825 
826   /* ekiga */
827   bool = gconf_client_get_bool (client, RUBRICA_GCONF_EKIGA, NULL);
828   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(prefer->ekiga), bool);
829 }
830 
831 
832 
833 
834 
835 
836 /* ************  Public
837  */
838 gint
rubrica_preferences_get_gnome_default(void)839 rubrica_preferences_get_gnome_default(void)
840 {
841   GConfClient* client;
842   const gchar* val = NULL;
843   gint ret = GTK_TOOLBAR_BOTH;
844 
845   client = gconf_client_get_default();
846   val    = gconf_client_get_string(client, RUBRICA_GCONF_GNOME_TOOLBAR, NULL);
847 
848   if (g_ascii_strcasecmp(val, "icons") == 0)
849     ret = GTK_TOOLBAR_ICONS;
850 
851   if (g_ascii_strcasecmp(val, "text") == 0)
852     ret = GTK_TOOLBAR_TEXT;
853 
854   if (g_ascii_strcasecmp(val, "both") == 0)
855     ret = GTK_TOOLBAR_BOTH;
856 
857   if (g_ascii_strcasecmp(val, "both-horiz") == 0)
858     ret = GTK_TOOLBAR_BOTH_HORIZ;
859 
860   return ret;
861 }
862 
863 
864 
865 void
rubrica_preferences_set_search_on(GtkWidget * button,gpointer data)866 rubrica_preferences_set_search_on (GtkWidget* button, gpointer data)
867 {
868   GConfClient* client;
869   const gchar* val;
870   gint column = GPOINTER_TO_INT(data);
871 
872   client = gconf_client_get_default();
873   val    = gconf_enum_to_string (search_pairs, column);
874 
875   gconf_client_set_string(client, RUBRICA_GCONF_SEARCH_ON, val, NULL);
876 
877   g_object_unref(client);
878 }
879 
880 
881 void
on_preferences_search_notify(GConfClient * client,guint cnxn_id,GConfEntry * entry,gpointer data)882 on_preferences_search_notify (GConfClient *client, guint cnxn_id,
883 			      GConfEntry *entry, gpointer data)
884 {
885   gint column;
886   const gchar* value;
887   GtkTreeView* view = (GtkTreeView*) data;
888   GtkTreeViewColumn* col;
889 
890   value  = gconf_value_get_string (entry->value);
891   gconf_string_to_enum (search_pairs, value, &column);
892 
893   gtk_tree_view_set_search_column (view, column);
894   col = gtk_tree_view_get_column(view, column);
895 
896   gtk_tree_view_scroll_to_cell(view, NULL, col, TRUE, .5, .5);
897 }
898 
899 
900 void
rubrica_preferences_setup_search_on(GtkTreeView * view)901 rubrica_preferences_setup_search_on(GtkTreeView* view)
902 {
903   GConfClient* client;
904   const gchar* val = NULL;
905   gint column;
906 
907   client = gconf_client_get_default();
908   val    = gconf_client_get_string(client, RUBRICA_GCONF_SEARCH_ON, NULL);
909   if (!val)
910     {
911       val = gconf_enum_to_string (search_pairs, CARD_COLUMN);
912       gconf_client_set_string(client, RUBRICA_GCONF_SEARCH_ON, val, NULL);
913       gtk_tree_view_set_search_column (view, CARD_COLUMN);
914     }
915 
916   gconf_string_to_enum (search_pairs, val, &column);
917   gtk_tree_view_set_search_column (view, column);
918 
919   gconf_client_notify_add(client, RUBRICA_GCONF_SEARCH_ON,
920 			  on_preferences_search_notify,
921 			  view, NULL, NULL);
922 
923   g_object_unref(client);
924 }
925 
926 
927 void
rubrica_preferences_setup_radio_group(GSList * group)928 rubrica_preferences_setup_radio_group (GSList* group)
929 {
930   GConfClient* client;
931   GtkWidget* radio;
932   gchar* value;
933 
934   client = gconf_client_get_default();
935   value  = gconf_client_get_string(client, RUBRICA_GCONF_SEARCH_ON, NULL);
936 
937   for (; group; group = g_slist_next(group))
938     {
939       gchar* name;
940 
941       radio = (GtkWidget*) group->data;
942       name = g_object_get_data(G_OBJECT(radio), "name");
943 
944       if (g_ascii_strcasecmp(name, value) == 0)
945 	{
946 	  gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(radio), TRUE);
947 	  break;
948 	}
949     }
950 
951   g_object_unref(client);
952 }
953 
954 
955 
956 void
rubrica_preferences_setup_colum(GtkTreeViewColumn * column,gchar * key)957 rubrica_preferences_setup_colum (GtkTreeViewColumn* column, gchar* key)
958 {
959   GConfClient* client;
960   gboolean bool;
961 
962   client = gconf_client_get_default();
963 
964   bool = gconf_client_get_bool(client, key, NULL);
965   gtk_tree_view_column_set_visible(column, bool);
966 
967   gconf_client_notify_add(client, key, rubrica_preferences_show_column,
968 			  column, NULL, NULL);
969 
970   g_object_unref(client);
971 }
972 
973 
974 
975 void
rubrica_preferences_setup_menu_check(GtkWidget * item,gchar * key)976 rubrica_preferences_setup_menu_check(GtkWidget* item, gchar* key)
977 {
978   GConfClient* client;
979   gboolean bool;
980 
981   client = gconf_client_get_default();
982 
983   bool = gconf_client_get_bool(client, key, NULL);
984   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM(item), bool);
985 
986   g_object_unref(client);
987 }
988 
989 gint
rubrica_preferences_get_toolbar_style()990 rubrica_preferences_get_toolbar_style()
991 {
992   gchar* str;
993   gint style;
994   GConfClient* client;
995 
996   client = gconf_client_get_default();
997   str    = gconf_client_get_string(client, RUBRICA_GCONF_TOOLBAR, NULL);
998 
999   gconf_string_to_enum(toolbar_pairs, str, &style);
1000 
1001   return style;
1002 }
1003 
1004 
1005 void
rubrica_preferences_run_gui(GtkWidget * button,gpointer data)1006 rubrica_preferences_run_gui(GtkWidget* button, gpointer data)
1007 {
1008   RubricaApp* app = (RubricaApp*) data;
1009   GladeXML* gui;
1010   GConfClient* client;
1011   RubricaPrefer* prefer;
1012   GtkWidget* chooser;
1013   gchar* folder = NULL;
1014 
1015   gui = glade_xml_new (RUBRICA_GUI_DIR"/Preferences.glade", NULL, NULL);
1016   if (!gui)
1017     g_error("\nCan't load %s gui", RUBRICA_GUI_DIR"/Preferences.glade");
1018 
1019   prefer = g_malloc0(sizeof(RubricaPrefer));
1020 
1021   prefer->dialog = glade_xml_get_widget(gui, "preferences");
1022 
1023   prefer->folder_chooser = glade_xml_get_widget(gui, "folder_chooser");
1024   prefer->file_chooser   = glade_xml_get_widget(gui, "file_chooser");
1025   prefer->load_check     = glade_xml_get_widget(gui, "load_check");
1026   prefer->load_vbox      = glade_xml_get_widget(gui, "load_vbox");
1027   prefer->load_view      = glade_xml_get_widget(gui, "load_view");
1028   prefer->add            = glade_xml_get_widget(gui, "add");
1029   prefer->del            = glade_xml_get_widget(gui, "del");
1030 
1031   prefer->compress       = glade_xml_get_widget(gui, "compress");
1032   prefer->autosave       = glade_xml_get_widget(gui, "autosave");
1033   prefer->backup         = glade_xml_get_widget(gui, "backup");
1034 
1035   prefer->toolbar_combo  = glade_xml_get_widget(gui, "toolbar_combo");
1036   prefer->font_button    = glade_xml_get_widget(gui, "fontbutton");
1037   prefer->exit           = glade_xml_get_widget(gui, "exit");
1038 
1039   prefer->web_combo      = glade_xml_get_widget(gui, "web_combo");
1040   prefer->email_combo    = glade_xml_get_widget(gui, "email_combo");
1041   prefer->irc_combo      = glade_xml_get_widget(gui, "irc_combo");
1042   prefer->ekiga          = glade_xml_get_widget(gui, "ekiga");
1043 
1044   prefer->web_box        = glade_xml_get_widget(gui, "web_box");
1045   prefer->email_box      = glade_xml_get_widget(gui, "email_box");
1046   prefer->irc_box        = glade_xml_get_widget(gui, "irc_box");
1047   prefer->web_entry      = glade_xml_get_widget(gui, "web_entry");
1048   prefer->email_entry    = glade_xml_get_widget(gui, "email_entry");
1049   prefer->irc_entry      = glade_xml_get_widget(gui, "irc_entry");
1050 
1051   g_object_unref(gui);
1052 
1053   g_signal_connect(G_OBJECT (prefer->load_check) , "toggled",
1054 		   G_CALLBACK(on_load_check_cb), prefer);
1055 
1056   g_signal_connect(G_OBJECT (prefer->add), "clicked",
1057 		   G_CALLBACK(on_add_cb), prefer);
1058   g_signal_connect(G_OBJECT (prefer->del), "clicked",
1059 		   G_CALLBACK(on_del_cb), prefer);
1060 
1061   g_signal_connect(G_OBJECT (prefer->compress), "value-changed",
1062 		   G_CALLBACK(on_compress_cb), prefer);
1063   g_signal_connect(G_OBJECT (prefer->autosave), "toggled",
1064 		   G_CALLBACK(on_autosave_cb), prefer);
1065   g_signal_connect(G_OBJECT (prefer->backup), "toggled",
1066 		   G_CALLBACK(on_backup_cb), prefer);
1067 
1068   g_signal_connect(G_OBJECT (prefer->toolbar_combo), "changed",
1069 		   G_CALLBACK(on_toolbar_style_cb), prefer);
1070   g_signal_connect(G_OBJECT (prefer->font_button), "font-set",
1071 		   G_CALLBACK(on_font_set_cb), prefer);
1072 
1073   g_signal_connect(G_OBJECT (prefer->web_combo), "changed",
1074 		   G_CALLBACK(on_browser_changed_cb), prefer);
1075   g_signal_connect(G_OBJECT (prefer->email_combo), "changed",
1076 		   G_CALLBACK(on_emailer_changed_cb), prefer);
1077   g_signal_connect(G_OBJECT (prefer->irc_combo), "changed",
1078 		   G_CALLBACK(on_irc_changed_cb), prefer);
1079 
1080   g_signal_connect(G_OBJECT (prefer->web_entry), "changed",
1081 		   G_CALLBACK(on_web_entry_activate_cb), prefer);
1082   g_signal_connect(G_OBJECT (prefer->email_entry), "changed",
1083 		   G_CALLBACK(on_email_entry_activate_cb), prefer);
1084   g_signal_connect(G_OBJECT (prefer->irc_entry), "changed",
1085 		   G_CALLBACK(on_irc_entry_activate_cb), prefer);
1086 
1087   g_signal_connect(G_OBJECT (prefer->exit), "toggled",
1088 		   G_CALLBACK(on_exit_cb), prefer);
1089 
1090   g_signal_connect(G_OBJECT (prefer->ekiga), "toggled",
1091 		   G_CALLBACK(on_ekiga_cb), prefer);
1092 
1093   g_signal_connect(G_OBJECT (prefer->load_view), "button_press_event",
1094 		   G_CALLBACK(on_load_view_event), prefer);
1095   /*
1096   chooser = gtk_file_chooser_dialog_new("Open",
1097 					GTK_WINDOW(app->window),
1098 					GTK_FILE_CHOOSER_ACTION_OPEN,
1099 					GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
1100 					GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
1101 					NULL);
1102   */
1103   rubrica_preferences_gui_setup(prefer, app);
1104 
1105   gtk_dialog_run(GTK_DIALOG(prefer->dialog));
1106 
1107   client  = gconf_client_get_default();
1108   chooser = prefer->folder_chooser;
1109   folder  = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER(chooser));
1110 
1111   if (folder)
1112     gconf_client_set_string(client, RUBRICA_GCONF_FOLDER, folder, NULL);
1113 
1114   g_object_unref(client);
1115 
1116   gtk_widget_destroy(prefer->dialog);
1117 }
1118 
1119 
1120 
1121 
1122 
1123 
1124 
1125 
1126 
1127 
1128 
1129 
1130 
1131 
1132 
1133 
1134 
1135 
1136 
1137 
1138 
1139 
1140 
1141 
1142 
1143 
1144 
1145