From dc04c9c3fa6c5dd075f2f1c0853ab1213b02f92c Mon Sep 17 00:00:00 2001 From: Jon Trowbridge Date: Tue, 5 Jun 2001 17:46:56 +0000 Subject: Small changes throughout to use ECompletionMatch. 2001-06-05 Jon Trowbridge * gal/e-text/e-entry.c: Small changes throughout to use ECompletionMatch. * gal/e-text/e-completion-view.c: Small changes throughout to use ECompletionMatch. * gal/e-text/e-completion.c: Small changes throughout to use ECompletionMatch. * gal/e-text/e-completion-match.h: * gal/e-text/e-completion-match.c: Added. A struct to contain completion matches. This lets us more easily pass around information between the various bits of completion machinery. svn path=/trunk/; revision=10118 --- widgets/text/e-completion-match.c | 184 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100644 widgets/text/e-completion-match.c (limited to 'widgets/text/e-completion-match.c') diff --git a/widgets/text/e-completion-match.c b/widgets/text/e-completion-match.c new file mode 100644 index 0000000000..e00d5c8bdb --- /dev/null +++ b/widgets/text/e-completion-match.c @@ -0,0 +1,184 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ + +/* + * e-completion-match.c + * + * Copyright (C) 2001 Ximian, Inc. + * + * Developed by Jon Trowbridge + */ + +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA. + */ + +#include +#include +#include +#include "e-completion-match.h" + +static void +e_completion_match_destroy (ECompletionMatch *match) +{ + if (match) { + g_free (match->match_text); + g_free (match->menu_text); + if (match->destroy) + match->destroy (match); + g_free (match); + } +} + +void +e_completion_match_construct (ECompletionMatch *match) +{ + g_return_if_fail (match != NULL); + + match->match_text = NULL; + match->menu_text = NULL; + match->score = 0; + match->sort_major = 0; + match->sort_minor = 0; + match->user_data = NULL; + match->ref = 1; + match->destroy = NULL; +} + +void +e_completion_match_ref (ECompletionMatch *match) +{ + g_return_if_fail (match != NULL); + g_return_if_fail (match->ref > 0); + + ++match->ref; +} + +void +e_completion_match_unref (ECompletionMatch *match) +{ + g_return_if_fail (match != NULL); + g_return_if_fail (match->ref > 0); + + --match->ref; + if (match->ref == 0) { + e_completion_match_destroy (match); + } +} + +void +e_completion_match_set_text (ECompletionMatch *match, + const gchar *match_text, + const gchar *menu_text) +{ + g_return_if_fail (match != NULL); + + g_free (match->match_text); + g_free (match->menu_text); + + if (match_text == NULL) { + match_text = "Unknown_Match"; + } else if (! g_utf8_validate (match_text, 0, NULL)) { + match_text = "Invalid_UTF8"; + } + + if (menu_text == NULL) { + menu_text = match_text; + } else if (! g_utf8_validate (menu_text, 0, NULL)) { + menu_text = "Invalid_UTF8"; + } + + match->match_text = g_strdup (match_text); + match->menu_text = g_strdup (menu_text); +} + +const gchar * +e_completion_match_get_match_text (ECompletionMatch *match) +{ + return match ? match->match_text : "NULL_Match"; +} + +const gchar * +e_completion_match_get_menu_text (ECompletionMatch *match) +{ + return match ? match->menu_text : "NULL_Match"; +} + +gint +e_completion_match_compare (const ECompletionMatch *a, const ECompletionMatch *b) +{ + gint rv; + + /* Deal with NULL arguments. */ + if (!(a || b)) { + if (!(a && b)) + return 0; + return a ? -1 : 1; + } + + /* Sort the scores high->low. */ + if ( (rv = (b->score > a->score) - (a->score > b->score)) ) + return rv; + + if ( (rv = (b->sort_major < a->sort_major) - (a->sort_major < b->sort_major)) ) + return rv; + + if ( (rv = (b->sort_minor < a->sort_minor) - (a->sort_minor < b->sort_minor)) ) + return rv; + + return 0; +} + +/* Copied from the above, with one addition. */ +gint +e_completion_match_compare_alpha (const ECompletionMatch *a, const ECompletionMatch *b) +{ + gint rv; + + /* Deal with NULL arguments. */ + if (!(a || b)) { + if (!(a && b)) + return 0; + return a ? -1 : 1; + } + + /* Sort the scores high->low. */ + if ( (rv = (b->score > a->score) - (a->score > b->score)) ) + return rv; + + /* Consider the menu text in the sort. */ + if ( (rv = strcmp (a->menu_text, b->menu_text)) ) + return rv; + + if ( (rv = (b->sort_major < a->sort_major) - (a->sort_major < b->sort_major)) ) + return rv; + + if ( (rv = (b->sort_minor < a->sort_minor) - (a->sort_minor < b->sort_minor)) ) + return rv; + + return 0; +} + +ECompletionMatch * +e_completion_match_new (const gchar *match_text, const gchar *menu_text, double score) +{ + ECompletionMatch *match = g_new0 (ECompletionMatch, 1); + + e_completion_match_construct (match); + e_completion_match_set_text (match, match_text, menu_text); + match->score = score; + + return match; +} -- cgit v1.2.3