SF.net SVN: geany-plugins:[300] trunk/spellcheck

eht16 at users.sourceforge.net eht16 at xxxxx
Sat Nov 15 18:38:32 UTC 2008


Revision: 300
          http://geany-plugins.svn.sourceforge.net/geany-plugins/?rev=300&view=rev
Author:   eht16
Date:     2008-11-15 18:38:31 +0000 (Sat, 15 Nov 2008)

Log Message:
-----------
Remove SpellClickInfo::suggs and retrieve the suggestion text from the menu item label directly.
Remove the limit of showing a maximum of 10 suggestions, instead add sub menus for more suggestions if available, similar to what 'gtkspell' does.

Modified Paths:
--------------
    trunk/spellcheck/ChangeLog
    trunk/spellcheck/src/gui.c

Modified: trunk/spellcheck/ChangeLog
===================================================================
--- trunk/spellcheck/ChangeLog	2008-11-15 17:59:17 UTC (rev 299)
+++ trunk/spellcheck/ChangeLog	2008-11-15 18:38:31 UTC (rev 300)
@@ -5,6 +5,12 @@
    replacement to the spell checker to remember it in further checks.
  * src/gui.c, src/scplugin.c, src/speller.c, src/gui.h, src/scplugin.h:
    Move SpellClickInfo struct into gui.c.
+ * src/gui.c:
+   Remove SpellClickInfo::suggs and retrieve the suggestion text from
+   the menu item label directly.
+   Remove the limit of showing a maximum of 10 suggestions, instead
+   add sub menus for more suggestions if available, similar to what
+   'gtkspell' does.
 
 
 2008-11-12  Enrico Tröger  <enrico(dot)troeger(at)uvena(dot)de>

Modified: trunk/spellcheck/src/gui.c
===================================================================
--- trunk/spellcheck/src/gui.c	2008-11-15 17:59:17 UTC (rev 299)
+++ trunk/spellcheck/src/gui.c	2008-11-15 18:38:31 UTC (rev 300)
@@ -45,14 +45,10 @@
 
 
 
-#define MAX_MENU_SUGGESTIONS 10
-
 typedef struct
 {
 	gint pos;
 	GeanyDocument *doc;
-	/* static array to keep suggestions for use as callback user data for the editing menu items */
-	gchar *suggs[MAX_MENU_SUGGESTIONS];
 	/* static storage for the misspelled word under the cursor when using the editing menu */
 	gchar *word;
 } SpellClickInfo;
@@ -150,15 +146,11 @@
 
 static void menu_suggestion_item_activate_cb(GtkMenuItem *menuitem, gpointer gdata)
 {
-	gchar *sugg = gdata;
+	const gchar *sugg;
 	gint startword, endword;
 	ScintillaObject *sci = clickinfo.doc->editor->sci;
 
-	if (clickinfo.doc == NULL || clickinfo.pos == -1)
-	{
-		g_free(sugg);
-		return;
-	}
+	g_return_if_fail(clickinfo.doc != NULL && clickinfo.pos != -1);
 
 	startword = p_sci->send_message(sci, SCI_WORDSTARTPOSITION, clickinfo.pos, 0);
 	endword = p_sci->send_message(sci, SCI_WORDENDPOSITION, clickinfo.pos, 0);
@@ -174,6 +166,9 @@
 		word = g_malloc(p_sci->get_selected_text_length(sci) + 1);
 		p_sci->get_selected_text(sci, word);
 
+		/* retrieve the new text */
+		sugg = gtk_label_get_text(GTK_LABEL(GTK_BIN(menuitem)->child));
+
 		/* replace the misspelled word with the chosen suggestion */
 		p_sci->replace_sel(sci, sugg);
 
@@ -235,7 +230,7 @@
 							   GeanyDocument *doc, gpointer user_data)
 {
 	gsize n_suggs, i;
-	gchar **tmp_suggs;
+	gchar **suggs;
 
 	g_return_if_fail(doc != NULL && doc->is_valid);
 
@@ -254,35 +249,42 @@
 	if (! NZV(word) || speller_dict_check(word) == 0)
 		return;
 
-	tmp_suggs = speller_dict_suggest(word, &n_suggs);
+	suggs = speller_dict_suggest(word, &n_suggs);
 
-	if (tmp_suggs != NULL)
+	if (suggs != NULL)
 	{
-		GtkWidget *menu_item, *image;
+		GtkWidget *menu_item, *menu, *image;
 		gchar *label;
 
 		clickinfo.pos = pos;
 		clickinfo.doc = doc;
 		setptr(clickinfo.word, g_strdup(word));
 
-		if (GTK_IS_WIDGET(sc->edit_menu_sub))
+		if (sc->edit_menu_sub != NULL && GTK_IS_WIDGET(sc->edit_menu_sub))
 			gtk_widget_destroy(sc->edit_menu_sub);
 
-		sc->edit_menu_sub = gtk_menu_new();
+		sc->edit_menu_sub = menu = gtk_menu_new();
 		gtk_menu_item_set_submenu(GTK_MENU_ITEM(sc->edit_menu), sc->edit_menu_sub);
 
-		/* TODO do we need more than 10 suggestions? gtkspell offers additional suggestions
-		 * in another sub menu, should we too? */
-		for (i = 0; i < MIN(n_suggs, MAX_MENU_SUGGESTIONS); i++)
+		for (i = 0; i < n_suggs; i++)
 		{
-			/* keep the suggestions in a static array for the callback function */
-			g_free(clickinfo.suggs[i]);
-			clickinfo.suggs[i] = g_strdup(tmp_suggs[i]);
+			if (i > 0 && i % 10 == 0)
+			{
+				menu_item = gtk_menu_item_new();
+				gtk_widget_show(menu_item);
+				gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item);
 
-			menu_item = gtk_menu_item_new_with_label(clickinfo.suggs[i]);
-			gtk_container_add(GTK_CONTAINER(sc->edit_menu_sub), menu_item);
+				menu_item = gtk_menu_item_new_with_label(_("More..."));
+				gtk_widget_show(menu_item);
+				gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item);
+
+				menu = gtk_menu_new();
+				gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), menu);
+			}
+			menu_item = gtk_menu_item_new_with_label(suggs[i]);
+			gtk_container_add(GTK_CONTAINER(menu), menu_item);
 			g_signal_connect((gpointer) menu_item, "activate",
-				G_CALLBACK(menu_suggestion_item_activate_cb), clickinfo.suggs[i]);
+				G_CALLBACK(menu_suggestion_item_activate_cb), NULL);
 		}
 		menu_item = gtk_separator_menu_item_new();
 		gtk_container_add(GTK_CONTAINER(sc->edit_menu_sub), menu_item);
@@ -307,7 +309,7 @@
 		gtk_widget_show(sc->edit_menu_sep);
 		gtk_widget_show_all(sc->edit_menu_sub);
 
-		speller_dict_free_string_list(tmp_suggs);
+		speller_dict_free_string_list(suggs);
 
 		g_free(label);
 	}
@@ -454,23 +456,11 @@
 
 void gui_init(void)
 {
-	guint i;
-
-	for (i = 0; i < MAX_MENU_SUGGESTIONS; i++)
-	{
-		clickinfo.suggs[i] = NULL;
-	}
 	clickinfo.word = NULL;
 }
 
 
 void gui_free(void)
 {
-	guint i;
-
-	for (i = 0; i < MAX_MENU_SUGGESTIONS; i++)
-	{
-		g_free(clickinfo.suggs[i]);
-	}
 	g_free(clickinfo.word);
 }


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.



More information about the Plugins-Commits mailing list