2011-11-07 [pawel] 3.7.10cvs77
[claws.git] / src / textview.c
index f1c1e8cc5ce3684460fc3512a2daccd640aa7073..1e4688654d10aa46fccca4f03218d43ec4b74e0b 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2009 Hiroyuki Yamamoto and the Claws Mail team
+ * Copyright (C) 1999-2011 Hiroyuki Yamamoto and the Claws Mail team
  *
  * 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
@@ -233,8 +233,10 @@ static void scrolled_cb (GtkAdjustment *adj, TextView *textview)
 #  define HEIGHT 48
 #endif
        if (textview->image) {
+               GtkAllocation allocation;
                gint x, y, x1;
-               x1 = textview->text->allocation.width - WIDTH - 5;
+               gtk_widget_get_allocation(textview->text, &allocation);
+               x1 = allocation.width - WIDTH - 5;
                gtk_text_view_buffer_to_window_coords(
                        GTK_TEXT_VIEW(textview->text),
                        GTK_TEXT_WINDOW_TEXT, x1, 5, &x, &y);
@@ -378,10 +380,16 @@ static void textview_create_tags(GtkTextView *text, TextView *textview)
 {
        GtkTextBuffer *buffer;
        GtkTextTag *tag, *qtag;
+#if !GTK_CHECK_VERSION(3, 0, 0)
        static GdkColor yellow, black;
        static gboolean color_init = FALSE;
+#else
+       static GdkColor yellow = { (guint32)0, (guint16)0xf5, (guint16)0xf6, (guint16)0xbe };
+       static GdkColor black = { (guint32)0, (guint16)0x0, (guint16)0x0, (guint16)0x0 };
+#endif
        static PangoFontDescription *font_desc, *bold_font_desc;
        
+#if !GTK_CHECK_VERSION(3, 0, 0)
        if (!color_init) {
                gdk_color_parse("#f5f6be", &yellow);
                gdk_color_parse("#000000", &black);
@@ -390,6 +398,7 @@ static void textview_create_tags(GtkTextView *text, TextView *textview)
                color_init &= gdk_colormap_alloc_color(
                        gdk_colormap_get_system(), &black, FALSE, TRUE);
        }
+#endif
 
        if (!font_desc)
                font_desc = pango_font_description_from_string
@@ -603,6 +612,7 @@ void textview_show_part(TextView *textview, MimeInfo *mimeinfo, FILE *fp)
 
 static void textview_add_part(TextView *textview, MimeInfo *mimeinfo)
 {
+       GtkAllocation allocation;
        GtkTextView *text;
        GtkTextBuffer *buffer;
        GtkTextIter iter, start_iter;
@@ -679,8 +689,6 @@ static void textview_add_part(TextView *textview, MimeInfo *mimeinfo)
                if (mimeinfo->type == MIMETYPE_IMAGE  &&
                    prefs_common.inline_img ) {
                        GdkPixbuf *pixbuf;
-                       gint avail_width;
-                       gint avail_height;
                        GError *error = NULL;
                        gchar *filename;
                        ClickableText *uri;
@@ -697,20 +705,7 @@ static void textview_add_part(TextView *textview, MimeInfo *mimeinfo)
                                return;
                        }
 
-                       if (!prefs_common.resize_img) {
-                               pixbuf = gdk_pixbuf_new_from_file(filename, &error);
-                       } else {
-                               gint w, h;
-                               gdk_pixbuf_get_file_info(filename, &w, &h);
-                               avail_width = textview->scrolledwin->allocation.width;
-                               avail_height = textview->scrolledwin->allocation.height;
-                               if (avail_width - 100 > 0 &&
-                                   (w > avail_width || h > avail_height))
-                                       pixbuf = gdk_pixbuf_new_from_file_at_scale(filename, 
-                                               avail_width, avail_height, TRUE, &error);
-                               else
-                                       pixbuf = gdk_pixbuf_new_from_file(filename, &error);
-                       }
+                       pixbuf = gdk_pixbuf_new_from_file(filename, &error);
                        if (textview->stop_loading) {
                                return;
                        }
@@ -725,6 +720,15 @@ static void textview_add_part(TextView *textview, MimeInfo *mimeinfo)
                                return;
                        }
 
+                       gtk_widget_get_allocation(textview->scrolledwin, &allocation);
+                       pixbuf = claws_load_pixbuf_fitting(pixbuf,
+                                       allocation.width,
+                                       allocation.height);
+
+                       if (textview->stop_loading) {
+                               return;
+                       }
+
                        uri_str = g_filename_to_uri(filename, NULL, NULL);
                        if (uri_str) {
                                uri = g_new0(ClickableText, 1);
@@ -855,7 +859,7 @@ void textview_show_error(TextView *textview)
                      "  This is probably due to a network error.\n"
                      "\n"
                      "  Use "));
-       TEXTVIEW_INSERT_LINK(_("'View Log'"), "sc://view_log", NULL);
+       TEXTVIEW_INSERT_LINK(_("'Network Log'"), "sc://view_log", NULL);
        TEXTVIEW_INSERT(_(" in the Tools menu for more information."));
        textview_show_icon(textview, GTK_STOCK_DIALOG_ERROR);
 }
