2006-09-07 [paul] 2.4.0cvs159
[claws.git] / src / mimeview.c
index 86717050f4d8aee4fcf4f9b0db997a5e3b18507a..21b8ef376ce42c4dcf80c7d865fa216296a52b0b 100644 (file)
@@ -64,7 +64,7 @@
 #include "stock_pixmap.h"
 #include "gtk/gtkvscrollbutton.h"
 #include "gtk/logwindow.h"
-
+#include "timing.h"
 
 typedef enum
 {
@@ -119,7 +119,8 @@ static gboolean mimeview_scrolled   (GtkWidget      *widget,
 static void mimeview_display_as_text   (MimeView       *mimeview);
 static void mimeview_save_as           (MimeView       *mimeview);
 static void mimeview_save_all          (MimeView       *mimeview);
-static void mimeview_launch            (MimeView       *mimeview);
+static void mimeview_launch            (MimeView       *mimeview,
+                                        MimeInfo       *partinfo);
 static void mimeview_open_with         (MimeView       *mimeview);
 static void mimeview_open_part_with    (MimeView       *mimeview,
                                         MimeInfo       *partinfo,
@@ -156,10 +157,15 @@ static gboolean part_button_pressed       (MimeView       *mimeview,
 static void icon_scroll_size_allocate_cb(GtkWidget     *widget, 
                                         GtkAllocation  *layout_size, 
                                         MimeView       *mimeview);
+static MimeInfo *mimeview_get_part_to_use(MimeView *mimeview);
 
+static void mimeview_launch_cb(MimeView *mimeview)
+{
+       mimeview_launch(mimeview, mimeview_get_part_to_use(mimeview));
+}
 static GtkItemFactoryEntry mimeview_popup_entries[] =
 {
-       {N_("/_Open"),            NULL, mimeview_launch,          0, NULL},
+       {N_("/_Open"),            NULL, mimeview_launch_cb,       0, NULL},
        {N_("/Open _with..."),    NULL, mimeview_open_with,       0, NULL},
        {N_("/_Display as text"), NULL, mimeview_display_as_text, 0, NULL},
        {N_("/_Save as..."),      NULL, mimeview_save_as,         0, NULL},
@@ -505,6 +511,8 @@ static void mimeview_show_message_part(MimeView *mimeview, MimeInfo *partinfo)
        const gchar *fname;
 
        if (!partinfo) return;
+       if (partinfo == mimeview->opened)
+               return;
 
        fname = mimeview->file;
        if (!fname) return;
@@ -630,6 +638,10 @@ gboolean mimeview_show_part(MimeView *mimeview, MimeInfo *partinfo)
 static void mimeview_change_view_type(MimeView *mimeview, MimeViewType type)
 {
        TextView  *textview  = mimeview->textview;
+       GtkWidget *focused = NULL;
+       
+       if (mainwindow_get_mainwindow())
+               focused = gtkut_get_focused_child(mainwindow_get_mainwindow()->window);
 
        if ((mimeview->type != MIMEVIEW_VIEWER) && 
            (mimeview->type == type)) return;
@@ -648,7 +660,8 @@ static void mimeview_change_view_type(MimeView *mimeview, MimeViewType type)
        default:
                return;
        }
-
+       if (focused)
+               gtk_widget_grab_focus(focused);
        mimeview->type = type;
 }
 
@@ -1140,7 +1153,7 @@ static gboolean part_button_pressed(MimeView *mimeview, GdkEventButton *event,
        if (event->button == 2 ||
            (event->button == 1 && (event->time - lasttime) < DOUBLE_CLICK_TIME && lastinfo == partinfo)) {
                /* call external program for image, audio or html */
-               mimeview_launch(mimeview);
+               mimeview_launch(mimeview, partinfo);
                return TRUE;
        } else if (event->button == 3) {
                if (partinfo && (partinfo->type == MIMETYPE_MESSAGE ||
@@ -1204,7 +1217,7 @@ static gint mimeview_key_pressed(GtkWidget *widget, GdkEventKey *event,
                
        switch (event->keyval) {
        case GDK_space:
-               if (textview_scroll_page(mimeview->textview, FALSE))
+               if (mimeview_scroll_page(mimeview, FALSE))
                        return TRUE;
 
                node = GTK_CTREE_NODE_NEXT(mimeview->opened);
@@ -1215,10 +1228,10 @@ static gint mimeview_key_pressed(GtkWidget *widget, GdkEventKey *event,
                }
                break;
        case GDK_BackSpace:
-               textview_scroll_page(mimeview->textview, TRUE);
+               mimeview_scroll_page(mimeview, TRUE);
                return TRUE;
        case GDK_Return:
-               textview_scroll_one_line(mimeview->textview,
+               mimeview_scroll_one_line(mimeview,
                                         (event->state & GDK_MOD1_MASK) != 0);
                return TRUE;
        case GDK_n:
@@ -1250,7 +1263,7 @@ static gint mimeview_key_pressed(GtkWidget *widget, GdkEventKey *event,
        case GDK_l:
                BREAK_ON_MODIFIER_KEY();
                KEY_PRESS_EVENT_STOP();
-               mimeview_launch(mimeview);
+               mimeview_launch(mimeview, NULL);
                return TRUE;
        case GDK_o:
                BREAK_ON_MODIFIER_KEY();
@@ -1493,13 +1506,13 @@ static MimeInfo *mimeview_get_part_to_use(MimeView *mimeview)
                partinfo = mimeview->spec_part;
                mimeview->spec_part = NULL;
        } else {
-               partinfo = mimeview_get_selected_part(mimeview);
+               partinfo = (MimeInfo *) g_object_get_data
+                        (G_OBJECT(mimeview->popupmenu),
+                        "pop_partinfo");
+               g_object_set_data(G_OBJECT(mimeview->popupmenu),
+                                 "pop_partinfo", NULL);
                if (!partinfo) { 
-                       partinfo = (MimeInfo *) g_object_get_data
-                                (G_OBJECT(mimeview->popupmenu),
-                                "pop_partinfo");
-                       g_object_set_data(G_OBJECT(mimeview->popupmenu),
-                                         "pop_partinfo", NULL);
+                       partinfo = mimeview_get_selected_part(mimeview);
                }                        
        }
 
@@ -1570,20 +1583,20 @@ static void mimeview_display_as_text(MimeView *mimeview)
        if (!mimeview->opened) return;
 
        partinfo = mimeview_get_part_to_use(mimeview);
-
+       mimeview_select_mimepart_icon(mimeview, partinfo);
        g_return_if_fail(partinfo != NULL);
        mimeview_show_message_part(mimeview, partinfo);
 }
 
-static void mimeview_launch(MimeView *mimeview)
+static void mimeview_launch(MimeView *mimeview, MimeInfo *partinfo)
 {
-       MimeInfo *partinfo;
        gchar *filename;
 
        if (!mimeview->opened) return;
        if (!mimeview->file) return;
 
-       partinfo = mimeview_get_part_to_use(mimeview);
+       if (!partinfo)
+               partinfo = mimeview_get_part_to_use(mimeview);
 
        g_return_if_fail(partinfo != NULL);
 
@@ -1643,11 +1656,19 @@ static void mimeview_open_part_with(MimeView *mimeview, MimeInfo *partinfo, gboo
                        partinfo->subtype);
        }
        
-       if (partinfo->type != MIMETYPE_TEXT || !prefs_common.ext_editor_cmd
-       ||  !prefs_common.ext_editor_cmd[0])
+       if ((partinfo->type == MIMETYPE_TEXT && !strcmp(partinfo->subtype, "html"))
+       && prefs_common.uri_cmd && prefs_common.uri_cmd[0]) {
+               mime_command = g_strdup(prefs_common.uri_cmd);
+               g_free(content_type);
+               content_type = NULL;
+       } else if (partinfo->type != MIMETYPE_TEXT || !prefs_common.ext_editor_cmd
+       ||  !prefs_common.ext_editor_cmd[0]) {
                mime_command = mailcap_get_command_for_type(content_type, filename);
-       else
+       } else {
                mime_command = g_strdup(prefs_common.ext_editor_cmd);
+               g_free(content_type);
+               content_type = NULL;
+       }
        if (mime_command == NULL) {
                /* try with extension this time */
                g_free(content_type);
@@ -1755,15 +1776,13 @@ static gboolean icon_clicked_cb (GtkWidget *button, GdkEventButton *event, MimeV
        num      = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(button), "icon_number"));
        partinfo = g_object_get_data(G_OBJECT(button), "partinfo");
 
-       icon_selected(mimeview, num, partinfo);
-       gtk_widget_grab_focus(button);
-       if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))) {
-               toggle_icon(GTK_TOGGLE_BUTTON(button), mimeview);
-               if (event->button == 2 || event->button == 3)
-                       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button),
-                                                    TRUE);
+       if (event->button == 1) {
+               icon_selected(mimeview, num, partinfo);
+               gtk_widget_grab_focus(button);
+               if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))) {
+                       toggle_icon(GTK_TOGGLE_BUTTON(button), mimeview);
+               }
        }
-
        part_button_pressed(mimeview, event, partinfo);
 
        return FALSE;
@@ -1808,7 +1827,7 @@ static gint icon_key_pressed(GtkWidget *button, GdkEventKey *event,
                if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))) {
                        /* stop the button being untoggled */
                        KEY_PRESS_EVENT_STOP();
-                       if (textview_scroll_page(textview, FALSE))
+                       if (mimeview_scroll_page(mimeview, FALSE))
                                return TRUE;
 
                        if (icon_list_select_by_number(mimeview, num + 1))
@@ -1821,12 +1840,12 @@ static gint icon_key_pressed(GtkWidget *button, GdkEventKey *event,
 
                break;
        case GDK_BackSpace:
-               textview_scroll_page(textview, TRUE);
+               mimeview_scroll_page(mimeview, TRUE);
                return TRUE;
        case GDK_Return:
                if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))) {
                        KEY_PRESS_EVENT_STOP();
-                       textview_scroll_one_line(textview,
+                       mimeview_scroll_one_line(mimeview,
                                                 (event->state & GDK_MOD1_MASK) != 0);
                        return TRUE;
                } else {
@@ -1866,7 +1885,7 @@ static gint icon_key_pressed(GtkWidget *button, GdkEventKey *event,
        case GDK_l:
                BREAK_ON_MODIFIER_KEY();
                KEY_PRESS_EVENT_STOP();
-               mimeview_launch(mimeview);
+               mimeview_launch(mimeview, NULL);
                return TRUE;
        case GDK_o:
                BREAK_ON_MODIFIER_KEY();
@@ -2216,7 +2235,10 @@ void mimeview_handle_cmd(MimeView *mimeview, const gchar *cmd, GdkEventButton *e
        if (!mainwin)
                return;
                
-       else if (!strcmp(cmd, "sc://view_log"))
+       g_object_set_data(G_OBJECT(mimeview->popupmenu),
+                         "pop_partinfo", NULL);
+
+       if (!strcmp(cmd, "sc://view_log"))
                log_window_show(mainwin->logwin);
        else if (!strcmp(cmd, "sc://save_as"))
                mimeview_save_as(mimeview);
@@ -2225,17 +2247,37 @@ void mimeview_handle_cmd(MimeView *mimeview, const gchar *cmd, GdkEventButton *e
        else if (!strcmp(cmd, "sc://open_with"))
                mimeview_open_with(mimeview);
        else if (!strcmp(cmd, "sc://open"))
-               mimeview_launch(mimeview);
+               mimeview_launch(mimeview, NULL);
        else if (!strcmp(cmd, "sc://select_attachment") && data != NULL) {
                icon_list_toggle_by_mime_info(mimeview, (MimeInfo *)data);
                icon_selected(mimeview, -1, (MimeInfo *)data);
        } else if (!strcmp(cmd, "sc://open_attachment") && data != NULL) {
-               icon_list_toggle_by_mime_info(mimeview, (MimeInfo *)data);
-               icon_selected(mimeview, -1, (MimeInfo *)data);
-               mimeview_launch(mimeview);
+               mimeview_launch(mimeview, (MimeInfo *)data);
        } else if (!strcmp(cmd, "sc://menu_attachment") && data != NULL) {
                mimeview->spec_part = (MimeInfo *)data;
                part_button_pressed(mimeview, event, (MimeInfo *)data);
        }
 }
 
+gboolean mimeview_scroll_page(MimeView *mimeview, gboolean up)
+{
+       if (mimeview->type == MIMEVIEW_TEXT)
+               return textview_scroll_page(mimeview->textview, up);
+       else if (mimeview->mimeviewer) {
+               MimeViewer *mimeviewer = mimeview->mimeviewer;
+               if (mimeviewer->scroll_page)
+                       return mimeviewer->scroll_page(mimeviewer, up);
+       }
+       return TRUE;
+}
+
+void mimeview_scroll_one_line(MimeView *mimeview, gboolean up)
+{
+       if (mimeview->type == MIMEVIEW_TEXT)
+               textview_scroll_one_line(mimeview->textview, up);
+       else if (mimeview->mimeviewer) {
+               MimeViewer *mimeviewer = mimeview->mimeviewer;
+               if (mimeviewer->scroll_one_line)
+                       mimeviewer->scroll_one_line(mimeviewer, up);
+       }
+}