fix bug 4239, 'Preferences: Text Options Header Display modal is not modal' (sic)
[claws.git] / src / uri_opener.c
index d117672aac7df8a748578208db1d3b1d1d9f24a6..4b2506fff8e96a5074f60ddc0a9ff575a67dffa7 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Claws Mail -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2007 Colin Leroy <colin@colino.net> and 
+ * Copyright (C) 1999-2012 Colin Leroy <colin@colino.net> and 
  * the Claws Mail team
  *
  * This program is free software; you can redistribute it and/or modify
@@ -19,6 +19,7 @@
  */
 #ifdef HAVE_CONFIG_H
 #  include "config.h"
+#include "claws-features.h"
 #endif
 
 #include <gtk/gtk.h>
@@ -34,7 +35,7 @@
 #include "gtkutils.h"
 #include "alertpanel.h"
 #include "textview.h"
-#include "prefs_common.h"
+#include "mimeview.h"
 #include "prefs_common.h"
 
 enum {
@@ -47,6 +48,7 @@ enum {
 static struct URIOpener
 {
        GtkWidget *window;
+       GtkWidget *hbox_scroll;
        GtkWidget *hbox1;
        GtkWidget *vbox1;
        GtkWidget *label;
@@ -71,12 +73,10 @@ static void uri_opener_double_clicked(GtkTreeView           *list_view,
 static void uri_opener_create(void);
 void uri_opener_open(MessageView *msgview, GSList *uris)
 {
-       GtkAdjustment *hadj, *vadj;
-       
-       g_return_if_fail(msgview);
-       g_return_if_fail(msgview->mimeview);
-       g_return_if_fail(msgview->mimeview->textview);
-       g_return_if_fail(msgview);
+       cm_return_if_fail(msgview);
+       cm_return_if_fail(msgview->mimeview);
+       cm_return_if_fail(msgview->mimeview->textview);
+       cm_return_if_fail(msgview);
        if (!opener.window)
                uri_opener_create();
 
@@ -95,14 +95,6 @@ void uri_opener_open(MessageView *msgview, GSList *uris)
        gtk_widget_show(opener.window);
        gtk_widget_grab_focus(opener.urilist);
        gtk_window_set_modal(GTK_WINDOW(opener.window), TRUE);
-       
-       vadj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(
-                                                  opener.scrolledwin));
-       gtk_adjustment_set_value(vadj, 0);
-       hadj = gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(
-                                                  opener.scrolledwin));
-       gtk_adjustment_set_value(hadj, 0);
-
 }
 
 static GtkListStore* uri_opener_create_data_store(void)
@@ -122,7 +114,7 @@ static void uri_opener_create_list_view_columns(GtkWidget *list_view)
        column = gtk_tree_view_column_new_with_attributes
                (_("Available URLs:"),
                 renderer,
-                "text", URI_OPENER_URL,
+                "markup", URI_OPENER_URL,
                 NULL);
        gtk_tree_view_append_column(GTK_TREE_VIEW(list_view), column);          
 }
@@ -153,9 +145,34 @@ static GtkWidget *uri_opener_list_view_create      (void)
 
 }
 
+static GtkWidget *uri_opener_scrolled_win_create(void)
+{
+       GtkWidget *scrolledwin;
+
+       scrolledwin = gtk_scrolled_window_new(NULL, NULL);
+       gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwin),
+                                           GTK_SHADOW_ETCHED_IN);
+       gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwin),
+                                      GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+                                      
+       gtk_widget_set_size_request(scrolledwin, 200, 250);
+       gtk_widget_show(scrolledwin);
+       
+       return scrolledwin;
+}
+
+static void uri_opener_size_allocate_cb(GtkWidget *widget, GtkAllocation *allocation)
+{
+       cm_return_if_fail(allocation != NULL);
+
+       prefs_common.uriopenerwin_width = allocation->width;
+       prefs_common.uriopenerwin_height = allocation->height;
+}
+
 static void uri_opener_create(void) 
 {
        GtkWidget *window;
+       GtkWidget *hbox_scroll;
        GtkWidget *hbox;
        GtkWidget *hbox1;
        GtkWidget *vbox1;
@@ -165,16 +182,20 @@ static void uri_opener_create(void)
        GtkWidget *open_btn;
        GtkWidget *close_btn;
        GtkWidget *scrolledwin;
+       static GdkGeometry geometry;
 
        window = gtkut_window_new(GTK_WINDOW_TOPLEVEL, "uri_opener");
        gtk_window_set_title (GTK_WINDOW(window),
-                             Q_("Dialog title|Open URLs"));
+                             C_("Dialog title", "Open URLs"));
 
        gtk_container_set_border_width (GTK_CONTAINER (window), 8);
        gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_CENTER);
        gtk_window_set_resizable(GTK_WINDOW (window), TRUE);
+       gtk_window_set_type_hint(GTK_WINDOW(window), GDK_WINDOW_TYPE_HINT_DIALOG);
        g_signal_connect(G_OBJECT(window), "delete_event",
                         G_CALLBACK(uri_opener_close_cb), NULL);
+       g_signal_connect (G_OBJECT(window), "size_allocate",
+                        G_CALLBACK (uri_opener_size_allocate_cb), NULL);
        g_signal_connect(G_OBJECT(window), "key_press_event",
                         G_CALLBACK(key_pressed), NULL);
        MANAGE_WINDOW_SIGNALS_CONNECT (window);
@@ -197,14 +218,10 @@ static void uri_opener_create(void)
        gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
        gtk_box_pack_start(GTK_BOX(vbox1), label, FALSE, TRUE, 0);
        
