diff src/gtkconv.c @ 8061:ea073d234191

[gaim-migrate @ 8749] <b><i><u>what you see is what you get</u></i></b> committer: Tailor Script <tailor@pidgin.im>
author Nathan Walp <nwalp@pidgin.im>
date Sat, 10 Jan 2004 06:06:02 +0000
parents fa6395637e2c
children 73781ed9fdf7
line wrap: on
line diff
--- a/src/gtkconv.c	Sat Jan 10 05:20:50 2004 +0000
+++ b/src/gtkconv.c	Sat Jan 10 06:06:02 2004 +0000
@@ -353,23 +353,73 @@
 	return FALSE;
 }
 
+static void default_formatize(GaimConversation *conv) {
+	GaimGtkConversation *c = GAIM_GTK_CONVERSATION(conv);
+	GaimConnection *gc = gaim_conversation_get_gc(conv);
+		
+	if (gc && gc->flags & GAIM_CONNECTION_HTML) {
+		if (gaim_prefs_get_bool("/gaim/gtk/conversations/send_bold")) {
+			gtk_imhtml_toggle_bold(GTK_IMHTML(c->entry));
+		}
+		
+		if (gaim_prefs_get_bool("/gaim/gtk/conversations/send_italic")) {
+			gtk_imhtml_toggle_italic(GTK_IMHTML(c->entry));
+		}
+
+		if (gaim_prefs_get_bool("/gaim/gtk/conversations/send_underline")) {
+			gtk_imhtml_toggle_underline(GTK_IMHTML(c->entry));
+		}
+
+		if (gaim_prefs_get_bool("/gaim/gtk/conversations/send_strikethrough")) {
+			/* Tell me noone uses <s> by default ... maybe I won't do
+			 _toggle_strikethrough and not let them */
+			/*	g_snprintf(buf2, limit, "<STRIKE>%s</STRIKE>", buf);
+			  strcpy(buf, buf2); */
+		}
+
+		if (gaim_prefs_get_bool("/gaim/gtk/conversations/use_custom_font") || c->has_font) {
+			gtk_imhtml_toggle_fontface(GTK_IMHTML(c->entry), c->fontface);
+		}
+
+		if (gaim_prefs_get_bool("/gaim/gtk/conversations/use_custom_size")) {
+		        gtk_imhtml_font_set_size(GTK_IMHTML(c->entry), gaim_prefs_get_int("/gaim/gtk/conversations/font_size"));
+		}
+
+		if (gaim_prefs_get_bool("/gaim/gtk/conversations/use_custom_fgcolor")) {
+			char *color = g_strdup_printf("#%02x%02x%02x", 
+						      c->fg_color.red   / 256,
+						      c->fg_color.green / 256,
+						      c->fg_color.blue  / 256);
+			gtk_imhtml_toggle_forecolor(GTK_IMHTML(c->entry), color);
+			g_free(color);
+		}
+
+		if (!(gc->flags & GAIM_CONNECTION_NO_BGCOLOR) && gaim_prefs_get_bool("/gaim/gtk/conversations/use_custom_bgcolor")) {
+			char *color = g_strdup_printf("#%02x%02x%02x", 
+						      c->bg_color.red   / 256,
+						      c->bg_color.green / 256,
+						      c->bg_color.blue  / 256);
+			gtk_imhtml_toggle_backcolor(GTK_IMHTML(c->entry), color);
+			g_free(color);	
+		}
+	}
+}
+
 static void
 send_cb(GtkWidget *widget, GaimConversation *conv)
 {
 	GaimGtkConversation *gtkconv;
-	char *buf, *buf2;
-	GtkTextIter start_iter, end_iter;
-	int limit;
+	char *buf;
 	GaimConnection *gc = gaim_conversation_get_gc(conv);
 
 	gtkconv = GAIM_GTK_CONVERSATION(conv);
-
-	gtk_text_buffer_get_start_iter(gtkconv->entry_buffer, &start_iter);
-	gtk_text_buffer_get_end_iter(gtkconv->entry_buffer, &end_iter);
-	buf2 = gtk_text_buffer_get_text(gtkconv->entry_buffer,
-									&start_iter, &end_iter, FALSE);
-
-	set_toggle(gtkconv->toolbar.bold,        FALSE);
+	
+	if (gc && gc->flags & GAIM_CONNECTION_HTML)
+		buf = gtk_imhtml_get_markup(GTK_IMHTML(gtkconv->entry));
+	else
+		buf = gtk_imhtml_get_text(GTK_IMHTML(gtkconv->entry));
+
+	/*	set_toggle(gtkconv->toolbar.bold,        FALSE);
 	set_toggle(gtkconv->toolbar.italic,      FALSE);
 	set_toggle(gtkconv->toolbar.underline,   FALSE);
 	set_toggle(gtkconv->toolbar.larger_size, FALSE);
@@ -379,85 +429,18 @@
 	set_toggle(gtkconv->toolbar.fgcolor,     FALSE);
 	set_toggle(gtkconv->toolbar.bgcolor,     FALSE);
 	set_toggle(gtkconv->toolbar.link,        FALSE);
-
+	*/
 	gtk_widget_grab_focus(gtkconv->entry);
 
-	limit = 32 * 1024; /* This will be done again in gaim_conv_im_send. *shrug* */
-
-	buf = g_malloc(limit);
-	strncpy(buf, buf2, limit);
-
-	g_free(buf2);
-
 	if (strlen(buf) == 0) {
 		g_free(buf);
 
 		return;
 	}
 
-	buf2 = g_malloc(limit);
-
-	if (gc && gc->flags & GAIM_CONNECTION_HTML) {
-		if (gaim_prefs_get_bool("/gaim/gtk/conversations/send_bold")) {
-			g_snprintf(buf2, limit, "<B>%s</B>", buf);
-			strcpy(buf, buf2);
-		}
-
-		if (gaim_prefs_get_bool("/gaim/gtk/conversations/send_italic")) {
-			g_snprintf(buf2, limit, "<I>%s</I>", buf);
-			strcpy(buf, buf2);
-		}
-
-		if (gaim_prefs_get_bool("/gaim/gtk/conversations/send_underline")) {
-			g_snprintf(buf2, limit, "<U>%s</U>", buf);
-			strcpy(buf, buf2);
-		}
-
-		if (gaim_prefs_get_bool("/gaim/gtk/conversations/send_strikethrough")) {
-			g_snprintf(buf2, limit, "<STRIKE>%s</STRIKE>", buf);
-			strcpy(buf, buf2);
-		}
-
-		if (gaim_prefs_get_bool("/gaim/gtk/conversations/use_custom_font") ||
-			gtkconv->has_font) {
-
-			g_snprintf(buf2, limit,
-					   "<FONT FACE=\"%s\">%s</FONT>", gtkconv->fontface, buf);
-			strcpy(buf, buf2);
-		}
-
-		if (gaim_prefs_get_bool("/gaim/gtk/conversations/use_custom_size")) {
-			g_snprintf(buf2, limit,
-					   "<FONT SIZE=\"%d\">%s</FONT>",
-					   gaim_prefs_get_int("/gaim/gtk/conversations/font_size"),
-					   buf);
-			strcpy(buf, buf2);
-		}
-
-		if (gaim_prefs_get_bool("/gaim/gtk/conversations/use_custom_fgcolor")) {
-			g_snprintf(buf2, limit,
-					   "<FONT COLOR=\"#%02X%02X%02X\">%s</FONT>",
-					   gtkconv->fg_color.red   / 256,
-					   gtkconv->fg_color.green / 256,
-					   gtkconv->fg_color.blue  / 256, buf);
-			strcpy(buf, buf2);
-		}
-
-		if (!(gc->flags & GAIM_CONNECTION_NO_BGCOLOR) && gaim_prefs_get_bool("/gaim/gtk/conversations/use_custom_bgcolor")) {
-			g_snprintf(buf2, limit,
-					   "<BODY BGCOLOR=\"#%02X%02X%02X\">%s</BODY>",
-					   gtkconv->bg_color.red   / 256,
-					   gtkconv->bg_color.green / 256,
-					   gtkconv->bg_color.blue  / 256, buf);
-			strcpy(buf, buf2);
-		}
-	}
-
-	g_free(buf2);
-
 	if (gaim_conversation_get_type(conv) == GAIM_CONV_IM)
 		gaim_conv_im_send(GAIM_CONV_IM(conv), buf);
-	else
+	else if (gaim_conversation_get_type(conv) == GAIM_CONV_CHAT)
 		gaim_conv_chat_send(GAIM_CONV_CHAT(conv), buf);
 
 	if (gaim_prefs_get_bool("/gaim/gtk/conversations/im/hide_on_send"))
@@ -465,7 +448,8 @@
 
 	g_free(buf);
 
-	gtk_text_buffer_set_text(gtkconv->entry_buffer, "", -1);
+	gtk_imhtml_clear(GTK_IMHTML(gtkconv->entry));
+	default_formatize(conv);
 }
 
 static void
