2006-06-28 [paul] 2.3.1cvs30
[claws.git] / src / gtk / gtkutils.c
index b2f8b1c75dbadf31e48be60bc724ff9abba79c85..1806d3061df963b9eacbeb141a1712f7fcb5327f 100644 (file)
@@ -387,6 +387,8 @@ gboolean gtkut_ctree_node_is_parent(GtkCTreeNode *parent, GtkCTreeNode *node)
 
 void gtkut_ctree_set_focus_row(GtkCTree *ctree, GtkCTreeNode *node)
 {
+       if (node == NULL)
+               return;
        gtkut_clist_set_focus_row(GTK_CLIST(ctree),
                                  gtkut_ctree_get_nth_from_node(ctree, node));
 }
@@ -596,7 +598,7 @@ void gtkut_text_view_set_position(GtkTextView *text, gint pos)
        GtkTextBuffer *buffer;
        GtkTextIter iter;
 
-       g_return_val_if_fail(text != NULL, FALSE);
+       g_return_if_fail(text != NULL);
 
        buffer = gtk_text_view_get_buffer(text);
 
@@ -929,7 +931,7 @@ GtkWidget *gtkut_get_browse_file_btn(const gchar *button_label)
        gtk_label_set_mnemonic_widget(GTK_LABEL(label), button);
 
        gtk_box_pack_start(GTK_BOX(box), image, FALSE, FALSE, 1);
-       gtk_box_pack_end((GTK_BOX(box), label, FALSE, FALSE, 1);
+       gtk_box_pack_end(GTK_BOX(box), label, FALSE, FALSE, 1);
        gtk_widget_show(label);
        gtk_widget_show(image);
        gtk_widget_show(box);
@@ -972,6 +974,37 @@ GtkWidget *gtkut_get_browse_directory_btn(const gchar *button_label)
        return button;
 }
 
+GtkWidget *gtkut_get_replace_btn(const gchar *button_label)
+{
+       GtkWidget *button;
+
+#if GTK_CHECK_VERSION(2, 6, 0)
+       button = gtk_button_new_with_mnemonic(button_label);
+       gtk_button_set_image(GTK_BUTTON(button),
+               gtk_image_new_from_stock(GTK_STOCK_REFRESH, GTK_ICON_SIZE_BUTTON));
+#else
+       GtkWidget* image;
+       GtkWidget* box;
+       GtkWidget* label;
+
+       button = gtk_button_new();
+       box = gtk_hbox_new(FALSE, 0);
+
+       image = gtk_image_new_from_stock(GTK_STOCK_REFRESH, GTK_ICON_SIZE_BUTTON);
+       label = gtk_label_new(NULL);
+       gtk_label_set_text_with_mnemonic(GTK_LABEL(label), button_label);
+       gtk_label_set_mnemonic_widget(GTK_LABEL(label), button);
+
+       gtk_box_pack_start(GTK_BOX(box), image, FALSE, FALSE, 1);
+       gtk_box_pack_end(GTK_BOX(box), label, FALSE, FALSE, 1);
+       gtk_widget_show(label);
+       gtk_widget_show(image);
+       gtk_widget_show(box);
+       gtk_container_add(GTK_CONTAINER(button), box);
+#endif
+       return button;
+}
+
 #if HAVE_LIBCOMPFACE
 gint create_xpm_from_xface(gchar *xpm[], const gchar *xface)
 {
@@ -1114,6 +1147,9 @@ GtkWidget *face_get_from_header(const gchar *o_face)
        GdkPixbufLoader *loader = gdk_pixbuf_loader_new ();
        GtkWidget *image;
        
+       if (o_face == NULL || strlen(o_face) == 0)
+               return NULL;
+
        strncpy2(face, o_face, sizeof(face));
 
        unfold_line(face); /* strip all whitespace and linebreaks */
@@ -1142,3 +1178,132 @@ GtkWidget *face_get_from_header(const gchar *o_face)
        g_object_unref(pixbuf);
        return image;
 }
