diff src/buddy_chat.c @ 3790:12b29552f1d7

[gaim-migrate @ 3930] Better than cheddar, it's i18n input... committer: Tailor Script <tailor@pidgin.im>
author Rob Flynn <gaim@robflynn.com>
date Wed, 23 Oct 2002 00:12:49 +0000
parents 165ae100e0a7
children 9bcb42faccc0
line wrap: on
line diff
--- a/src/buddy_chat.c	Tue Oct 22 23:31:49 2002 +0000
+++ b/src/buddy_chat.c	Wed Oct 23 00:12:49 2002 +0000
@@ -469,41 +469,52 @@
 
 void tab_complete(struct conversation *c)
 {
-	int pos = GTK_OLD_EDITABLE(c->entry)->current_pos;
-	int start = pos;
+	GtkTextIter cursor, word_start, start_buffer;
+	int start;
 	int most_matched = -1;
 	char *entered, *partial = NULL;
 	char *text;
 	GList *matches = NULL;
-	GList *nicks = c->in_room;
+	GList *nicks = NULL;
+
+	gtk_text_buffer_get_start_iter(c->entry_buffer, &start_buffer);
+	gtk_text_buffer_get_iter_at_mark(c->entry_buffer, &cursor,
+					 gtk_text_buffer_get_insert(c->entry_buffer));
+	word_start = cursor;
 
 	/* if there's nothing there just return */
-	if (!start)
+	if (!gtk_text_iter_compare(&cursor, &start_buffer))
 		return;
 	
-	text = gtk_editable_get_chars(GTK_EDITABLE(c->entry), 0, pos);
+	text = gtk_text_buffer_get_text(c->entry_buffer, &start_buffer, &cursor, FALSE);
 
 	/* if we're at the end of ": " we need to move back 2 spaces */
-	if (start >= 2 && text[start - 1] == ' ' && text[start - 2] == ':')
-		start -= 2;
-	
+	start = strlen(text)-1;
+	if (strlen(text)>=2 && !strncmp(&text[start-1], ": ", 2)) {
+		gtk_text_iter_backward_chars(&word_start, 2);
+	}
+
 	/* find the start of the word that we're tabbing */
-	while (start > 0 && text[start - 1] != ' ')
+	while (start >= 0 && text[start] != ' ') {
+		gtk_text_iter_backward_char(&word_start);
 		start--;
+	}
+	g_free(text);
 
-	entered = text + start;
+	entered = gtk_text_buffer_get_text(c->entry_buffer, &word_start, &cursor, FALSE);
 	if (chat_options & OPT_CHAT_OLD_STYLE_TAB) {
 		if (strlen(entered) >= 2 && !strncmp(": ", entered + strlen(entered) - 2, 2))
 			entered[strlen(entered) - 2] = 0;
 	}
-		
+
 	if (!strlen(entered)) {
-		g_free(text);
+		g_free(entered);
 		return;
 	}
 
 	debug_printf("checking tab-completion for %s\n", entered);
 
+	nicks = c->in_room;
 	while (nicks) {
 		char *nick = nicks->data;
 		/* this checks to see if the current nick could be a completion */
@@ -531,7 +542,7 @@
 
 		/* if we're doing old-style, just fill in the completion */
 		if (chat_options & OPT_CHAT_OLD_STYLE_TAB) {
-		        gtk_editable_delete_text(GTK_EDITABLE(c->entry), start, pos);
+		        gtk_text_buffer_delete(c->entry_buffer, &word_start, &cursor);
 			if (strlen(nick) == strlen(entered)) {
 				nicks = nicks->next ? nicks->next : c->in_room;
 				nick = nicks->data;
@@ -541,24 +552,17 @@
 					nick++;
 			}
 
-			if (start == 0) {
+			gtk_text_buffer_get_start_iter(c->entry_buffer, &start_buffer);
+			gtk_text_buffer_get_iter_at_mark(c->entry_buffer, &cursor,
+							 gtk_text_buffer_get_insert(c->entry_buffer));
+			if (!gtk_text_iter_compare(&cursor, &start_buffer)) {
 				char *tmp = g_strdup_printf("%s: ", nick);
-				int t = start;
-				gtk_editable_insert_text(GTK_EDITABLE(c->entry), tmp, strlen(tmp), &start);
-				if (t == start) {
-					t = start + strlen(tmp);
-					gtk_editable_set_position(GTK_EDITABLE(c->entry), t);
-				}
+				gtk_text_buffer_insert_at_cursor(c->entry_buffer, tmp, -1);
 				g_free(tmp);
 			} else {
-				int t = start;
-				gtk_editable_insert_text(GTK_EDITABLE(c->entry), nick, strlen(nick), &start);
-				if (t == start) {
-					t = start + strlen(nick);
-					gtk_editable_set_position(GTK_EDITABLE(c->entry), t);
-				}
+				gtk_text_buffer_insert_at_cursor(c->entry_buffer, nick, -1);
 			}
-			g_free(text);
+			g_free(entered);
 			return;
 		}
 
@@ -581,30 +585,27 @@
 	/* if there weren't any matches, return */
 	if (!matches) {
 		/* if matches isn't set partials won't be either */
-		g_free(text);
+		g_free(entered);
 		return;
 	}
 	
-	gtk_editable_delete_text(GTK_EDITABLE(c->entry), start, pos);
+	gtk_text_buffer_delete(c->entry_buffer, &word_start, &cursor);
 	if (!matches->next) {
 		/* there was only one match. fill it in. */
-		if (start == 0) {
+		gtk_text_buffer_get_start_iter(c->entry_buffer, &start_buffer);
+		gtk_text_buffer_get_iter_at_mark(c->entry_buffer, &cursor,
+						 gtk_text_buffer_get_insert(c->entry_buffer));
+		if (!gtk_text_iter_compare(&cursor, &start_buffer)) {
 			char *tmp = g_strdup_printf("%s: ", (char *)matches->data);
-			int t = start;
-			gtk_editable_insert_text(GTK_EDITABLE(c->entry), tmp, strlen(tmp), &start);
-			if (t == start) {
-				t = start + strlen(tmp);
-				gtk_editable_set_position(GTK_EDITABLE(c->entry), t);
-			}
+			gtk_text_buffer_insert_at_cursor(c->entry_buffer, tmp, -1);
 			g_free(tmp);
 		} else {
-			gtk_editable_insert_text(GTK_EDITABLE(c->entry), matches->data, strlen(matches->data), &start);
+			gtk_text_buffer_insert_at_cursor(c->entry_buffer, matches->data, -1);
 		}
 		matches = g_list_remove(matches, matches->data);
 	} else {
 		/* there were lots of matches, fill in as much as possible and display all of them */
 		char *addthis = g_malloc0(1);
-		int t = start;
 		while (matches) {
 			char *tmp = addthis;
 			addthis = g_strconcat(tmp, matches->data, " ", NULL);
@@ -612,15 +613,11 @@
 			matches = g_list_remove(matches, matches->data);
 		}
 		write_to_conv(c, addthis, WFLAG_NOLOG, NULL, time(NULL), -1);
-		gtk_editable_insert_text(GTK_EDITABLE(c->entry), partial, strlen(partial), &start);
-		if (t == start) {
-			t = start + strlen(partial);
-			gtk_editable_set_position(GTK_EDITABLE(c->entry), t);
-		}
+		gtk_text_buffer_insert_at_cursor(c->entry_buffer, partial, -1);
 		g_free(addthis);
 	}
-	
-	g_free(text);
+
+	g_free(entered);
 	g_free(partial);
 }
 
@@ -1180,6 +1177,8 @@
 	GtkWidget *win;
 	GtkWidget *cont;
 	GtkWidget *text;
+	/*GtkWidget *close;*/
+	GtkWidget *frame;
 	GtkWidget *chatentry;
 	GtkWidget *lbox;
 	GtkWidget *bbox;
@@ -1383,7 +1382,17 @@
 	gtk_paned_pack2(GTK_PANED(vpaned), vbox, TRUE, FALSE);
 	gtk_widget_show(vbox);
 
-	chatentry = gtk_text_new(NULL, NULL);
+	toolbar = build_conv_toolbar(b);
+	gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0);
+
+	frame = gtk_frame_new(NULL);
+	gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN);
+	gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(frame), TRUE, TRUE, 0);
+	gtk_widget_show(frame);
+	
+	b->entry_buffer = gtk_text_buffer_new(NULL);
+	g_object_set_data(G_OBJECT(b->entry_buffer), "user_data", b);
+	chatentry = gtk_text_view_new_with_buffer(b->entry_buffer);
 	b->entry = chatentry;
 	if (!(chat_options & OPT_CHAT_ONE_WINDOW))
 		gtk_window_set_focus(GTK_WINDOW(b->window), b->entry);