@@ -1353,8 +1337,8 @@
 					conv->send_history->next->data) {
 
 					conv->send_history = conv->send_history->next;
-					gtk_text_buffer_set_text(gtkconv->entry_buffer,
-											 conv->send_history->data, -1);
+					gtk_imhtml_clear(GTK_IMHTML(gtkconv->entry));
+					gtk_imhtml_append_text_with_images(GTK_IMHTML(gtkconv->entry), conv->send_history->data, 0, NULL);
 				}
 
 				break;
@@ -1366,9 +1350,10 @@
 				if (conv->send_history->prev) {
 					conv->send_history = conv->send_history->prev;
 
-					if (conv->send_history->data)
-						gtk_text_buffer_set_text(gtkconv->entry_buffer,
-												 conv->send_history->data, -1);
+					if (conv->send_history->data) {
+						gtk_imhtml_clear(GTK_IMHTML(gtkconv->entry));
+						gtk_imhtml_append_text_with_images(GTK_IMHTML(gtkconv->entry), conv->send_history->data, 0, NULL);
+					}
 				}
 
 				break;
@@ -2304,66 +2289,35 @@
 static void
 do_bold(GtkWidget *bold, GaimGtkConversation *gtkconv)
 {
-	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(bold)))
-		gaim_gtk_surround(gtkconv, "<B>", "</B>");
-	else
-		gaim_gtk_advance_past(gtkconv, "<B>", "</B>");
-
+	gtk_imhtml_toggle_bold(GTK_IMHTML(gtkconv->entry));
 	gtk_widget_grab_focus(gtkconv->entry);
 }
 
 static void
 do_italic(GtkWidget *italic, GaimGtkConversation *gtkconv)
 {
-	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(italic)))
-		gaim_gtk_surround(gtkconv, "<I>", "</I>");
-	else
-		gaim_gtk_advance_past(gtkconv, "<I>", "</I>");
-
+	gtk_imhtml_toggle_italic(GTK_IMHTML(gtkconv->entry));
 	gtk_widget_grab_focus(gtkconv->entry);
 }
 
 static void
 do_underline(GtkWidget *underline, GaimGtkConversation *gtkconv)
 {
-	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(underline)))
-		gaim_gtk_surround(gtkconv, "<U>", "</U>");
-	else
-		gaim_gtk_advance_past(gtkconv, "<U>", "</U>");
-
+	gtk_imhtml_toggle_underline(GTK_IMHTML(gtkconv->entry));
 	gtk_widget_grab_focus(gtkconv->entry);
 }
 
 static void
 do_small(GtkWidget *smalltb, GaimGtkConversation *gtkconv)
 {
-	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(smalltb)))
-		gaim_gtk_surround(gtkconv, "<FONT SIZE=\"1\">", "</FONT>");
-	else
-		gaim_gtk_advance_past(gtkconv, "<FONT SIZE=\"1\">", "</FONT>");
-
-	gtk_widget_grab_focus(gtkconv->entry);
-}
-
-static void
-do_normal(GtkWidget *normal, GaimGtkConversation *gtkconv)
-{
-	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(normal)))
-		gaim_gtk_surround(gtkconv, "<FONT SIZE=\"3\">", "</FONT>");
-	else
-		gaim_gtk_advance_past(gtkconv, "<FONT SIZE=\"3\">", "</FONT>");
-
+	gtk_imhtml_font_shrink(GTK_IMHTML(gtkconv->entry));
 	gtk_widget_grab_focus(gtkconv->entry);
 }
 
 static void
 do_big(GtkWidget *large, GaimGtkConversation *gtkconv)
 {
-	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(large)))
-		gaim_gtk_surround(gtkconv, "<FONT SIZE=\"5\">", "</FONT>");
-	else
-		gaim_gtk_advance_past(gtkconv, "<FONT SIZE=\"5\">", "</FONT>");
-
+	gtk_imhtml_font_grow(GTK_IMHTML(gtkconv->entry));
 	gtk_widget_grab_focus(gtkconv->entry);
 }
 