-       scrolledwin = gtk_scrolled_window_new(NULL, NULL);
-       gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwin),
-                                           GTK_SHADOW_ETCHED_IN);
-       gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwin),
-                                      GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
-                                      
-       gtk_widget_set_size_request(scrolledwin, 500, 250);
-
+       scrolledwin = uri_opener_scrolled_win_create();
+       hbox_scroll = gtk_hbox_new(FALSE, 0);
+       gtk_box_pack_start(GTK_BOX(hbox_scroll), scrolledwin, TRUE, TRUE, 0);
+       
        select_all_btn = gtk_button_new_with_label(_("Select All"));
        g_signal_connect(G_OBJECT(select_all_btn), "clicked",
                         G_CALLBACK(uri_opener_select_all_cb), NULL);   
@@ -214,14 +231,25 @@ static void uri_opener_create(void)
        gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new(""), TRUE, TRUE, 0);
        
        gtk_container_add(GTK_CONTAINER(scrolledwin), urilist);
-       gtk_box_pack_start(GTK_BOX(vbox1), scrolledwin, TRUE, TRUE, 0);
+       gtk_box_pack_start(GTK_BOX(vbox1), hbox_scroll, TRUE, TRUE, 0);
        gtk_box_pack_start(GTK_BOX(vbox1), hbox, FALSE, FALSE, 0);
        gtk_box_pack_start(GTK_BOX(vbox1), hbox1, FALSE, FALSE, 0);
        
        gtk_widget_show_all(vbox1);
        gtk_container_add(GTK_CONTAINER (window), vbox1);
 
+       if (!geometry.min_height) {
+               geometry.min_width = 450;
+               geometry.min_height = 300;
+       }
+
+       gtk_window_set_geometry_hints(GTK_WINDOW(window), NULL, &geometry,
+                                     GDK_HINT_MIN_SIZE);
+       gtk_widget_set_size_request(window, prefs_common.uriopenerwin_width,
+                                   prefs_common.uriopenerwin_height);
+
        opener.window = window;
+       opener.hbox_scroll = hbox_scroll;
        opener.hbox1 = hbox1;
        opener.vbox1 = vbox1;
        opener.label = label;
@@ -241,20 +269,28 @@ static void uri_opener_list_view_insert_uri(GtkWidget *list_view,
                                        (GTK_TREE_VIEW(list_view)));
        gchar *visible = textview_get_visible_uri(opener.msgview->mimeview->textview, uri);
        
+       gchar *label = NULL;
+       
+       if (visible && strcmp(visible, uri->uri))
+               label = g_markup_printf_escaped("<b>%s</b>\n%s", visible, uri->uri);
+       else
+               label = g_markup_printf_escaped("\n%s", uri->uri);
+
        if (row_iter == NULL) {
                /* append new */
                gtk_list_store_append(list_store, &iter);
                gtk_list_store_set(list_store, &iter,
-                                  URI_OPENER_URL, visible?visible:uri->uri,
+                                  URI_OPENER_URL, label,
                                   URI_OPENER_DATA, uri,
                                   -1);
        } else {
                gtk_list_store_set(list_store, row_iter,
-                                  URI_OPENER_URL, visible?visible:uri->uri,
+                                  URI_OPENER_URL, label,
                                   URI_OPENER_DATA, uri,
                                   -1);
        }
        g_free(visible);
+       g_free(label);
 }
 
 static void uri_opener_list_view_clear_uris(GtkWidget *list_view)
@@ -277,8 +313,19 @@ static void uri_opener_load_uris (void)
                uri_opener_list_view_insert_uri(opener.urilist, NULL, uri);
        }
        
+       g_object_ref(opener.urilist);
+       gtk_container_remove(GTK_CONTAINER(opener.scrolledwin), opener.urilist);
+       gtk_widget_destroy(opener.scrolledwin);
+       
+       opener.scrolledwin = uri_opener_scrolled_win_create();
+       gtk_container_add(GTK_CONTAINER(opener.scrolledwin), opener.urilist);
+       gtk_box_pack_start(GTK_BOX(opener.hbox_scroll),
+                          opener.scrolledwin, TRUE, TRUE, 0);
+       g_object_unref(opener.urilist);
+       
        model = gtk_tree_view_get_model(GTK_TREE_VIEW(opener.urilist));
-       gtk_tree_model_get_iter_first(model, &iter);
+       if (!gtk_tree_model_get_iter_first(model, &iter))
+               return;
        selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(opener.urilist));
        gtk_tree_selection_select_iter(selection, &iter);
 }
@@ -287,6 +334,7 @@ static void uri_opener_close(void)
 {
        g_slist_free(opener.uris);
        opener.uris = NULL;
+       gtk_window_set_modal(GTK_WINDOW(opener.window), FALSE);
        gtk_widget_hide(opener.window);
 }
 
@@ -298,7 +346,7 @@ static void uri_opener_close_cb(GtkWidget *widget,
 
 static gboolean key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data)
 {
-       if (event && event->keyval == GDK_Escape)
+       if (event && event->keyval == GDK_KEY_Escape)
                uri_opener_close();
        return FALSE;
 }
@@ -338,8 +386,7 @@ static void uri_opener_open_cb(GtkWidget *widget,
 
        selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(opener.urilist));
        selected  = gtk_tree_selection_get_selected_rows(selection, &model);
-       if(!selected)
-               return;
+       cm_return_if_fail(selected);
                
        for(cur = selected; cur != NULL; cur = g_list_next(cur))
        {