@@ -1391,23 +1400,18 @@
 
 	b->makesound = 1; /* Need to do this until we get a menu */
 
-	toolbar = build_conv_toolbar(b);
-	gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0);
-
-	gtk_object_set_user_data(GTK_OBJECT(chatentry), b);
-	gtk_text_set_editable(GTK_TEXT(chatentry), TRUE);
-	gtk_text_set_word_wrap(GTK_TEXT(chatentry), TRUE);
-	gtk_signal_connect(GTK_OBJECT(chatentry), "activate", GTK_SIGNAL_FUNC(send_callback), b);
-	gtk_signal_connect(GTK_OBJECT(chatentry), "key_press_event", GTK_SIGNAL_FUNC(keypress_callback),
-			   b);
-	gtk_signal_connect(GTK_OBJECT(chatentry), "key_press_event", GTK_SIGNAL_FUNC(entry_key_pressed),
-			   chatentry);
-	if (convo_options & OPT_CONVO_CHECK_SPELLING)
-		gtkspell_attach(GTK_TEXT(chatentry));
-	gtk_box_pack_start(GTK_BOX(vbox), chatentry, TRUE, TRUE, 0);
+	gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(b->entry), GTK_WRAP_WORD);
+	g_signal_connect(G_OBJECT(b->entry), "key_press_event", G_CALLBACK(keypress_callback), b);
+	g_signal_connect_after(G_OBJECT(b->entry), "button_press_event", 
+			       G_CALLBACK(stop_rclick_callback), NULL);
+	g_signal_connect_swapped(G_OBJECT(chatentry), "key_press_event", 
+				 G_CALLBACK(entry_key_pressed), chatentry);
+	gtk_container_add(GTK_CONTAINER(frame), GTK_WIDGET(chatentry));
 	gtk_widget_set_usize(chatentry, buddy_chat_size.width, MAX(buddy_chat_size.entry_height, 25));
 	gtk_window_set_focus(GTK_WINDOW(win), chatentry);
 	gtk_widget_show(chatentry);
+	/*if (convo_options & OPT_CONVO_CHECK_SPELLING)
+		gtkspell_attach(GTK_TEXT(chatentry));*/
 
 	bbox = gtk_hbox_new(FALSE, 5);
 	gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0);