@@ -2374,12 +2328,7 @@
 
 	gtkconv = GAIM_GTK_CONVERSATION(conv);
 
-	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(font)))
-		show_font_dialog(conv, font);
-	else if (gtkconv->dialogs.font != NULL)
-		cancel_font(font, conv);
-	else
-		gaim_gtk_advance_past(gtkconv, "<FONT FACE>", "</FONT>");
+	show_font_dialog(conv, font);
 }
 
 static void
@@ -3440,7 +3389,7 @@
 
 	gtkconv->toolbar.larger_size = button;
 
-	/* Normal font size */
+	/* Normal font size 
 	button = gaim_pixbuf_toolbar_button_from_stock(GAIM_STOCK_TEXT_NORMAL);
 	gtk_size_group_add_widget(sg, button);
 	gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
@@ -3451,6 +3400,7 @@
 					 G_CALLBACK(do_normal), gtkconv);
 
 	gtkconv->toolbar.normal_size = button;
+	*/
 
 	/* Decrease font size */
 	button = gaim_pixbuf_toolbar_button_from_stock(GAIM_STOCK_TEXT_SMALLER);
@@ -3773,14 +3723,17 @@
 	/* Setup the entry widget. */
 	sw = gtk_scrolled_window_new(NULL, NULL);
 	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw),
