diff options
author | Mikael Hallendal <micke@codefactory.se> | 2002-03-02 00:53:05 +0000 |
---|---|---|
committer | Mikael Hallendal <hallski@src.gnome.org> | 2002-03-02 00:53:05 +0000 |
commit | 0bcf62c77c87db2d2fe00e7ea7eb333f685db267 (patch) | |
tree | d4ef2b8cc71152da9ad131a961546645ace8680b | |
parent | 0c38a619d7dc0bf81cafa5eb5faedc1127fe0a99 (diff) | |
download | yelp-0bcf62c77c87db2d2fe00e7ea7eb333f685db267.tar.gz |
- in-the-middle-commit on index search stuff. (yvi_entry_changed_cb):
2002-03-02 Mikael Hallendal <micke@codefactory.se>
* src/yelp-view-index.c:
- in-the-middle-commit on index search stuff.
(yvi_entry_changed_cb): added
(yvi_entry_activated_cb): added
(yvi_entry_text_inserted_cb): added
(yvi_search): added
(yvi_complete_idle): added
(yvi_complete_func): added
(yelp_view_index_new): connect to signals in the entry.
* src/yelp-scrollkeeper.c: removed debug variable.
* src/yelp-index-model.[ch]: added model for the index.
* configure.in: added compile warnings.
Please don't report problems running/building Yelp after this commit, I'm in the middle of hacking and will finish this during the weekend.
-rw-r--r-- | ChangeLog | 18 | ||||
-rw-r--r-- | configure.in | 2 | ||||
-rw-r--r-- | src/Makefile.am | 1 | ||||
-rw-r--r-- | src/yelp-index-model.c | 388 | ||||
-rw-r--r-- | src/yelp-index-model.h | 57 | ||||
-rw-r--r-- | src/yelp-scrollkeeper.c | 4 | ||||
-rw-r--r-- | src/yelp-view-index.c | 143 |
7 files changed, 599 insertions, 14 deletions
@@ -1,3 +1,21 @@ +2002-03-02 Mikael Hallendal <micke@codefactory.se> + + * src/yelp-view-index.c: + - in-the-middle-commit on index search stuff. + (yvi_entry_changed_cb): added + (yvi_entry_activated_cb): added + (yvi_entry_text_inserted_cb): added + (yvi_search): added + (yvi_complete_idle): added + (yvi_complete_func): added + (yelp_view_index_new): connect to signals in the entry. + + * src/yelp-scrollkeeper.c: removed debug variable. + + * src/yelp-index-model.[ch]: added model for the index. + + * configure.in: added compile warnings. + 2002-02-28 Mikael Hallendal <micke@codefactory.se> * src/yelp-window.c: diff --git a/configure.in b/configure.in index 038be5ef..0f35c73c 100644 --- a/configure.in +++ b/configure.in @@ -5,6 +5,8 @@ AM_INIT_AUTOMAKE(yelp, 0.2.99) AC_PROG_INTLTOOL AM_MAINTAINER_MODE +GNOME_COMMON_INIT +GNOME_COMPILE_WARNINGS(maximum) AC_PROG_CC AC_ISC_POSIX diff --git a/src/Makefile.am b/src/Makefile.am index 3563b1b4..68b17088 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -31,6 +31,7 @@ yelp_SOURCES = \ yelp-base.c yelp-base.h \ yelp-history.c yelp-history.h \ yelp-html.c yelp-html.h \ + yelp-index-model.c yelp-index-model.h \ yelp-info.c yelp-info.h \ yelp-main.c \ yelp-man.c yelp-man.h \ diff --git a/src/yelp-index-model.c b/src/yelp-index-model.c new file mode 100644 index 00000000..1605dfcf --- /dev/null +++ b/src/yelp-index-model.c @@ -0,0 +1,388 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2002 CodeFactory AB + * Copyright (C) 2002 Richard Hult <rhult@codefactory.se> + * Copyright (C) 2002 Mikael Hallendal <micke@codefactory.se> + * + * 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 <gtk/gtktreemodel.h> +#include <libgnome/gnome-i18n.h> +#include "yelp-section.h" +#include "yelp-index-model.h" + +struct _YelpIndexModelPriv { + GList *index_words; + + gint stamp; +}; + +#define G_LIST(x) ((GList *) x) + +static void yim_init (YelpIndexModel *list_store); +static void yim_class_init (YelpIndexModelClass *class); +static void yim_tree_model_init (GtkTreeModelIface *iface); + + +static void yim_finalize (GObject *object); +static gint yim_get_n_columns (GtkTreeModel *tree_model); +static GType yim_get_column_type (GtkTreeModel *tree_model, + gint index); + +static gboolean yim_get_iter (GtkTreeModel *tree_model, + GtkTreeIter *iter, + GtkTreePath *path); +static GtkTreePath * yim_get_path (GtkTreeModel *tree_model, + GtkTreeIter *iter); +static void yim_get_value (GtkTreeModel *tree_model, + GtkTreeIter *iter, + gint column, + GValue *value); +static gboolean yim_iter_next (GtkTreeModel *tree_model, + GtkTreeIter *iter); +static gboolean yim_iter_children (GtkTreeModel *tree_model, + GtkTreeIter *iter, + GtkTreeIter *parent); +static gboolean yim_iter_has_child (GtkTreeModel *tree_model, + GtkTreeIter *iter); +static gint yim_iter_n_children (GtkTreeModel *tree_model, + GtkTreeIter *iter); +static gboolean yim_iter_nth_child (GtkTreeModel *tree_model, + GtkTreeIter *iter, + GtkTreeIter *parent, + gint n); +static gboolean yim_iter_parent (GtkTreeModel *tree_model, + GtkTreeIter *iter, + GtkTreeIter *child); + +static GObjectClass *parent_class = NULL; + + +GtkType +yelp_index_model_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = + { + sizeof (YelpIndexModelClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc) yim_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (YelpIndexModel), + 0, + (GInstanceInitFunc) yim_init, + }; + + static const GInterfaceInfo tree_model_info = + { + (GInterfaceInitFunc) yim_tree_model_init, + NULL, + NULL + }; + + type = g_type_register_static (G_TYPE_OBJECT, + "YelpIndexModel", + &info, 0); + + g_type_add_interface_static (type, + GTK_TYPE_TREE_MODEL, + &tree_model_info); + } + + return type; +} + +static void +yim_class_init (YelpIndexModelClass *class) +{ + GObjectClass *object_class; + + parent_class = g_type_class_peek_parent (class); + object_class = (GObjectClass*) class; + + object_class->finalize = yim_finalize; +} + +static void +yim_tree_model_init (GtkTreeModelIface *iface) +{ +/* iface->get_flags = yim_get_flags; */ + iface->get_n_columns = yim_get_n_columns; + iface->get_column_type = yim_get_column_type; + iface->get_iter = yim_get_iter; + iface->get_path = yim_get_path; + iface->get_value = yim_get_value; + iface->iter_next = yim_iter_next; + iface->iter_children = yim_iter_children; + iface->iter_has_child = yim_iter_has_child; + iface->iter_n_children = yim_iter_n_children; + iface->iter_nth_child = yim_iter_nth_child; + iface->iter_parent = yim_iter_parent; +} + +static void +yim_init (YelpIndexModel *model) +{ + YelpIndexModelPriv *priv; + + priv = g_new0 (YelpIndexModelPriv, 1); + + do { + priv->stamp = g_random_int (); + } while (priv->stamp == 0); + + model->priv = priv; +} + +static void +yim_finalize (GObject *object) +{ + YelpIndexModel *model = YELP_INDEX_MODEL (object); + + if (model->priv) { + if (model->priv->index_words) { + /* FIXME: Clean up the list */ + } + + g_free (model->priv); + model->priv = NULL; + } + + (* parent_class->finalize) (object); +} + +static gint +yim_get_n_columns (GtkTreeModel *tree_model) +{ + return 1; +} + +static GType +yim_get_column_type (GtkTreeModel *tree_model, + gint column) +{ + return G_TYPE_STRING; +} + +static gboolean +yim_get_iter (GtkTreeModel *tree_model, + GtkTreeIter *iter, + GtkTreePath *path) +{ + YelpIndexModel *model; + YelpIndexModelPriv *priv; + GList *node; + gint i; + + g_return_val_if_fail (MG_IS_RESOURCE_MODEL (tree_model), FALSE); + g_return_val_if_fail (gtk_tree_path_get_depth (path) > 0, FALSE); + + model = YELP_INDEX_MODEL (tree_model); + priv = model->priv; + + i = gtk_tree_path_get_indices (path)[0]; + + if (i >= g_list_length (priv->index_words)) { + return FALSE; + } + + node = g_list_nth (priv->index_words, i); + + iter->stamp = priv->stamp; + iter->user_data = node; + + return TRUE; +} + +static GtkTreePath * +yim_get_path (GtkTreeModel *tree_model, + GtkTreeIter *iter) +{ + YelpIndexModel *model = YELP_INDEX_MODEL (tree_model); + YelpIndexModelPriv *priv; + GtkTreePath *path; + GList *node; + gint i = 0; + + g_return_val_if_fail (MG_IS_RESOURCE_MODEL (tree_model), NULL); + g_return_val_if_fail (iter->stamp == model->priv->stamp, NULL); + + priv = model->priv; + + for (node = priv->index_words; node; node = node->next) + { + if ((gpointer)node->data == (gpointer)iter->user_data) + break; + i++; + } + + if (node == NULL) { + return NULL; + } + + path = gtk_tree_path_new (); + gtk_tree_path_append_index (path, i); + + return path; +} + +static void +yim_get_value (GtkTreeModel *tree_model, + GtkTreeIter *iter, + gint column, + GValue *value) +{ + YelpSection *section; + + g_return_if_fail (MG_IS_RESOURCE_MODEL (tree_model)); + g_return_if_fail (iter != NULL); + + section = (YelpSection *) (G_LIST(iter->user_data)->data); + + switch (column) { + case 0: + g_value_set_string (value, section->name); + break; + default: + g_warning ("Bad column %d requested", column); + } +} + +static gboolean +yim_iter_next (GtkTreeModel *tree_model, + GtkTreeIter *iter) +{ + YelpIndexModel *model = YELP_INDEX_MODEL (tree_model); + + g_return_val_if_fail (MG_IS_RESOURCE_MODEL (tree_model), FALSE); + g_return_val_if_fail (model->priv->stamp == iter->stamp, FALSE); + + iter->user_data = G_LIST(iter->user_data)->next; + + return (iter->user_data != NULL); +} + +static gboolean +yim_iter_children (GtkTreeModel *tree_model, + GtkTreeIter *iter, + GtkTreeIter *parent) +{ + YelpIndexModelPriv *priv; + + g_return_val_if_fail (MG_IS_RESOURCE_MODEL (tree_model), FALSE); + + priv = YELP_INDEX_MODEL(tree_model)->priv; + + /* this is a list, nodes have no children */ + if (parent) { + return FALSE; + } + + /* but if parent == NULL we return the list itself as children of the + * "root" + */ + + if (priv->index_words) { + iter->stamp = priv->stamp; + iter->user_data = priv->index_words; + return TRUE; + } + + return FALSE; +} + +static gboolean +yim_iter_has_child (GtkTreeModel *tree_model, + GtkTreeIter *iter) +{ + return FALSE; +} + +static gint +yim_iter_n_children (GtkTreeModel *tree_model, + GtkTreeIter *iter) +{ + YelpIndexModelPriv *priv; + + g_return_val_if_fail (MG_IS_RESOURCE_MODEL (tree_model), -1); + + priv = YELP_INDEX_MODEL(tree_model)->priv; + + if (iter == NULL) { + return g_list_length (priv->index_words); + } + + g_return_val_if_fail (priv->stamp == iter->stamp, -1); + + return 0; +} + +static gboolean +yim_iter_nth_child (GtkTreeModel *tree_model, + GtkTreeIter *iter, + GtkTreeIter *parent, + gint n) +{ + YelpIndexModelPriv *priv; + GList *child; + + g_return_val_if_fail (MG_IS_RESOURCE_MODEL (tree_model), FALSE); + + priv = YELP_INDEX_MODEL(tree_model)->priv; + + if (parent) { + return FALSE; + } + + child = g_list_nth (priv->index_words, n); + + if (child) { + iter->stamp = priv->stamp; + iter->user_data = child; + return TRUE; + } + + return FALSE; +} + +static gboolean +yim_iter_parent (GtkTreeModel *tree_model, + GtkTreeIter *iter, + GtkTreeIter *child) +{ + return FALSE; +} + +YelpIndexModel * +yelp_index_model_new (GList *index_words) +{ + YelpIndexModel *model; + YelpIndexModelPriv *priv; + + model = g_object_new (YELP_TYPE_INDEX_MODEL, NULL); + + priv = model->priv; + + priv->index_words = index_words; + + return model; +} + diff --git a/src/yelp-index-model.h b/src/yelp-index-model.h new file mode 100644 index 00000000..86f0a479 --- /dev/null +++ b/src/yelp-index-model.h @@ -0,0 +1,57 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2002 CodeFactory AB + * Copyright (C) 2002 Richard Hult <rhult@codefactory.se> + * Copyright (C) 2002 Mikael Hallendal <micke@codefactory.se> + * + * 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. + */ + +#ifndef __YELP_INDEX_MODEL_H__ +#define __YELP_INDEX_MODEL_H__ + +#include <glib-object.h> +#include <gtk/gtktreemodel.h> +#include <gtk/gtktreesortable.h> + +#define YELP_TYPE_INDEX_MODEL (yelp_index_model_get_type ()) +#define YELP_INDEX_MODEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), YELP_TYPE_INDEX_MODEL, YelpIndexModel)) +#define YELP_INDEX_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), YELP_TYPE_INDEX_MODEL, YelpIndexModelClass)) +#define MG_IS_RESOURCE_MODEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), YELP_TYPE_INDEX_MODEL)) +#define MG_IS_RESOURCE_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), YELP_TYPE_INDEX_MODEL)) +#define YELP_INDEX_MODEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), YELP_TYPE_INDEX_MODEL, YelpIndexModelClass)) + +typedef struct _YelpIndexModel YelpIndexModel; +typedef struct _YelpIndexModelClass YelpIndexModelClass; +typedef struct _YelpIndexModelPriv YelpIndexModelPriv; + +struct _YelpIndexModel +{ + GObject parent; + + YelpIndexModelPriv *priv; + +}; + +struct _YelpIndexModelClass +{ + GObjectClass parent_class; +}; + +GtkType yelp_index_model_get_type (void); +YelpIndexModel *yelp_index_model_new (GList *index_words); + +#endif /* __YELP_INDEX_MODEL_H__ */ diff --git a/src/yelp-scrollkeeper.c b/src/yelp-scrollkeeper.c index d1f49536..548833b0 100644 --- a/src/yelp-scrollkeeper.c +++ b/src/yelp-scrollkeeper.c @@ -61,8 +61,6 @@ static void ys_parse_index_item (GList **index, xmlNode *node); -static gint calls = 0; - static GHashTable *seriesid_hash = NULL; static GHashTable *docid_hash = NULL; @@ -330,8 +328,6 @@ ys_get_xml_docpath (const gchar *command, const gchar *argument) success = g_spawn_command_line_sync (full_command, &xml_location, NULL, NULL, NULL); - calls++; - g_free (full_command); if (!success) { diff --git a/src/yelp-view-index.c b/src/yelp-view-index.c index 3e0de723..7d83dfa8 100644 --- a/src/yelp-view-index.c +++ b/src/yelp-view-index.c @@ -26,19 +26,33 @@ #include <libgnome/gnome-i18n.h> #include <gtk/gtktreeview.h> +#include <string.h> #include "yelp-html.h" #include "yelp-view-index.h" -static void yvi_init (YelpViewIndex *view); -static void yvi_class_init (YelpViewIndexClass *klass); -static void yvi_index_selection_changed_cb (GtkTreeSelection *selection, - YelpViewIndex *content); -static void yvi_html_url_selected_cb (YelpViewIndex *content, - char *url, - char *base_url, - gboolean handled); -static void yvi_setup_index_view (YelpViewIndex *view); +static void yvi_init (YelpViewIndex *view); +static void yvi_class_init (YelpViewIndexClass *klass); +static void yvi_index_selection_changed_cb (GtkTreeSelection *selection, + YelpViewIndex *content); +static void yvi_html_url_selected_cb (YelpViewIndex *content, + char *url, + char *base_url, + gboolean handled); +static void yvi_setup_index_view (YelpViewIndex *view); +static void yvi_entry_changed_cb (GtkEntry *entry, + YelpViewIndex *view); +static void yvi_entry_activated_cb (GtkEntry *entry, + YelpViewIndex *view); +static void yvi_entry_text_inserted_cb (GtkEntry *entry, + const gchar *text, + gint length, + gint *position, + YelpViewIndex *view); +static void yvi_search (YelpViewIndex *view, + const gchar *string); +static gboolean yvi_complete_idle (YelpViewIndex *view); +static gchar * yvi_complete_func (YelpSection *section); struct _YelpViewIndexPriv { GList *index; @@ -52,6 +66,10 @@ struct _YelpViewIndexPriv { /* Html view */ GtkWidget *html_view; + + GCompletion *completion; + + guint complete; }; GType @@ -89,7 +107,12 @@ yvi_init (YelpViewIndex *view) priv = g_new0 (YelpViewIndexPriv, 1); view->priv = priv; - + + priv->complete = 0; + priv->completion = + g_completion_new ((GCompletionFunc)yvi_complete_func); + g_completion_set_compare (priv->completion, g_ascii_strncasecmp); + priv->index_view = gtk_tree_view_new (); priv->list_store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_POINTER); @@ -180,11 +203,99 @@ yvi_setup_index_view (YelpViewIndex *view) priv = view->priv; + g_completion_add_items (priv->completion, priv->index); + g_list_foreach (priv->index, (GFunc )yvi_index_term_add, view); } +static void +yvi_entry_changed_cb (GtkEntry *entry, YelpViewIndex *view) +{ + g_print ("Entry changed\n"); +} + +static void +yvi_entry_activated_cb (GtkEntry *entry, YelpViewIndex *view) +{ + g_return_if_fail (GTK_IS_ENTRY (entry)); + g_return_if_fail (YELP_IS_VIEW_INDEX (view)); + + yvi_search (view, gtk_entry_get_text (entry)); + + g_print ("Entry activated\n"); +} + +static void +yvi_entry_text_inserted_cb (GtkEntry *entry, + const gchar *text, + gint length, + gint *position, + YelpViewIndex *view) +{ + YelpViewIndexPriv *priv; + + g_return_if_fail (YELP_IS_VIEW_INDEX (view)); + + priv = view->priv; + + if (!priv->complete) { + priv->complete = g_idle_add ((GSourceFunc)yvi_complete_idle, + view); + } + + g_print ("Entry text insterted\n"); +} + +static void +yvi_search (YelpViewIndex *view, const gchar *string) +{ + g_print ("Doing a search on %s...\n", string); +} + +static gboolean +yvi_complete_idle (YelpViewIndex *view) +{ + YelpViewIndexPriv *priv; + const gchar *text; + gchar *completed = NULL; + GList *list; + gint text_length; + + g_return_val_if_fail (YELP_IS_VIEW_INDEX (view), FALSE); + + priv = view->priv; + + g_print ("Completing ... \n"); + + text = gtk_entry_get_text (GTK_ENTRY (priv->entry)); + + list = g_completion_complete (priv->completion, + (gchar *)text, + &completed); + + if (completed) { + text_length = strlen (text); + + gtk_entry_set_text (GTK_ENTRY (priv->entry), completed); + gtk_editable_set_position (GTK_EDITABLE (priv->entry), + text_length); + gtk_editable_select_region (GTK_EDITABLE (priv->entry), + text_length, -1); + } + + priv->complete = 0; + + return FALSE; +} + +static gchar * +yvi_complete_func (YelpSection *section) +{ + return section->name; +} + GtkWidget * yelp_view_index_new (GList *index) { @@ -214,8 +325,20 @@ yelp_view_index_new (GList *index) priv->entry = gtk_entry_new (); + g_signal_connect (priv->entry, "changed", + G_CALLBACK (yvi_entry_changed_cb), + view); + gtk_box_pack_end (GTK_BOX (hbox), priv->entry, FALSE, FALSE, 0); + g_signal_connect (priv->entry, "activate", + G_CALLBACK (yvi_entry_activated_cb), + view); + + g_signal_connect (priv->entry, "insert-text", + G_CALLBACK (yvi_entry_text_inserted_cb), + view); + gtk_box_pack_start (GTK_BOX (box), hbox, FALSE, FALSE, 0); |