예제 #1
0
static gint sc_speller_check_word(GeanyDocument *doc, gint line_number, const gchar *word,
						   gint start_pos, gint end_pos)
{
	gsize n_suggs = 0;

	g_return_val_if_fail(sc_speller_dict != NULL, 0);
	g_return_val_if_fail(doc != NULL, 0);
	g_return_val_if_fail(word != NULL, 0);
	g_return_val_if_fail(start_pos >= 0 && end_pos >= 0, 0);

	if (! NZV(word))
		return 0;

	/* ignore numbers or words starting with digits */
	if (isdigit(*word))
		return 0;

	/* ignore non-text */
	if (! sc_speller_is_text(doc, start_pos))
		return 0;

	/* early out if the word is spelled correctly */
	if (enchant_dict_check(sc_speller_dict, word, -1) == 0)
		return 0;

	editor_indicator_set_on_range(doc->editor, GEANY_INDICATOR_ERROR, start_pos, end_pos);

	if (sc_info->use_msgwin && line_number != -1)
	{
		gsize j;
		gchar **suggs;
		GString *str;

		str = g_string_sized_new(256);
		suggs = enchant_dict_suggest(sc_speller_dict, word, -1, &n_suggs);
		if (suggs != NULL)
		{
			g_string_append_printf(str, "line %d: %s | ",  line_number + 1, word);

			g_string_append(str, _("Try: "));

			/* Now find the misspellings in the line, limit suggestions to a maximum of 15 (for now) */
			for (j = 0; j < MIN(n_suggs, 15); j++)
			{
				g_string_append(str, suggs[j]);
				g_string_append_c(str, ' ');
			}

			msgwin_msg_add(COLOR_RED, line_number + 1, doc, "%s", str->str);

			if (suggs != NULL && n_suggs > 0)
				enchant_dict_free_string_list(sc_speller_dict, suggs);
		}
		g_string_free(str, TRUE);
	}

	return n_suggs;
}
예제 #2
0
void sc_gui_update_editor_menu_cb(GObject *obj, const gchar *word, gint pos,
                                  GeanyDocument *doc, gpointer user_data)
{
    gchar *search_word;

    g_return_if_fail(doc != NULL && doc->is_valid);

    /* hide the submenu in any case, we will reshow it again if we actually found something */
    gtk_widget_hide(sc_info->edit_menu);
    gtk_widget_hide(sc_info->edit_menu_sep);

    if (! sc_info->show_editor_menu_item)
        return;

    /* if we have a selection, prefer it over the current word */
    if (sci_has_selection(doc->editor->sci))
    {
        gint len = sci_get_selected_text_length(doc->editor->sci);
        search_word = g_malloc(len + 1);
        sci_get_selected_text(doc->editor->sci, search_word);
    }
    else
        search_word = g_strdup(word);

    /* ignore numbers or words starting with digits and non-text */
    if (EMPTY(search_word) || isdigit(*search_word) || ! sc_speller_is_text(doc, pos))
    {
        g_free(search_word);
        return;
    }

    /* ignore too long search words */
    if (strlen(search_word) > 100)
    {
        GtkWidget *menu_item;

        init_editor_submenu();
        menu_item = gtk_menu_item_new_with_label(
                        _("Search term is too long to provide\nspelling suggestions in the editor menu."));
        gtk_widget_set_sensitive(menu_item, FALSE);
        gtk_widget_show(menu_item);
        gtk_container_add(GTK_CONTAINER(sc_info->edit_menu_sub), menu_item);

        menu_item = gtk_menu_item_new_with_label(_("Perform Spell Check"));
        gtk_widget_show(menu_item);
        gtk_container_add(GTK_CONTAINER(sc_info->edit_menu_sub), menu_item);
        g_signal_connect(menu_item, "activate", G_CALLBACK(perform_spell_check_cb), doc);

        g_free(search_word);
        return;
    }

    if (sc_speller_dict_check(search_word) != 0)
    {
        GtkWidget *menu_item, *menu;
        gchar *label;
        gsize n_suggs, i;
        gchar **suggs;

        suggs = sc_speller_dict_suggest(search_word, &n_suggs);

        clickinfo.pos = pos;
        clickinfo.doc = doc;
        setptr(clickinfo.word, search_word);

        menu = init_editor_submenu();

        for (i = 0; i < n_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(_("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_widget_show(menu_item);
            gtk_container_add(GTK_CONTAINER(menu), menu_item);
            g_signal_connect(menu_item, "activate",
                             G_CALLBACK(menu_suggestion_item_activate_cb), NULL);
        }
        if (suggs == NULL)
        {
            menu_item = gtk_menu_item_new_with_label(_("(No Suggestions)"));
            gtk_widget_set_sensitive(menu_item, FALSE);
            gtk_widget_show(menu_item);
            gtk_container_add(GTK_CONTAINER(sc_info->edit_menu_sub), menu_item);
        }
        menu_item = gtk_separator_menu_item_new();
        gtk_widget_show(menu_item);
        gtk_container_add(GTK_CONTAINER(sc_info->edit_menu_sub), menu_item);

        label = g_strdup_printf(_("Add \"%s\" to Dictionary"), search_word);
        menu_item = image_menu_item_new(GTK_STOCK_ADD, label);
        gtk_widget_show(menu_item);
        gtk_container_add(GTK_CONTAINER(sc_info->edit_menu_sub), menu_item);
        g_signal_connect(menu_item, "activate",
                         G_CALLBACK(menu_addword_item_activate_cb), GINT_TO_POINTER(FALSE));

        menu_item = image_menu_item_new(GTK_STOCK_REMOVE, _("Ignore All"));
        gtk_widget_show(menu_item);
        gtk_container_add(GTK_CONTAINER(sc_info->edit_menu_sub), menu_item);
        g_signal_connect(menu_item, "activate",
                         G_CALLBACK(menu_addword_item_activate_cb), GINT_TO_POINTER(TRUE));

        if (suggs != NULL)
            sc_speller_dict_free_string_list(suggs);

        g_free(label);
    }
    else
    {
        g_free(search_word);
    }
}