+
+static GdkCursor *hand_cursor = NULL;
+
+static void link_btn_enter(GtkButton *button, gpointer data)
+{
+       GtkWidget *window = (GtkWidget *)data;
+
+       if (!hand_cursor)
+               hand_cursor = gdk_cursor_new(GDK_HAND2);
+       if (window && window->window)
+               gdk_window_set_cursor(window->window, hand_cursor);
+
+       gtk_button_set_relief(button, GTK_RELIEF_NONE);
+       gtk_widget_set_state(GTK_WIDGET(button), GTK_STATE_NORMAL);
+       
+}
+
+static void link_btn_leave(GtkButton *button, gpointer data)
+{
+       GtkWidget *window = (GtkWidget *)data;
+
+       if (window && window->window)
+               gdk_window_set_cursor(window->window, NULL);
+
+       gtk_button_set_relief(button, GTK_RELIEF_NONE);
+       gtk_widget_set_state(GTK_WIDGET(button), GTK_STATE_NORMAL);
+}
+
+static void link_btn_pressed(GtkButton *button, gpointer data)
+{
+       gtk_button_set_relief(button, GTK_RELIEF_NONE);
+       gtk_widget_set_state(GTK_WIDGET(button), GTK_STATE_NORMAL);
+}
+
+static void link_btn_released(GtkButton *button, gpointer data)
+{
+       gtk_button_set_relief(button, GTK_RELIEF_NONE);
+       gtk_widget_set_state(GTK_WIDGET(button), GTK_STATE_NORMAL);
+}
+
+static void link_btn_clicked(GtkButton *button, gpointer data)
+{
+       gchar *url = (gchar *)data;
+       gtk_button_set_relief(button, GTK_RELIEF_NONE);
+       gtk_widget_set_state(GTK_WIDGET(button), GTK_STATE_NORMAL);
+       open_uri(url, prefs_common.uri_cmd);
+}
+
+static void link_btn_unrealize(GtkButton *button, gpointer data)
+{
+       gchar *url = (gchar *)data;
+       g_signal_handlers_disconnect_by_func(G_OBJECT(button), 
+                        G_CALLBACK(link_btn_clicked), url);
+       g_free(url);
+}
+
+GtkWidget *gtkut_get_link_btn(GtkWidget *window, const gchar *url, const gchar *label)
+{
+       GtkWidget *btn;
+       GtkWidget *btn_label;
+       GdkColormap *cmap;
+       GdkColor uri_color[2] = {{0, 0, 0, 0xffff}, {0, 0xffff, 0, 0}};
+       gboolean success[2];
+       gchar *local_url = NULL;
+       if (!url)
+               return NULL;
+
+       gtkut_convert_int_to_gdk_color(prefs_common.uri_col,
+                                              &uri_color[0]);
+       gtkut_convert_int_to_gdk_color(prefs_common.uri_col,
+                                              &uri_color[1]);
+
+       btn = gtk_button_new_with_label(label?label:url);
+       gtk_button_set_relief(GTK_BUTTON(btn), GTK_RELIEF_NONE);
+       btn_label = GTK_BIN(btn)->child;
+       cmap = gdk_drawable_get_colormap(window->window);
+       gdk_colormap_alloc_colors(cmap, uri_color, 2, FALSE, TRUE, success);
+       if (success[0] == TRUE && success[1] == TRUE) {
+               GtkStyle *style;
+               gtk_widget_ensure_style(btn_label);
+               style = gtk_style_copy
+                       (gtk_widget_get_style(btn_label));
+               style->fg[GTK_STATE_NORMAL]   = uri_color[0];
+               style->fg[GTK_STATE_ACTIVE]   = uri_color[1];
+               style->fg[GTK_STATE_PRELIGHT] = uri_color[0];
+               gtk_widget_set_style(btn_label, style);
+       } else
+               g_warning("about_create(): color allocation failed.\n");
+
+       g_signal_connect(G_OBJECT(btn), "enter",
+                        G_CALLBACK(link_btn_enter), window);
+       g_signal_connect(G_OBJECT(btn), "leave",
+                        G_CALLBACK(link_btn_leave), window);
+       g_signal_connect(G_OBJECT(btn), "pressed",
+                        G_CALLBACK(link_btn_pressed), window);
+       g_signal_connect(G_OBJECT(btn), "released",
+                        G_CALLBACK(link_btn_released), window);
+                        
+       local_url = g_strdup(url);
+       g_signal_connect(G_OBJECT(btn), "clicked",
+                        G_CALLBACK(link_btn_clicked), local_url);
+       g_signal_connect(G_OBJECT(btn), "unrealize",
+                        G_CALLBACK(link_btn_unrealize), local_url);
+       return btn;
+}
+
+GtkWidget *gtkut_sc_combobox_create(GtkWidget *eventbox, gboolean focus_on_click)
+{
+       GtkWidget *combobox;
+       GtkListStore *menu;
+       GtkCellRenderer *rend;
+
+       menu = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_INT);
+
+       combobox = gtk_combo_box_new_with_model(GTK_TREE_MODEL(menu));
+
+       rend = gtk_cell_renderer_text_new();
+       gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combobox), rend, TRUE);
+       gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(combobox), rend,
+                       "markup", 0,
+                       NULL);
+
+       if( eventbox != NULL )
+               gtk_container_add(GTK_CONTAINER(eventbox), combobox);
+#if GTK_CHECK_VERSION(2,6,0)
+       gtk_combo_box_set_focus_on_click(GTK_COMBO_BOX(combobox), focus_on_click);
+#endif
+       return combobox;
+}