2007-02-02 [colin] 2.7.2cvs15
authorColin Leroy <colin@colino.net>
Fri, 2 Feb 2007 17:48:17 +0000 (17:48 +0000)
committerColin Leroy <colin@colino.net>
Fri, 2 Feb 2007 17:48:17 +0000 (17:48 +0000)
* src/Makefile.am
* src/mainwindow.c
* src/messageview.c
* src/messageview.h
* src/textview.c
* src/textview.h
* src/uri_opener.c
* src/uri_opener.h
Add Tools/List URIs to allow
opening any URI in the current mail

ChangeLog
PATCHSETS
configure.ac
src/Makefile.am
src/mainwindow.c
src/messageview.c
src/messageview.h
src/textview.c
src/textview.h
src/uri_opener.c [new file with mode: 0644]
src/uri_opener.h [new file with mode: 0644]

index 92fa308..672a9df 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2007-02-02 [colin]     2.7.2cvs15
+
+       * src/Makefile.am
+       * src/mainwindow.c
+       * src/messageview.c
+       * src/messageview.h
+       * src/textview.c
+       * src/textview.h
+       * src/uri_opener.c
+       * src/uri_opener.h
+               Add Tools/List URIs to allow
+               opening any URI in the current mail
+
 2007-02-02 [colin]     2.7.2cvs14
 
        * src/common/valgrind.h ** NEW FILE **
index 94cdf45..beef709 100644 (file)
--- a/PATCHSETS
+++ b/PATCHSETS
 ( cvs diff -u -r 1.1.2.17 -r 1.1.2.18 src/prefs_other.c;  cvs diff -u -r 1.1.2.35 -r 1.1.2.36 src/prefs_summaries.c;  ) > 2.7.2cvs12.patchset
 ( cvs diff -u -r 1.100.2.47 -r 1.100.2.48 AUTHORS;  cvs diff -u -r 1.1.2.32 -r 1.1.2.33 src/gtk/authors.h;  cvs diff -u -r 1.3.2.5 -r 1.3.2.6 tools/freshmeat_search.pl;  cvs diff -u -r 1.3.2.5 -r 1.3.2.6 tools/google_search.pl;  cvs diff -u -r 1.3.2.5 -r 1.3.2.6 tools/multiwebsearch.pl;  ) > 2.7.2cvs13.patchset
 ( cvs diff -u -r 1.24.2.11 -r 1.24.2.12 src/common/Makefile.am;  cvs diff -u -r 1.13.2.25 -r 1.13.2.26 src/common/plugin.c;  diff -u /dev/null src/common/valgrind.h;  ) > 2.7.2cvs14.patchset
+( cvs diff -u -r 1.155.2.50 -r 1.155.2.51 src/Makefile.am;  cvs diff -u -r 1.274.2.169 -r 1.274.2.170 src/mainwindow.c;  cvs diff -u -r 1.94.2.121 -r 1.94.2.122 src/messageview.c;  cvs diff -u -r 1.19.2.14 -r 1.19.2.15 src/messageview.h;  cvs diff -u -r 1.96.2.167 -r 1.96.2.168 src/textview.c;  cvs diff -u -r 1.12.2.17 -r 1.12.2.18 src/textview.h;  diff -u /dev/null src/uri_opener.c;  diff -u /dev/null src/uri_opener.h;  ) > 2.7.2cvs15.patchset
index d83fbfd..472f109 100644 (file)
@@ -11,7 +11,7 @@ MINOR_VERSION=7
 MICRO_VERSION=2
 INTERFACE_AGE=0
 BINARY_AGE=0
-EXTRA_VERSION=14
+EXTRA_VERSION=15
 EXTRA_RELEASE=
 EXTRA_GTK2_VERSION=
 
index 735beaf..8ddb80b 100644 (file)
@@ -146,6 +146,7 @@ claws_mail_SOURCES = \
        toolbar.c \
        undo.c \
        unmime.c \
+       uri_opener.c \
        vcard.c \
        wizard.c
 
@@ -285,6 +286,7 @@ claws_mailinclude_HEADERS = \
        toolbar.h \
        undo.h \
        unmime.h \