@@ -1857,6 +1861,7 @@ static GPtrArray *textview_scan_header(TextView *textview, FILE *fp)
 
 static void textview_show_face(TextView *textview)
 {
+       GtkAllocation allocation;
        GtkTextView *text = GTK_TEXT_VIEW(textview->text);
        MsgInfo *msginfo = textview->messageview->msginfo;
        int x = 0;
@@ -1877,7 +1882,8 @@ static void textview_show_face(TextView *textview)
 
        gtk_widget_show(textview->image);
        
-       x = textview->text->allocation.width - WIDTH -5;
+       gtk_widget_get_allocation(textview->text, &allocation);
+       x = allocation.width - WIDTH -5;
 
        gtk_text_view_add_child_in_window(text, textview->image, 
                GTK_TEXT_WINDOW_TEXT, x, 5);
@@ -1894,6 +1900,7 @@ bail:
 
 void textview_show_icon(TextView *textview, const gchar *stock_id)
 {
+       GtkAllocation allocation;
        GtkTextView *text = GTK_TEXT_VIEW(textview->text);
        int x = 0;
        
@@ -1905,7 +1912,8 @@ void textview_show_icon(TextView *textview, const gchar *stock_id)
 
        gtk_widget_show(textview->image);
        
-       x = textview->text->allocation.width - WIDTH -5;
+       gtk_widget_get_allocation(textview->text, &allocation);
+       x = allocation.width - WIDTH -5;
 
        gtk_text_view_add_child_in_window(text, textview->image, 
                GTK_TEXT_WINDOW_TEXT, x, 5);
@@ -1996,6 +2004,7 @@ static void textview_save_contact_pic(TextView *textview)
 
 static void textview_show_contact_pic(TextView *textview)
 {
+       GtkAllocation allocation;
        MsgInfo *msginfo = textview->messageview->msginfo;
        GtkTextView *text = GTK_TEXT_VIEW(textview->text);
        int x = 0;
@@ -2047,7 +2056,8 @@ static void textview_show_contact_pic(TextView *textview)
 
        gtk_widget_show(textview->image);
        
-       x = textview->text->allocation.width - WIDTH -5;
+       gtk_widget_get_allocation(textview->text, &allocation);
+       x = allocation.width - WIDTH -5;
 
        gtk_text_view_add_child_in_window(text, textview->image, 
                GTK_TEXT_WINDOW_TEXT, x, 5);
@@ -2178,7 +2188,8 @@ static void textview_show_header(TextView *textview, GPtrArray *headers)
                    procheader_headername_equal(header->name, "Cc"))
                        unfold_line(header->body);
                
-               if (procheader_headername_equal(header->name, "Date")) {
+               if (procheader_headername_equal(header->name, "Date") &&
+                   prefs_common.msgview_date_format) {
                        gchar hbody[80];
                        
                        procheader_date_parse(hbody, header->body, sizeof(hbody));
@@ -2238,7 +2249,7 @@ gboolean textview_search_string_backward(TextView *textview, const gchar *str,
 void textview_scroll_one_line(TextView *textview, gboolean up)
 {
        GtkTextView *text = GTK_TEXT_VIEW(textview->text);
-       GtkAdjustment *vadj = text->vadjustment;
+       GtkAdjustment *vadj = gtk_text_view_get_vadjustment(text);
 
        gtkutils_scroll_one_line(GTK_WIDGET(text), vadj, up);
 }
@@ -2246,11 +2257,28 @@ void textview_scroll_one_line(TextView *textview, gboolean up)
 gboolean textview_scroll_page(TextView *textview, gboolean up)
 {
        GtkTextView *text = GTK_TEXT_VIEW(textview->text);
-       GtkAdjustment *vadj = text->vadjustment;
+       GtkAdjustment *vadj = gtk_text_view_get_vadjustment(text);
 
        return gtkutils_scroll_page(GTK_WIDGET(text), vadj, up);
 }
 
+void textview_scroll_max(TextView *textview, gboolean up)
+{
+       GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview->text));
+       GtkTextIter iter;
+       
+       if (up) {
+               gtk_text_buffer_get_start_iter(buffer, &iter);
+               gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(textview->text),
+                                               &iter, 0.0, TRUE, 0.0, 1.0);
+       
+       } else {
+               gtk_text_buffer_get_end_iter(buffer, &iter);
+               gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(textview->text),
+                                               &iter, 0.0, TRUE, 0.0, 0.0);
+       }
+}
+
 #define KEY_PRESS_EVENT_STOP() \
        g_signal_stop_emission_by_name(G_OBJECT(widget), \
                                       "key_press_event");
@@ -2258,6 +2286,7 @@ gboolean textview_scroll_page(TextView *textview, gboolean up)
 static gint textview_key_pressed(GtkWidget *widget, GdkEventKey *event,
                                 TextView *textview)
 {
+       GdkWindow *window;
        SummaryView *summaryview = NULL;
        MessageView *messageview = textview->messageview;
 
@@ -2266,19 +2295,21 @@ static gint textview_key_pressed(GtkWidget *widget, GdkEventKey *event,
                summaryview = messageview->mainwin->summaryview;
 
        switch (event->keyval) {
-       case GDK_Tab:
-       case GDK_Home:
-       case GDK_Left:
-       case GDK_Up:
-       case GDK_Right:
-       case GDK_Down:
-       case GDK_Page_Up:
-       case GDK_Page_Down:
-       case GDK_End:
-       case GDK_Control_L:
-       case GDK_Control_R:
+       case GDK_KEY_Tab:
+       case GDK_KEY_Left:
+       case GDK_KEY_Up:
+       case GDK_KEY_Right:
+       case GDK_KEY_Down:
+       case GDK_KEY_Page_Up:
+       case GDK_KEY_Page_Down:
+       case GDK_KEY_Control_L:
+       case GDK_KEY_Control_R:
                return FALSE;
-       case GDK_space:
+       case GDK_KEY_Home:
+       case GDK_KEY_End:
+               textview_scroll_max(textview,(event->keyval == GDK_KEY_Home));
+               return TRUE;
+       case GDK_KEY_space:
                if (summaryview)
                        summary_pass_key_press_event(summaryview, event);
                else
@@ -2287,25 +2318,25 @@ static gint textview_key_pressed(GtkWidget *widget, GdkEventKey *event,
                                 (event->state &
                                  (GDK_SHIFT_MASK|GDK_MOD1_MASK)) != 0);
                break;
-       case GDK_BackSpace:
+       case GDK_KEY_BackSpace:
                mimeview_scroll_page(messageview->mimeview, TRUE);
                break;
-       case GDK_Return:
-       case GDK_KP_Enter:
+       case GDK_KEY_Return:
+       case GDK_KEY_KP_Enter:
                mimeview_scroll_one_line
                        (messageview->mimeview, (event->state &
                                    (GDK_SHIFT_MASK|GDK_MOD1_MASK)) != 0);
                break;
-       case GDK_Delete:
+       case GDK_KEY_Delete:
                if (summaryview)
                        summary_pass_key_press_event(summaryview, event);
                break;
-       case GDK_y:
-       case GDK_t:
-       case GDK_l:
-       case GDK_o:
-       case GDK_c:
-       case GDK_a:
+       case GDK_KEY_y:
+       case GDK_KEY_t:
+       case GDK_KEY_l:
+       case GDK_KEY_o:
+       case GDK_KEY_c:
+       case GDK_KEY_a:
                if ((event->state & (GDK_MOD1_MASK|GDK_CONTROL_MASK)) == 0) {
                        KEY_PRESS_EVENT_STOP();
                        mimeview_pass_key_press_event(messageview->mimeview,
@@ -2314,11 +2345,12 @@ static gint textview_key_pressed(GtkWidget *widget, GdkEventKey *event,
                }
                /* possible fall through */
        default:
+               window = gtk_widget_get_window(messageview->mainwin->window);
                if (summaryview &&
-                   event->window != messageview->mainwin->window->window) {
+                   event->window != window) {
                        GdkEventKey tmpev = *event;
 
-                       tmpev.window = messageview->mainwin->window->window;
+                       tmpev.window = window;
                        KEY_PRESS_EVENT_STOP();
                        gtk_widget_event(messageview->mainwin->window,
                                         (GdkEvent *)&tmpev);
@@ -2336,7 +2368,7 @@ static gboolean textview_motion_notify(GtkWidget *widget,
        if (textview->loading)
                return FALSE;
        textview_uri_update(textview, event->x, event->y);
-       gdk_window_get_pointer(widget->window, NULL, NULL, NULL);
+       gdk_window_get_pointer(gtk_widget_get_window(widget), NULL, NULL, NULL);
 
        return FALSE;
 }
@@ -2369,7 +2401,7 @@ static gboolean textview_visibility_notify(GtkWidget *widget,
        if (window != event->window)
                return FALSE;
        
-       gdk_window_get_pointer(widget->window, &wx, &wy, NULL);
+       gdk_window_get_pointer(gtk_widget_get_window(widget), &wx, &wy, NULL);
        textview_uri_update(textview, wx, wy);
 
        return FALSE;