-			GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
-	gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_IN);
+								   GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+	gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw),
+										GTK_SHADOW_IN);
 	gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 0);
 	gtk_widget_show(sw);
 
-	gtkconv->entry_buffer = gtk_text_buffer_new(NULL);
-	gtkconv->entry = gtk_text_view_new_with_buffer(gtkconv->entry_buffer);
-
+	gtkconv->entry = gtk_imhtml_new(NULL, NULL);
+	gtkconv->entry_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(gtkconv->entry));
+	gaim_setup_imhtml(gtkconv->entry);
+	gtk_imhtml_set_editable(GTK_IMHTML(gtkconv->entry), TRUE);
+	default_formatize(conv);
 	gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(gtkconv->entry), GTK_WRAP_WORD_CHAR);
 	gtk_widget_set_size_request(gtkconv->entry, -1,
 			MAX(gaim_prefs_get_int("/gaim/gtk/conversations/chat/entry_height"),
@@ -3874,14 +3827,17 @@
 	/* Setup the entry widget. */
 	sw = gtk_scrolled_window_new(NULL, NULL);
 	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw),
-			GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
-	gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_IN);
+								   GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+	gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw),
+										GTK_SHADOW_IN);
 	gtk_box_pack_start(GTK_BOX(vbox2), sw, TRUE, TRUE, 0);
 	gtk_widget_show(sw);
 
-	gtkconv->entry_buffer = gtk_text_buffer_new(NULL);
-	gtkconv->entry = gtk_text_view_new_with_buffer(gtkconv->entry_buffer);
-
+	gtkconv->entry = gtk_imhtml_new(NULL, NULL);
+	gtkconv->entry_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(gtkconv->entry));
+	gaim_setup_imhtml(gtkconv->entry);
+	gtk_imhtml_set_editable(GTK_IMHTML(gtkconv->entry), TRUE);
+	default_formatize(conv);
 	gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(gtkconv->entry), GTK_WRAP_WORD_CHAR);
 	gtk_widget_set_size_request(gtkconv->entry, -1,
 			MAX(gaim_prefs_get_int("/gaim/gtk/conversations/im/entry_height"),