2006-08-16 [colin] 2.4.0cvs54
[claws.git] / src / textview.c
index 82fc8351784d182e4789e712263b53c59fd375ad..db6a40e79f1715e637ba5e654e1a350fcb46172e 100644 (file)
@@ -953,8 +953,8 @@ textview_default:
                tmpfp = g_fopen(mimeinfo->data.filename, "rb");
                fseek(tmpfp, mimeinfo->offset, SEEK_SET);
                debug_print("Viewing text content of type: %s (length: %d)\n", mimeinfo->subtype, mimeinfo->length);
-               while ((fgets(buf, sizeof(buf), tmpfp) != NULL) && 
-                      (ftell(tmpfp) <= mimeinfo->offset + mimeinfo->length))
+               while ((ftell(tmpfp) < mimeinfo->offset + mimeinfo->length) &&
+                      (fgets(buf, sizeof(buf), tmpfp) != NULL))
                        textview_write_line(textview, buf, conv);
                fclose(tmpfp);
        }
@@ -1255,18 +1255,29 @@ static void textview_make_clickable_parts_later(TextView *textview,
 
        /* colorize this line */
        if (head.next) {
-               const gchar *normal_text = mybuf;
-
                /* insert URIs */
-               for (last = head.next; last != NULL;
-                    normal_text = last->ep, last = last->next) {
+               for (last = head.next; last != NULL; last = last->next) {
                        ClickableText *uri;
+                       gint start_offset, end_offset;
+                       gchar *tmp_str;
+                       gchar old_char;
                        uri = g_new0(ClickableText, 1);
                        uri->uri = parser[last->pti].build_uri(last->bp,
                                                               last->ep);
-                                                              
-                       gtk_text_buffer_get_iter_at_offset(buffer, &start_iter, last->bp - mybuf + offset);
-                       gtk_text_buffer_get_iter_at_offset(buffer, &end_iter, last->ep - mybuf + offset);
+                       
+                       tmp_str = mybuf;
+                       old_char = tmp_str[last->ep - mybuf];
+                       tmp_str[last->ep - mybuf] = '\0';                                      
+                       end_offset = g_utf8_strlen(tmp_str, -1);
+                       tmp_str[last->ep - mybuf] = old_char;
+                       
+                       old_char = tmp_str[last->bp - mybuf];
+                       tmp_str[last->bp - mybuf] = '\0';                                      
+                       start_offset = g_utf8_strlen(tmp_str, -1);
+                       tmp_str[last->bp - mybuf] = old_char;
+                       
+                       gtk_text_buffer_get_iter_at_offset(buffer, &start_iter, start_offset + offset);
+                       gtk_text_buffer_get_iter_at_offset(buffer, &end_iter, end_offset + offset);
                        
                        uri->start = gtk_text_iter_get_offset(&start_iter);
                        
@@ -1292,7 +1303,7 @@ static void textview_write_line(TextView *textview, const gchar *str,
        GtkTextIter iter;
        gchar buf[BUFFSIZE];
        gchar *fg_color;
-       gint quotelevel = -1;
+       gint quotelevel = -1, real_quotelevel = -1;
        gchar quote_tag_str[10];
 
        text = GTK_TEXT_VIEW(textview->text);
@@ -1313,8 +1324,8 @@ static void textview_write_line(TextView *textview, const gchar *str,
           level is colored using a different color. */
        if (prefs_common.enable_color 
            && line_has_quote_char(buf, prefs_common.quote_chars)) {
-               quotelevel = get_quote_level(buf, prefs_common.quote_chars);
-
+               real_quotelevel = get_quote_level(buf, prefs_common.quote_chars);
+               quotelevel = real_quotelevel;
                /* set up the correct foreground color */
                if (quotelevel > 2) {
                        /* recycle colors */
@@ -1338,8 +1349,8 @@ static void textview_write_line(TextView *textview, const gchar *str,
                textview->is_in_signature = TRUE;
        }
 
-       if (quotelevel > -1) {
-               if ( previousquotelevel != quotelevel ) {
+       if (real_quotelevel > -1) {
+               if ( previousquotelevel != real_quotelevel ) {
                        ClickableText *uri;
                        uri = g_new0(ClickableText, 1);
                        uri->uri = g_strdup("");
@@ -1352,12 +1363,12 @@ static void textview_write_line(TextView *textview, const gchar *str,
                        uri->filename = NULL;
                        uri->fg_color = g_strdup(fg_color);
                        uri->is_quote = TRUE;
-                       uri->quote_level = quotelevel;
+                       uri->quote_level = real_quotelevel;
                        textview->uri_list =
                                g_slist_append(textview->uri_list, uri);
                        gtk_text_buffer_insert(buffer, &iter, "  \n", -1);
                
-                       previousquotelevel = quotelevel;
+                       previousquotelevel = real_quotelevel;
                } else {
                        GSList *last = g_slist_last(textview->uri_list);
                        ClickableText *lasturi = (ClickableText *)last->data;
@@ -2123,7 +2134,7 @@ static void textview_uri_update(TextView *textview, gint x, gint y)
                GtkTextIter iter;
                GSList *tags;
                GSList *cur;
-
+               
                gtk_text_view_window_to_buffer_coords(GTK_TEXT_VIEW(textview->text), 
                                                      GTK_TEXT_WINDOW_WIDGET,
                                                      x, y, &bx, &by);
@@ -2137,7 +2148,7 @@ static void textview_uri_update(TextView *textview, gint x, gint y)
 
                        g_object_get(G_OBJECT(tag), "name", &name, NULL);
 
-                       if ((!strcmp(name, "link") || !strcmp(name, "qlink"))
+                       if ((!strcmp(name, "link"))
                            && textview_get_uri_range(textview, &iter, tag,
                                                      &start_iter, &end_iter)) {
 
@@ -2145,9 +2156,8 @@ static void textview_uri_update(TextView *textview, gint x, gint y)
                                                                  &iter, tag,
                                                                  &start_iter,
                                                                  &end_iter);
-                       } 
+                       }
                        g_free(name);
-
                        if (uri)
                                break;
                }
@@ -2224,7 +2234,11 @@ static ClickableText *textview_get_uri_from_range(TextView *textview,
                    end_pos ==  uri_->end) {
                        uri = uri_;
                        break;
-               } else if (start_pos == uri_->start ||
+               } 
+       }
+       for (cur = textview->uri_list; uri == NULL && cur != NULL; cur = cur->next) {
+               ClickableText *uri_ = (ClickableText *)cur->data;
+               if (start_pos == uri_->start ||
                           end_pos == uri_->end) {
                        /* in case of contiguous links, textview_get_uri_range
                         * returns a broader range (start of 1st link to end
@@ -2384,7 +2398,10 @@ static gboolean textview_uri_button_pressed(GtkTextTag *tag, GObject *obj,
        bevent = (GdkEventButton *) event;
        
        /* doubleclick: open compose / add address / browser */
-       if ((event->type == (qlink ? GDK_2BUTTON_PRESS:GDK_BUTTON_PRESS) && bevent->button == 1) ||
+       if (qlink && event->type == GDK_BUTTON_PRESS && bevent->button != 1) {
+               /* pass rightclick through */
+               return FALSE;
+       } else if ((event->type == (qlink ? GDK_2BUTTON_PRESS:GDK_BUTTON_PRESS) && bevent->button == 1) ||
                bevent->button == 2 || bevent->button == 3) {
                if (uri->filename && !g_ascii_strncasecmp(uri->filename, "sc://", 5)) {
                        MimeView *mimeview = 
@@ -2403,7 +2420,6 @@ static gboolean textview_uri_button_pressed(GtkTextTag *tag, GObject *obj,
                } else if (qlink && bevent->button == 1) {
                        textview_toggle_quote(textview, uri, FALSE);
                        return TRUE;
-                               
                } else if (!g_ascii_strncasecmp(uri->uri, "mailto:", 7)) {
                        if (bevent->button == 3) {
                                g_object_set_data(