+       uri_opener.h \
        vcard.h \
        wizard.h
 
index 734f8ac..fd24636 100644 (file)
@@ -394,6 +394,9 @@ static void create_filter_cb         (MainWindow    *mainwin,
 static void create_processing_cb (MainWindow   *mainwin,
                                  guint          action,
                                  GtkWidget     *widget);
+static void open_urls_cb        (MainWindow    *mainwin,
+                                 guint          action,
+                                 GtkWidget     *widget);
 
 static void prefs_template_open_cb     (MainWindow     *mainwin,
                                         guint           action,
@@ -832,6 +835,8 @@ static GtkItemFactoryEntry mainwin_entries[] =
        {N_("/_Tools/C_reate processing rule/by _Subject"),
                                                NULL, create_processing_cb, FILTER_BY_SUBJECT, NULL},
        {N_("/_Tools/---"),                     NULL, NULL, 0, "<Separator>"},
+       {N_("/_Tools/List _URLs..."),           "<shift><control>U", open_urls_cb, 0, NULL},
+       {N_("/_Tools/---"),                     NULL, NULL, 0, "<Separator>"},
        {N_("/_Tools/Actio_ns"),                NULL, NULL, 0, "<Branch>"},
        {N_("/_Tools/---"),                     NULL, NULL, 0, "<Separator>"},
        {N_("/_Tools/Ch_eck for new messages in all folders"),
@@ -2256,6 +2261,7 @@ void main_window_set_menu_sensitive(MainWindow *mainwin)
                {"/Tools/Filter selected messages"     , M_TARGET_EXIST|M_EXEC},
                {"/Tools/Create filter rule"           , M_SINGLE_TARGET_EXIST|M_UNLOCKED},
                {"/Tools/Create processing rule"       , M_SINGLE_TARGET_EXIST|M_UNLOCKED},
+               {"/Tools/List URLs..."                 , M_TARGET_EXIST},
                {"/Tools/Actions"                      , M_TARGET_EXIST|M_ACTIONS_EXIST},
                {"/Tools/Execute"                      , M_DELAY_EXEC},
                {"/Tools/Delete duplicated messages/In selected folder"   , M_MSG_EXIST|M_ALLOW_DELETE},
@@ -3283,6 +3289,15 @@ static void reedit_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
        summary_reedit(mainwin->summaryview);
 }
 
+static void open_urls_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
+{
+       if (!mainwin->summaryview->displayed && mainwin->summaryview->selected) {
+               summary_display_msg_selected(mainwin->summaryview, 
+                       mainwin->messageview->mimeview->textview->show_all_headers);
+       }
+       messageview_list_urls(mainwin->messageview);
+}
+
 static void add_address_cb(MainWindow *mainwin, guint action,
                           GtkWidget *widget)
 {
index 573c3b6..b564430 100644 (file)
@@ -63,6 +63,7 @@
 #include "filtering.h"
 #include "partial_download.h"
 #include "gedit-print.h"
+#include "uri_opener.h"
 #include "inc.h"
 #include "log.h"
 
@@ -145,6 +146,9 @@ static void create_filter_cb                (gpointer        data,
 static void create_processing_cb       (gpointer        data,
                                         guint           action,
                                         GtkWidget      *widget);
+static void open_urls_cb               (gpointer        data,
+                                        guint           action,
+                                        GtkWidget      *widget);
 
 static void about_cb                   (gpointer        data,
                                         guint           action,
@@ -325,6 +329,8 @@ static GtkItemFactoryEntry msgview_entries[] =
        {N_("/_Tools/Create processing rule/by _Subject"),
                                        NULL, create_processing_cb, FILTER_BY_SUBJECT, NULL},
        {N_("/_Tools/---"),             NULL, NULL, 0, "<Separator>"},
+       {N_("/_Tools/List _URLs..."),   "<shift><control>U", open_urls_cb, 0, NULL},
+       {N_("/_Tools/---"),             NULL, NULL, 0, "<Separator>"},
        {N_("/_Tools/Actio_ns"),        NULL, NULL, 0, "<Branch>"},
 
        {N_("/_Help"),                  NULL, NULL, 0, "<Branch>"},
@@ -1718,6 +1724,12 @@ static void create_processing_cb(gpointer data, guint action,
                                    (PrefsFilterType)action, 1);
 }
 
+static void open_urls_cb(gpointer data, guint action, GtkWidget *widget)
+{
+       MessageView *messageview = (MessageView *)data;
+       messageview_list_urls(messageview);
+}
+
 static void about_cb(gpointer data, guint action, GtkWidget *widget)
 {
        about_show();
@@ -1791,3 +1803,19 @@ void messageview_learn (MessageView *msgview, gboolean is_spam)
                        (msgview->mainwin->toolbar,
                         MSG_IS_SPAM(msgview->msginfo->flags)?LEARN_HAM:LEARN_SPAM);
 }
+
+void messageview_list_urls (MessageView        *msgview)
+{
+       GSList *cur = msgview->mimeview->textview->uri_list;
+       GSList *newlist = NULL;
+       for (; cur; cur = cur->next) {
+               ClickableText *uri = (ClickableText *)cur->data;
+               if (!uri->uri || !g_ascii_strncasecmp(uri->uri, "mailto:", 7) 
+               ||  uri->is_quote)
+                       continue;
+               newlist = g_slist_prepend(newlist, uri);
+       }
+       newlist = g_slist_reverse(newlist);
+       uri_opener_open(msgview, newlist);
+       g_slist_free(newlist);
+}
index 0cd2389..97f4e3f 100644 (file)
@@ -123,4 +123,5 @@ void messageview_print                              (MsgInfo        *msginfo,
                                                 gint            sel_end,
                                                 gint            partnum);
 #endif
+void messageview_list_urls                     (MessageView    *msgview);
 #endif /* __MESSAGEVIEW_H__ */
index 8fe69e1..dcc0c9e 100644 (file)
@@ -180,8 +180,6 @@ static gboolean textview_uri_button_pressed (GtkTextTag     *tag,
                                                 GtkTextIter    *iter,
                                                 TextView       *textview);
 
-static gboolean textview_uri_security_check    (TextView       *textview,
-                                                ClickableText  *uri);
 static void textview_uri_list_remove_all       (GSList         *uri_list);
 
 static void textview_toggle_quote              (TextView       *textview, 
@@ -2446,6 +2444,20 @@ static gboolean textview_uri_button_pressed(GtkTextTag *tag, GObject *obj,
        return FALSE;
 }
 
+gchar *textview_get_visible_uri                (TextView       *textview, 
+                                        ClickableText  *uri)
+{
+       GtkTextBuffer *buffer;
+       GtkTextIter start, end;
+
+       buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview->text));
+
+       gtk_text_buffer_get_iter_at_offset(buffer, &start, uri->start);
+       gtk_text_buffer_get_iter_at_offset(buffer, &end,   uri->end);
+
+       return gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
+}
+
 /*!
  *\brief    Check to see if a web URL has been disguised as a different
  *          URL (possible with HTML email).
@@ -2457,23 +2469,15 @@ static gboolean textview_uri_button_pressed(GtkTextTag *tag, GObject *obj,
  *\return   gboolean TRUE if the URL is ok, or if the user chose to open
  *          it anyway, otherwise FALSE          
  */
-static gboolean textview_uri_security_check(TextView *textview, ClickableText *uri)
+gboolean textview_uri_security_check(TextView *textview, ClickableText *uri)
 {
        gchar *visible_str;
        gboolean retval = TRUE;
-       GtkTextBuffer *buffer;
-       GtkTextIter start, end;
 
        if (is_uri_string(uri->uri) == FALSE)
                return TRUE;
 
-       buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview->text));
-
-       gtk_text_buffer_get_iter_at_offset(buffer, &start, uri->start);
-       gtk_text_buffer_get_iter_at_offset(buffer, &end,   uri->end);
-
-       visible_str = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
-
+       visible_str = textview_get_visible_uri(textview, uri);
        if (visible_str == NULL)
                return TRUE;
 
index c22c0c1..50021e5 100644 (file)
@@ -123,6 +123,10 @@ void textview_show_icon(TextView *textview, const gchar *stock_id);
 void textview_get_selection_offsets    (TextView       *textview, 
                                         gint           *sel_start, 
                                         gint           *sel_end);
+gboolean textview_uri_security_check   (TextView       *textview, 
+                                        ClickableText  *uri);
+gchar *textview_get_visible_uri                (TextView       *textview, 
+                                        ClickableText  *uri);
 
 #define TEXTVIEW_INSERT(str) \
        gtk_text_buffer_insert_with_tags_by_name \
diff --git a/src/uri_opener.c b/src/uri_opener.c
new file mode 100644 (file)
index 0000000..ee733f9
--- /dev/null
@@ -0,0 +1,345 @@
+/*
+ * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
+ * Copyright (C) 1999-2007 Hiroyuki Yamamoto and the Claws Mail team
+ * This file Copyright (C) 2002-2005 Colin Leroy <colin@colino.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include <gtk/gtkwidget.h>
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <gdk/gdkkeysyms.h>
+#include <sys/types.h>
+#include <dirent.h>
+
+#include "manage_window.h"
+#include "utils.h"
+#include "mainwindow.h"
+#include "gtkutils.h"
+#include "alertpanel.h"
+#include "textview.h"
+#include "prefs_common.h"
+#include "prefs_common.h"
+
+enum {
+       URI_OPENER_URL,
+       URI_OPENER_DATA,
+       N_URI_OPENER_COLUMNS
+};
+
+
+static struct URIOpener
+{
+       GtkWidget *window;
+       GtkWidget *hbox1;
+       GtkWidget *vbox1;
+       GtkWidget *label;
+       GtkWidget *urilist;
+       GtkWidget *open_btn;
+       GtkWidget *open_all_btn;
+       GtkWidget *close_btn;
+       MessageView *msgview;
+       GSList    *uris;
+} opener;
+
+static void uri_opener_load_uris (void);
+static void uri_opener_open_cb         (GtkWidget *widget, gpointer data);
+static void uri_opener_close_cb        (GtkWidget *widget, gpointer data);
+static gboolean key_pressed            (GtkWidget *widget, GdkEventKey *event,
+                                        gpointer data);
+static void uri_opener_double_clicked(GtkTreeView              *list_view,
+                                       GtkTreePath             *path,
+                                       GtkTreeViewColumn       *column,
+                                       gpointer                 data);
+static void uri_opener_create(void);
+void uri_opener_open(MessageView *msgview, GSList *uris)
+{
+       g_return_if_fail(msgview);
+       g_return_if_fail(msgview->mimeview);
+       g_return_if_fail(msgview->mimeview->textview);
+       g_return_if_fail(msgview);
+       if (!opener.window)
+               uri_opener_create();
+
+       manage_window_set_transient(GTK_WINDOW(opener.window));
+       gtk_widget_grab_focus(opener.close_btn);
+       
+       if (uris == NULL) {
+               alertpanel_notice(_("There are no URLs in this email."));
+               return;
+       }
+       
+       opener.msgview = msgview;
+       opener.uris = g_slist_copy(uris);
+       uri_opener_load_uris();
+
+       gtk_widget_show(opener.window);
+       gtk_widget_grab_focus(opener.urilist);
+       gtk_window_set_modal(GTK_WINDOW(opener.window), TRUE);
+}
+
+static GtkListStore* uri_opener_create_data_store(void)
+{
+       return gtk_list_store_new(N_URI_OPENER_COLUMNS,
+                                 G_TYPE_STRING,
+                                 G_TYPE_POINTER,
+                                 -1);
+}
+
+static void uri_opener_create_list_view_columns(GtkWidget *list_view)
+{
+       GtkTreeViewColumn *column;
+       GtkCellRenderer *renderer;
+
+       renderer = gtk_cell_renderer_text_new();
+       column = gtk_tree_view_column_new_with_attributes
+               (_("Available URLs:"),
+                renderer,
+                "text", URI_OPENER_URL,
+                NULL);
+       gtk_tree_view_append_column(GTK_TREE_VIEW(list_view), column);          
+}
+
+static GtkWidget *uri_opener_list_view_create  (void)
+{
+       GtkTreeView *list_view;
+       GtkTreeSelection *selector;
+       GtkTreeModel *model;
+
+       model = GTK_TREE_MODEL(uri_opener_create_data_store());
+       list_view = GTK_TREE_VIEW(gtk_tree_view_new_with_model(model));
+       g_object_unref(model);  
+       
+       gtk_tree_view_set_rules_hint(list_view, prefs_common.use_stripes_everywhere);
+       
+       selector = gtk_tree_view_get_selection(list_view);
+       gtk_tree_selection_set_mode(selector, GTK_SELECTION_BROWSE);
+
+       g_signal_connect(G_OBJECT(list_view), "row_activated",
+                        G_CALLBACK(uri_opener_double_clicked),
+                        list_view);
+
+       /* create the columns */
+       uri_opener_create_list_view_columns(GTK_WIDGET(list_view));
+
+       return GTK_WIDGET(list_view);
+
+}
+
+static void uri_opener_create(void) 
+{
+       GtkWidget *window;
+       GtkWidget *hbox1;
+       GtkWidget *vbox1;
+       GtkWidget *label;
+       GtkWidget *urilist;
+       GtkWidget *open_btn;
+       GtkWidget *open_all_btn;
+       GtkWidget *close_btn;
+       GtkWidget *scrolledwin;
+
+       window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+       gtk_window_set_title (GTK_WINDOW(window),
+                             _("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);
+       g_signal_connect(G_OBJECT(window), "delete_event",
+                        G_CALLBACK(uri_opener_close_cb), NULL);
+       g_signal_connect(G_OBJECT(window), "key_press_event",
+                        G_CALLBACK(key_pressed), NULL);
+       MANAGE_WINDOW_SIGNALS_CONNECT (window);
+
+       vbox1 = gtk_vbox_new(FALSE, 6);
+       gtkut_stock_button_set_create(&hbox1, 
+                                     &close_btn, GTK_STOCK_CLOSE,
+                                     &open_all_btn, _("Open _All"),
+                                     &open_btn, GTK_STOCK_OPEN);
+
+       g_signal_connect(G_OBJECT(open_btn), "clicked",
+                        G_CALLBACK(uri_opener_open_cb), GINT_TO_POINTER(FALSE));
+
+       g_signal_connect(G_OBJECT(open_all_btn), "clicked",
+                        G_CALLBACK(uri_opener_open_cb), GINT_TO_POINTER(TRUE));
+
+       g_signal_connect(G_OBJECT(close_btn), "clicked",
+                        G_CALLBACK(uri_opener_close_cb), NULL);
+
+       urilist = uri_opener_list_view_create();
+       
+       label = gtk_label_new(_("Please select the URL to open."));
+       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_policy(GTK_SCROLLED_WINDOW(scrolledwin),
+                                      GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
+                                      
+       gtk_widget_set_size_request(scrolledwin, 500, 250);
+
+       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), hbox1, FALSE, FALSE, 0);
+       
+       gtk_widget_show(label);
+       gtk_widget_show(scrolledwin);
+       gtk_widget_show(urilist);
+       gtk_widget_show(hbox1);
+       gtk_widget_show(vbox1);
+       gtk_widget_show(close_btn);
+       gtk_widget_show(open_btn);
+       gtk_widget_show(open_all_btn);
+       gtk_container_add(GTK_CONTAINER (window), vbox1);
+
+       opener.window = window;
+       opener.hbox1 = hbox1;
+       opener.vbox1 = vbox1;
+       opener.label = label;
+       opener.urilist = urilist;
+       opener.open_btn = open_btn;
+       opener.open_all_btn = open_all_btn;
+       opener.close_btn = close_btn;
+
+}
+
+static void uri_opener_list_view_insert_uri(GtkWidget *list_view,
+                                                 GtkTreeIter *row_iter,
+                                                 ClickableText *uri) 
+{
+       GtkTreeIter iter;
+       GtkListStore *list_store = GTK_LIST_STORE(gtk_tree_view_get_model
+                                       (GTK_TREE_VIEW(list_view)));
+       gchar *visible = textview_get_visible_uri(opener.msgview->mimeview->textview, 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_DATA, uri,
+                                  -1);
+       } else {
+               gtk_list_store_set(list_store, row_iter,
+                                  URI_OPENER_URL, visible?visible:uri->uri,
+                                  URI_OPENER_DATA, uri,
+                                  -1);
+       }
+       g_free(visible);
+}
+
+static void uri_opener_list_view_clear_uris(GtkWidget *list_view)
+{
+       GtkListStore *list_store = GTK_LIST_STORE(gtk_tree_view_get_model
+                                       (GTK_TREE_VIEW(list_view)));
+       gtk_list_store_clear(list_store);
+}
+
+static void uri_opener_load_uris (void) 
+{
+       GSList *cur = opener.uris;
+       
+       uri_opener_list_view_clear_uris(opener.urilist);
+       for (; cur; cur = cur->next) {
+               ClickableText *uri = (ClickableText *)cur->data;
+               uri_opener_list_view_insert_uri(opener.urilist, NULL, uri);
+       }
+}
+
+static void uri_opener_close(void) 
+{
+       g_slist_free(opener.uris);
+       opener.uris = NULL;
+       gtk_widget_hide(opener.window);
+}
+
+static void uri_opener_close_cb(GtkWidget *widget,
+                                gpointer data) 
+{
+       uri_opener_close();
+}
+
+static gboolean key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data)
+{
+       if (event && event->keyval == GDK_Escape)
+               uri_opener_close();
+       return FALSE;
+}
+
+static void uri_opener_double_clicked(GtkTreeView              *list_view,
+                                       GtkTreePath             *path,
+                                       GtkTreeViewColumn       *column,
+                                       gpointer                 data)
+{
+       ClickableText *uri;
+       GtkTreeIter iter;
+       GtkTreeModel *model = gtk_tree_view_get_model(list_view);
+
+       if (!gtk_tree_model_get_iter(model, &iter, path))
+               return;
+
+       gtk_tree_model_get(model, &iter, 
+                          URI_OPENER_DATA, &uri,
+                          -1);
+
+       if (!uri)
+               return;
+
+       if (textview_uri_security_check(opener.msgview->mimeview->textview, uri) == TRUE) 
+               open_uri(uri->uri,
+                        prefs_common.uri_cmd);
+}
+
+
+
+
+static void uri_opener_open_cb(GtkWidget *widget, 
+                               gpointer data) 
+{
+       ClickableText *uri;
+       GtkTreeIter sel;
+       GtkTreeModel *model;
+       gboolean all = GPOINTER_TO_INT(data);
+
+       if (!gtk_tree_selection_get_selected(gtk_tree_view_get_selection
+                               (GTK_TREE_VIEW(opener.urilist)),
+                               &model, &sel))
+               return;
+       
+       if (!all) {
+               gtk_tree_model_get(model, &sel,
+                          URI_OPENER_DATA, &uri,
+                          -1);
+               if (!uri)
+                       return;
+
+               if (textview_uri_security_check(opener.msgview->mimeview->textview, uri) == TRUE) 
+                       open_uri(uri->uri,
+                                prefs_common.uri_cmd);
+       } else {
+               GSList *cur = opener.uris;
+
+               for (; cur; cur = cur->next) {
+                       uri = (ClickableText *)cur->data;
+                       if (textview_uri_security_check(opener.msgview->mimeview->textview, uri) == TRUE) 
+                               open_uri(uri->uri,
+                                        prefs_common.uri_cmd);
+               }
+       }
+}
diff --git a/src/uri_opener.h b/src/uri_opener.h
new file mode 100644 (file)
index 0000000..e21e169
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
+ * Copyright (C) 1999-2007 Hiroyuki Yamamoto and the Claws Mail team
+ * This file Copyright (C) 2007 Colin Leroy <colin@colino.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef URI_OPENER_H
+#define URI_OPENER_H
+#include "mainwindow.h"
+
+void uri_opener_create (void); 
+void uri_opener_open   (MessageView *msgview, GSList *uris); 
+
+#endif