2007-10-07 [colin] 3.0.2cvs26
[claws.git] / src / prefs_toolbar.c
index b1dc6cacc297fa9c366a8792678019876d1ee3df..409f05c6ef8408c3b519131f7fecfcc531c16c32 100644 (file)
@@ -116,6 +116,12 @@ static void prefs_toolbar_up                     (GtkButton        *button,
 static void prefs_toolbar_down                   (GtkButton        *button,
                                                  ToolbarPage *prefs_toolbar);
 
+static void action_selection_changed            (GtkComboBox *action_combo,
+                                                 ToolbarPage *prefs_toolbar);
+
+static void func_selection_changed              (GtkComboBox *action_combo,
+                                                 ToolbarPage *prefs_toolbar);
+
 static void prefs_toolbar_create                 (ToolbarPage *prefs_toolbar);
 
 static GtkWidget *create_set_list_view          (ToolbarPage *prefs_toolbar);
@@ -379,6 +385,10 @@ static void prefs_toolbar_register(GtkButton *button, ToolbarPage *prefs_toolbar
                GdkPixbuf *pixbuf;
                gchar *event, *text;
 
+               if (prefs_toolbar->item_icon_file == NULL) {
+                       alertpanel_error(ERROR_MSG_NO_ICON);
+                       return;
+               }
                stock_pixbuf_gdk(prefs_toolbar->window, 
                                 stock_pixmap_get_icon(prefs_toolbar->item_icon_file),
                                 &pixbuf);
@@ -455,6 +465,10 @@ static void prefs_toolbar_substitute(GtkButton *button, ToolbarPage *prefs_toolb
                GdkPixbuf *pixbuf;
                gchar *icon_event, *set_event, *text;
 
+               if (prefs_toolbar->item_icon_file == NULL) {
+                       alertpanel_error(ERROR_MSG_NO_ICON);
+                       return;
+               }
                stock_pixbuf_gdk(prefs_toolbar->window, 
                                 stock_pixmap_get_icon(prefs_toolbar->item_icon_file),
                                 &pixbuf);
@@ -602,10 +616,12 @@ static void item_type_changed(GtkComboBox *item_type_combo,
                gtk_combo_box_set_active(
                        GTK_COMBO_BOX(prefs_toolbar->item_func_combo), 0);
                gtk_button_set_label(GTK_BUTTON(prefs_toolbar->icon_button), "");
-               gtk_entry_set_text(GTK_ENTRY(prefs_toolbar->item_text_entry), "");
                gtk_widget_set_sensitive(prefs_toolbar->item_text_entry, TRUE);
                gtk_widget_set_sensitive(prefs_toolbar->item_func_combo, TRUE);
                gtk_widget_set_sensitive(prefs_toolbar->icon_button, TRUE);
+
+               func_selection_changed(GTK_COMBO_BOX(prefs_toolbar->item_func_combo),
+                                       prefs_toolbar);
                break;
        case ITEM_USER_ACTION:
                gtk_widget_show(prefs_toolbar->item_action_combo);
@@ -617,15 +633,14 @@ static void item_type_changed(GtkComboBox *item_type_combo,
                gtk_widget_set_sensitive(prefs_toolbar->item_action_combo, TRUE);
                gtk_widget_set_sensitive(prefs_toolbar->icon_button, TRUE);
                
-               gchar *text = gtk_combo_box_get_active_text(GTK_COMBO_BOX(
-                                  prefs_toolbar->item_action_combo));
-               gtk_entry_set_text(GTK_ENTRY(prefs_toolbar->item_text_entry), text);
-               g_free(text);
-               
+               action_selection_changed(GTK_COMBO_BOX(prefs_toolbar->item_action_combo),
+                                       prefs_toolbar);         
                break;
        case ITEM_SEPARATOR:
                gtk_button_set_label(GTK_BUTTON(prefs_toolbar->icon_button), _("None"));
                gtk_button_set_image(GTK_BUTTON(prefs_toolbar->icon_button), NULL);
+               g_free(prefs_toolbar->item_icon_file);
+               prefs_toolbar->item_icon_file = NULL;
                gtk_combo_box_set_active(
                        GTK_COMBO_BOX(prefs_toolbar->item_func_combo), -1);
                gtk_combo_box_set_active(
@@ -645,11 +660,37 @@ static void action_selection_changed(GtkComboBox *action_combo,
 {
        gchar *text = gtk_combo_box_get_active_text(GTK_COMBO_BOX(
                           prefs_toolbar->item_action_combo));
-       
-       if(text != NULL)
+
+       if(text != NULL) { /* action */
                gtk_entry_set_text(GTK_ENTRY(prefs_toolbar->item_text_entry), text);
-       
-       g_free(text);
+               g_free(text);
+       } 
+}
+
+static void func_selection_changed(GtkComboBox *action_combo,
+                               ToolbarPage *prefs_toolbar)
+{
+       gchar *text = gtk_combo_box_get_active_text(GTK_COMBO_BOX(
+                          prefs_toolbar->item_func_combo));
+
+       if(text != NULL) { /* action */
+               int action = -1;
+               action = toolbar_ret_val_from_descr(text);
+               if (action >= 0)
+                       gtk_entry_set_text(GTK_ENTRY(prefs_toolbar->item_text_entry), 
+                                       toolbar_get_short_text(action));
+               g_free(text);
+               if (action >= 0) {
+                       StockPixmap stockp = toolbar_get_icon(action);
+                       if (stockp >= 0)  {
+                               g_free(prefs_toolbar->item_icon_file);
+                               prefs_toolbar->item_icon_file = g_strdup(stock_pixmap_get_name(stockp));
+
+                               gtk_button_set_image(GTK_BUTTON(prefs_toolbar->icon_button),
+                                    stock_pixmap_widget(prefs_toolbar->window, stockp));
+                       }
+               }
+       } 
 }
 
 static void prefs_toolbar_create(ToolbarPage *prefs_toolbar)
@@ -859,6 +900,8 @@ static void prefs_toolbar_create(ToolbarPage *prefs_toolbar)
                         G_CALLBACK(item_type_changed), prefs_toolbar);
        g_signal_connect(G_OBJECT(item_action_combo), "changed",
                         G_CALLBACK(action_selection_changed), prefs_toolbar);
+       g_signal_connect(G_OBJECT(item_func_combo), "changed",
+                        G_CALLBACK(func_selection_changed), prefs_toolbar);
        g_signal_connect(G_OBJECT(up_btn), "clicked",
                         G_CALLBACK(prefs_toolbar_up), prefs_toolbar);
        g_signal_connect(G_OBJECT(down_btn), "clicked",
@@ -1073,6 +1116,8 @@ static gboolean set_list_selected(GtkTreeSelection *selector,
        if (g_utf8_collate(toolbar_ret_descr_from_val(A_SEPARATOR), descr) == 0) {
                gtk_button_set_label(GTK_BUTTON(prefs_toolbar->icon_button),
                                    _("None"));
+               g_free(prefs_toolbar->item_icon_file);
+               prefs_toolbar->item_icon_file = NULL;
                gtk_combo_box_set_active(GTK_COMBO_BOX(prefs_toolbar->item_type_combo),
                                        ITEM_SEPARATOR);
                g_free(icon_text);
@@ -1178,6 +1223,23 @@ static void icon_chooser_cancel_clicked(GtkButton *button,
        prefs_toolbar->icon_chooser_list = NULL;
 }
 
+static gboolean icon_chooser_key_pressed(GtkWidget *widget, GdkEventKey *event,
+                       ToolbarPage *prefs_toolbar)
+{
+       if (event && event->keyval == GDK_Escape) {
+               icon_chooser_cancel_clicked(NULL, prefs_toolbar);
+               return TRUE;
+       }
+
+       return FALSE;
+}
+
+static void icon_chooser_tree_activated(GtkTreeView *treeview, GtkTreePath *path,
+                                    GtkTreeViewColumn *column, ToolbarPage *prefs_toolbar)
+{
+       icon_chooser_ok_clicked(NULL, prefs_toolbar);
+}
+
 static void icon_chooser_create(GtkButton *button, ToolbarPage *prefs_toolbar)
 {
        static GtkWidget *icon_chooser_win;
@@ -1282,7 +1344,11 @@ static void icon_chooser_create(GtkButton *button, ToolbarPage *prefs_toolbar)
                         G_CALLBACK(icon_chooser_ok_clicked), prefs_toolbar);
        g_signal_connect(G_OBJECT(cancel_btn), "clicked",
                         G_CALLBACK(icon_chooser_cancel_clicked), prefs_toolbar);
-       
+       g_signal_connect(G_OBJECT(icon_chooser_win), "key_press_event",
+                        G_CALLBACK(icon_chooser_key_pressed), prefs_toolbar);
+       g_signal_connect(G_OBJECT(list_view), "row-activated",
+                        G_CALLBACK(icon_chooser_tree_activated), prefs_toolbar);
+
        gtk_widget_show_all(icon_chooser_win);
        gtk_window_set_modal(GTK_WINDOW(icon_chooser_win), TRUE);