New wrap quotation implementation. Move gtkstext_strncmp() to gtkstext.c.
[claws.git] / src / gtkstext.c
index 6e75dce3aa924407e7f4f945c6840801f9477e8b..751439b7964bceba0d8b0f0a16b6294bbe725e63 100644 (file)
@@ -27,7 +27,7 @@
 /*
  * Modified by the Sylpheed Team and others 2001. Interesting 
  * parts are marked using comment block following this one.
- * This modification is based on the GtkSText of GTK 1.2.8
+ * This modification is based on the GtkText of GTK 1.2.10
  */
 
 /* SYLPHEED: 
@@ -815,6 +815,13 @@ gtk_stext_new (GtkAdjustment *hadj,
                         "vadjustment", vadj,
                         NULL);
 
+  /* SYLPHEED:
+   * force widget name to be GtkText so it silently adapts
+   * the GtkText widget's style... 
+   */
+  gtk_widget_set_name(text, "GtkText");                        
+  gtk_widget_ensure_style(text);
+
   return text;
 }
 
@@ -999,11 +1006,10 @@ gtk_stext_thaw (GtkSText *text)
   draw_cursor (text, FALSE);
 }
 
+/* SYLPHEED */
 void
 gtk_stext_compact_buffer (GtkSText    *text)
 {
-  GtkEditable *editable = GTK_EDITABLE (text);
-
   g_return_if_fail (text != NULL);
   g_return_if_fail (GTK_IS_STEXT (text));
   move_gap (text, gtk_stext_get_length(text));
@@ -5066,6 +5072,65 @@ scroll_up (GtkSText* text, gint diff0)
     process_exposes (text);
 }
 
+/* compare gtkstext string at pos1 with string at pos2 for equality
+   (max. len chars) - we treat characters as single byte */
+guint gtkstext_strncmp(GtkSText *text, guint pos1, guint pos2, guint len,
+                      guint tlen)
+{
+       guint i = 0;
+       gchar ch1, ch2;
+
+       for (; (i < len) && (pos1 + i < tlen) && (pos2 + i < tlen); i++) {
+               ch1 = GTK_STEXT_INDEX(text, pos1 + i);
+               ch2 = GTK_STEXT_INDEX(text, pos2 + i);
+               if (ch1 != ch2)
+                       break;
+       }
+
+       return i;
+}
+
+/* return str length if text at start_pos matches str else return zero */
+guint gtkstext_str_strcmp(GtkSText *text, guint start_pos,
+                         guint text_len, gchar *str) {
+       guint is_str, i, str_len;
+       gchar str_ch;
+
+       is_str = 0;
+       if (str) {
+               str_len = strlen(str);
+               is_str = 1;
+               for (i = 0; (i < str_len) && (start_pos + i < text_len); i++) {
+                       str_ch = GTK_STEXT_INDEX(text, start_pos + i);
+                       if (*(str + i) != str_ch) {
+                               break;
+                       }
+               }
+               if (i == 0 || i < str_len)
+                       is_str = 0;
+       }
+
+       return is_str ? str_len : 0;
+}
+
+/* return true if text at pos is URL */
+guint is_url_string(GtkSText *text, guint start_pos, guint text_len)
+{
+       guint len;
+
+       len = gtkstext_str_strcmp(text, start_pos, text_len, "ftp://");
+       if (len == 6)
+               return 1;
+       len = gtkstext_str_strcmp(text, start_pos, text_len, "http://");
+       if (len == 7)
+               return 1;
+       len = gtkstext_str_strcmp(text, start_pos, text_len, "https://");
+       if (len == 8)
+               return 1;
+
+       return 0;
+}
+
 /**********************************************************************/
 /*                           Display Code                            */
 /**********************************************************************/
@@ -5106,7 +5171,10 @@ find_line_params (GtkSText* text,
        max_display_pixels = text->wrap_rmargin * ch_width; 
   }    
   
-  if (GTK_EDITABLE (text)->editable || !text->word_wrap)
+  /* SYLPHEED - we don't draw ugly word wrapping thing 
+   * if our wrap margin is set */
+  if (!text->wrap_rmargin &&
+      ((GTK_EDITABLE (text)->editable || !text->word_wrap)))
     max_display_pixels -= LINE_WRAP_ROOM;
   
   lp.wraps             = 0;
@@ -5206,6 +5274,16 @@ find_line_params (GtkSText* text,
                      /* If whole line is one word, revert to char wrapping */
                      if (lp.end.index == lp.start.index)
                        {
+                         /* SYLPHEED: don't wrap URLs */
+                          if (is_url_string(text, lp.end.index,
+                                        gtk_stext_get_length(text)))
+                            {
+                             lp.end = saved_mark;
+                             lp.displayable_chars = saved_characters + 1;
+                              lp.wraps = 0;
+                              goto no_url_wrap;
+                            }
+
                          lp.end = saved_mark;
                          lp.displayable_chars = saved_characters;
                          decrement_mark (&lp.end);
@@ -5228,6 +5306,7 @@ find_line_params (GtkSText* text,
          lp.displayable_chars += 1;
        }
       
+no_url_wrap:
       lp.font_ascent = MAX (font->ascent, lp.font_ascent);
       lp.font_descent = MAX (font->descent, lp.font_descent);
       lp.pixel_width  += ch_width;
@@ -5641,12 +5720,23 @@ undraw_cursor (GtkSText* text, gint absolute)
 
          gdk_gc_set_foreground (text->gc, MARK_CURRENT_FORE (text, &text->cursor_mark));
 
-         gdk_draw_text_wc (text->text_area, font,
-                        text->gc,
-                        text->cursor_pos_x,
-                        text->cursor_pos_y - text->cursor_char_offset,
-                        &text->cursor_char,
-                        1);
+          if (text->use_wchar)
+           gdk_draw_text_wc (text->text_area, font,
+                             text->gc,
+                             text->cursor_pos_x,
+                             text->cursor_pos_y - text->cursor_char_offset,
+                             &text->cursor_char,
+                             1);
+         else
+           {
+             guchar ch = text->cursor_char;
+             gdk_draw_text (text->text_area, font,
+                            text->gc,
+                            text->cursor_pos_x,
+                            text->cursor_pos_y - text->cursor_char_offset,
+                            (gchar *)&ch,
+                            1);         
+           }
        }
 
        gdk_gc_copy(text->gc, gc);