2001-10-26 Christopher James Lahey <clahey@ximian.com> * gal/e-paned/e-hpaned.c, gal/e-paned/e-hpaned.h, gal/e-paned/e-paned.c, gal/e-paned/e-paned.h, gal/e-paned/e-vpaned.c, gal/e-paned/e-vpaned.h, gal/e-text/e-completion-match.c, gal/e-text/e-completion-match.h, gal/e-text/e-completion-test.c, gal/e-text/e-completion-view.c, gal/e-text/e-completion-view.h, gal/e-text/e-completion.c, gal/e-text/e-completion.h, gal/e-text/e-entry-test.c, gal/e-text/e-entry.c, gal/e-text/e-entry.h, gal/e-text/e-table-text-model.c, gal/e-text/e-table-text-model.h, gal/e-text/e-text-model-repos.c, gal/e-text/e-text-model-repos.h, gal/e-text/e-text-model-test.c, gal/e-text/e-text-model-uri.c, gal/e-text/e-text-model-uri.h, gal/e-text/e-text-model.c, gal/e-text/e-text-model.h, gal/e-text/e-text.c, gal/e-text/e-text.h, gal/util/e-bit-array.c, gal/util/e-bit-array.h, gal/util/e-cache.c, gal/util/e-cache.h, gal/util/e-iconv.c, gal/util/e-iconv.h, gal/util/e-sorter-array.c, gal/util/e-sorter-array.h, gal/util/e-sorter.c, gal/util/e-sorter.h, gal/util/e-text-event-processor-emacs-like.c, gal/util/e-text-event-processor-emacs-like.h, gal/util/e-text-event-processor-types.h, gal/util/e-text-event-processor.c, gal/util/e-text-event-processor.h, gal/util/e-util.c, gal/util/e-util.h, gal/util/e-xml-utils.c, gal/util/e-xml-utils.h, gal/widgets/color-group.c, gal/widgets/color-group.h, gal/widgets/color-palette.c, gal/widgets/color-palette.h, gal/widgets/e-canvas-utils.c, gal/widgets/e-canvas-utils.h, gal/widgets/e-canvas-vbox.c, gal/widgets/e-canvas-vbox.h, gal/widgets/e-canvas.c, gal/widgets/e-canvas.h, gal/widgets/e-categories-master-list-array.c, gal/widgets/e-categories-master-list-array.h, gal/widgets/e-categories-master-list-combo.c, gal/widgets/e-categories-master-list-combo.h, gal/widgets/e-categories-master-list-dialog-model.c, gal/widgets/e-categories-master-list-dialog-model.h, gal/widgets/e-categories-master-list-dialog.c, gal/widgets/e-categories-master-list-dialog.h, gal/widgets/e-categories-master-list.c, gal/widgets/e-categories-master-list.h, gal/widgets/e-categories.c, gal/widgets/e-categories.h, gal/widgets/e-colors.c, gal/widgets/e-colors.h, gal/widgets/e-cursors.c, gal/widgets/e-cursors.h, gal/widgets/e-font.c, gal/widgets/e-font.h, gal/widgets/e-gui-utils.c, gal/widgets/e-gui-utils.h, gal/widgets/e-hscrollbar.c, gal/widgets/e-hscrollbar.h, gal/widgets/e-popup-menu.c, gal/widgets/e-popup-menu.h, gal/widgets/e-printable.c, gal/widgets/e-printable.h, gal/widgets/e-reflow-model.c, gal/widgets/e-reflow-model.h, gal/widgets/e-reflow-sorted.c, gal/widgets/e-reflow-sorted.h, gal/widgets/e-reflow.c, gal/widgets/e-reflow.h, gal/widgets/e-scroll-frame.c, gal/widgets/e-scroll-frame.h, gal/widgets/e-selection-model-array.c, gal/widgets/e-selection-model-array.h, gal/widgets/e-selection-model-simple.c, gal/widgets/e-selection-model-simple.h, gal/widgets/e-selection-model.c, gal/widgets/e-selection-model.h, gal/widgets/e-unicode.c, gal/widgets/e-unicode.h, gal/widgets/e-vscrollbar.c, gal/widgets/e-vscrollbar.h, gal/widgets/gtk-combo-box.c, gal/widgets/gtk-combo-box.h, gal/widgets/gtk-combo-stack.c, gal/widgets/gtk-combo-stack.h, gal/widgets/gtk-combo-text.c, gal/widgets/gtk-combo-text.h, gal/widgets/test-color.c, gal/widgets/test-e-font.c, gal/widgets/test-e-font.h, gal/widgets/test-font-loading.c, gal/widgets/widget-color-combo.c, gal/widgets/widget-color-combo.h, gal/widgets/widget-pixmap-combo.c, gal/widgets/widget-pixmap-combo.h, src/e-table/e-table-sorted-variable.c, tests/test-define-views.c, tests/test-shortcut-bar.c, tests/test-table-1.c, tests/test-tree-1.c, tests/test-tree-2.c, tests/test-tree-3.c, tests/test-unicode.c: Changed the license announcement at the top of these files. svn path=/trunk/; revision=14158
221 lines
5.0 KiB
C
221 lines
5.0 KiB
C
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
|
|
/*
|
|
* e-completion-test.c
|
|
* Copyright 2000, 2001, Ximian, Inc.
|
|
*
|
|
* Authors:
|
|
* Jon Trowbridge <trow@ximian.com>
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Library General Public
|
|
* License, version 2, as published by the Free Software Foundation.
|
|
*
|
|
* This library 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
|
|
* Library General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Library General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
* 02111-1307, USA.
|
|
*/
|
|
|
|
#include <gnome.h>
|
|
#include "e-completion.h"
|
|
#include "e-entry.h"
|
|
|
|
#define TIMEOUT 10
|
|
|
|
/* Dictionary Lookup test */
|
|
|
|
static gint word_count = 0;
|
|
static gchar **word_array = NULL;
|
|
|
|
static void
|
|
read_dict (void)
|
|
{
|
|
FILE *in = fopen ("/usr/share/dict/words", "r");
|
|
gchar buffer[128];
|
|
GList *word_list = NULL, *iter;
|
|
gint i;
|
|
|
|
while (fgets (buffer, 128, in)) {
|
|
gint len = strlen (buffer);
|
|
if (len > 0 && buffer[len-1] == '\n')
|
|
buffer[len-1] = '\0';
|
|
word_list = g_list_prepend (word_list, g_strdup (buffer));
|
|
++word_count;
|
|
}
|
|
fclose (in);
|
|
|
|
word_array = g_new (gchar *, word_count);
|
|
i = word_count-1;
|
|
for (iter = word_list; iter != NULL; iter = g_list_next (iter)) {
|
|
word_array[i] = (gchar *)iter->data;
|
|
--i;
|
|
}
|
|
}
|
|
|
|
static gint
|
|
find_word (const gchar *str)
|
|
{
|
|
gint a, b;
|
|
|
|
if (word_array == NULL)
|
|
read_dict ();
|
|
|
|
a = 0;
|
|
b = word_count-1;
|
|
|
|
while (b-a > 1) {
|
|
gint m = (a+b)/2;
|
|
gint cmp = g_strcasecmp (str, word_array[m]);
|
|
|
|
if (cmp < 0)
|
|
b = m;
|
|
else if (cmp > 0)
|
|
a = m;
|
|
else
|
|
return m;
|
|
}
|
|
|
|
return b;
|
|
}
|
|
|
|
struct {
|
|
ECompletion *complete;
|
|
const gchar *txt;
|
|
gint start;
|
|
gint current;
|
|
gint len;
|
|
gint limit;
|
|
gint count;
|
|
} dict_info;
|
|
static guint dict_tag = 0;
|
|
|
|
static gboolean
|
|
dict_check (gpointer ptr)
|
|
{
|
|
gint limit = dict_info.limit;
|
|
gint i;
|
|
|
|
/* If this is the first iteration, do the binary search in our word list to figure out
|
|
where to start. We do less work on the first iteration, to give more of a sense of
|
|
immediate feedback. */
|
|
if (dict_info.start < 0) {
|
|
dict_info.start = dict_info.current = find_word (dict_info.txt);
|
|
}
|
|
|
|
i = dict_info.current;
|
|
while (limit > 0
|
|
&& i < word_count
|
|
&& dict_info.count < 50
|
|
&& g_strncasecmp (dict_info.txt, word_array[i], dict_info.len) == 0) {
|
|
|
|
ECompletionMatch *match = g_new (ECompletionMatch, 1);
|
|
e_completion_match_construct (match);
|
|
e_completion_match_set_text (match, word_array[i], NULL);
|
|
match->score = dict_info.len / (double)strlen (word_array[i]);
|
|
e_completion_found_match (dict_info.complete, match);
|
|
|
|
++i;
|
|
--limit;
|
|
++dict_info.count;
|
|
}
|
|
dict_info.current = i;
|
|
dict_info.limit = MIN (dict_info.limit*2, 400);
|
|
|
|
if (limit != 0) {
|
|
dict_tag = 0;
|
|
e_completion_end_search (dict_info.complete);
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
static void
|
|
request_dict_search (ECompletion *complete, const gchar *txt, gint pos, gint limit, gpointer user_data)
|
|
{
|
|
gint len = strlen (txt);
|
|
|
|
if (dict_tag != 0) {
|
|
gtk_timeout_remove (dict_tag);
|
|
dict_tag = 0;
|
|
}
|
|
|
|
if (len > 0) {
|
|
dict_info.complete = complete;
|
|
dict_info.txt = txt;
|
|
dict_info.start = -1;
|
|
dict_info.current = -1;
|
|
dict_info.len = len;
|
|
dict_info.limit = 100;
|
|
dict_info.count = 0;
|
|
dict_tag = gtk_timeout_add (TIMEOUT, dict_check, NULL);
|
|
} else {
|
|
e_completion_end_search (complete);
|
|
}
|
|
}
|
|
|
|
static void
|
|
end_dict_search (ECompletion *complete, gpointer user_data)
|
|
{
|
|
if (dict_tag != 0) {
|
|
gtk_timeout_remove (dict_tag);
|
|
dict_tag = 0;
|
|
}
|
|
}
|
|
|
|
static void
|
|
popup_cb (EEntry *popup, GdkEventButton *ev, gint pos, gpointer user_data)
|
|
{
|
|
g_print ("popup at pos %d\n", pos);
|
|
}
|
|
|
|
int
|
|
main (int argc, gchar **argv)
|
|
{
|
|
ECompletion* complete;
|
|
GtkWidget *entry;
|
|
GtkWidget *win;
|
|
|
|
gnome_init ("ETextModelTest", "0.0", argc, argv);
|
|
|
|
read_dict ();
|
|
|
|
complete = e_completion_new ();
|
|
gtk_signal_connect (GTK_OBJECT (complete),
|
|
"request_completion",
|
|
GTK_SIGNAL_FUNC (request_dict_search),
|
|
NULL);
|
|
gtk_signal_connect (GTK_OBJECT (complete),
|
|
"end_completion",
|
|
GTK_SIGNAL_FUNC (end_dict_search),
|
|
NULL);
|
|
gtk_signal_connect (GTK_OBJECT (complete),
|
|
"cancel_completion",
|
|
GTK_SIGNAL_FUNC (end_dict_search),
|
|
NULL);
|
|
|
|
win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
|
|
entry = e_entry_new ();
|
|
e_entry_enable_completion_full (E_ENTRY (entry), complete, 0, NULL);
|
|
e_entry_set_editable (E_ENTRY (entry), TRUE);
|
|
|
|
gtk_signal_connect (GTK_OBJECT (entry),
|
|
"popup",
|
|
GTK_SIGNAL_FUNC (popup_cb),
|
|
NULL);
|
|
|
|
gtk_container_add (GTK_CONTAINER (win), entry);
|
|
gtk_widget_show_all (win);
|
|
|
|
gtk_main ();
|
|
|
|
return 0;
|
|
}
|