2012-04-01 [colin] 3.8.0cvs36
[claws.git] / src / textview.c
index 772e89addcdfc7e1917d2622d6668139a64dea58..823e0035e93ddddf48767422f106db0cc295675a 100644 (file)
 #include "html.h"
 #include "enriched.h"
 #include "compose.h"
-#include "addressbook.h"
+#ifndef USE_NEW_ADDRBOOK
+       #include "addressbook.h"
+       #include "addrindex.h"
+#else
+       #include "addressbook-dbus.h"
+       #include "addressadd.h"
+#endif
 #include "displayheader.h"
 #include "account.h"
 #include "mimeview.h"
@@ -67,7 +73,6 @@
 #include "inputdialog.h"
 #include "timing.h"
 #include "tags.h"
-#include "addrindex.h"
 
 static GdkColor quote_colors[3] = {
        {(gulong)0, (gushort)0, (gushort)0, (gushort)0},
@@ -233,8 +238,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);
@@ -368,7 +375,6 @@ TextView *textview_create(void)
        textview->text               = text;
        textview->uri_list           = NULL;
        textview->body_pos           = 0;
-       textview->show_all_headers   = FALSE;
        textview->last_buttonpress   = GDK_NOTHING;
        textview->image              = NULL;
        return textview;
@@ -378,10 +384,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 +402,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
@@ -495,7 +508,6 @@ void textview_init(TextView *textview)
                watch_cursor = gdk_cursor_new(GDK_WATCH);
 
        textview_reflect_prefs(textview);
-       textview_set_all_headers(textview, FALSE);
        textview_set_font(textview, NULL);
        textview_create_tags(GTK_TEXT_VIEW(textview->text), textview);
 }
@@ -603,6 +615,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 +692,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 +708,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 +723,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);
@@ -860,6 +867,24 @@ void textview_show_error(TextView *textview)
        textview_show_icon(textview, GTK_STOCK_DIALOG_ERROR);
 }
 
+void textview_show_info(TextView *textview, const gchar *info_str)
+{
+       GtkTextView *text;
+       GtkTextBuffer *buffer;
+       GtkTextIter iter;
+
+       textview_set_font(textview, NULL);
+       textview_clear(textview);
+
+       text = GTK_TEXT_VIEW(textview->text);
+       buffer = gtk_text_view_get_buffer(text);
+       gtk_text_buffer_get_start_iter(buffer, &iter);
+
+       TEXTVIEW_INSERT(info_str);
+       textview_show_icon(textview, GTK_STOCK_DIALOG_INFO);
+       textview_cursor_normal(textview);
+}
+
 void textview_show_mime_part(TextView *textview, MimeInfo *partinfo)
 {
        GtkTextView *text;
@@ -1667,11 +1692,6 @@ void textview_destroy(TextView *textview)
        g_free(textview);
 }
 
-void textview_set_all_headers(TextView *textview, gboolean all_headers)
-{
-       textview->show_all_headers = all_headers;
-}
-
 #define CHANGE_TAG_FONT(tagname, font) { \
        tag = gtk_text_tag_table_lookup(tags, tagname); \
        if (tag) \
@@ -1793,7 +1813,7 @@ static GPtrArray *textview_scan_header(TextView *textview, FILE *fp)
 
        cm_return_val_if_fail(fp != NULL, NULL);
 
-       if (textview->show_all_headers) {
+       if (prefs_common.show_all_headers) {
                headers = procheader_get_header_array_asis(fp);
                sorted_headers = g_ptr_array_new();
                for (i = 0; i < headers->len; i++) {
@@ -1857,6 +1877,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 +1898,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 +1916,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 +1928,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);
@@ -1919,6 +1943,7 @@ void textview_show_icon(TextView *textview, const gchar *stock_id)
 #if HAVE_LIBCOMPFACE
 static void textview_show_xface(TextView *textview)
 {
+       GtkAllocation allocation;
        MsgInfo *msginfo = textview->messageview->msginfo;
        GtkTextView *text = GTK_TEXT_VIEW(textview->text);
        int x = 0;
@@ -1951,7 +1976,8 @@ static void textview_show_xface(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);
@@ -1969,6 +1995,7 @@ bail:
 
 static void textview_save_contact_pic(TextView *textview)
 {
+#ifndef USE_NEW_ADDRBOOK
        MsgInfo *msginfo = textview->messageview->msginfo;
        gchar *filename = NULL;
        GError *error = NULL;
@@ -1992,10 +2019,14 @@ static void textview_save_contact_pic(TextView *textview)
                }
        }
        g_free(filename);
+#else
+       /* new address book */
+#endif
 }
 
 static void textview_show_contact_pic(TextView *textview)
 {
+#ifndef USE_NEW_ADDRBOOK
        MsgInfo *msginfo = textview->messageview->msginfo;
        GtkTextView *text = GTK_TEXT_VIEW(textview->text);
        int x = 0;
@@ -2059,7 +2090,9 @@ bail:
        if (textview->image) 
                gtk_widget_destroy(textview->image);
        textview->image = NULL;
-       
+#else
+       /* new address book */
+#endif 
 }
 
 static gint textview_tag_cmp_list(gconstpointer a, gconstpointer b)
@@ -2239,7 +2272,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);
 }
@@ -2247,11 +2280,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");
@@ -2259,6 +2309,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;
 
@@ -2267,19 +2318,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
@@ -2288,25 +2341,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,
@@ -2315,11 +2368,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);
@@ -2337,7 +2391,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;
 }
@@ -2370,7 +2424,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;
@@ -3022,6 +3076,7 @@ static void add_uri_to_addrbook_cb (GtkAction *action, TextView *textview)
        GtkWidget *image = NULL;
        GdkPixbuf *picture = NULL;
        gboolean use_picture = FALSE;
+
        if (uri == NULL)
                return;
 
@@ -3054,7 +3109,13 @@ static void add_uri_to_addrbook_cb (GtkAction *action, TextView *textview)
        if (image)
                picture = gtk_image_get_pixbuf(GTK_IMAGE(image));
 
+#ifndef USE_NEW_ADDRBOOK
        addressbook_add_contact( fromname, fromaddress, NULL, picture);
+#else
+       if (addressadd_selection(fromname, fromaddress, NULL, picture)) {
+               debug_print( "addressbook_add_contact - added\n" );
+       }
+#endif
 
        g_free(fromaddress);
        g_free(fromname);