summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShaun McCance <shaunm@src.gnome.org>2005-01-01 00:11:57 +0000
committerShaun McCance <shaunm@src.gnome.org>2005-01-01 00:11:57 +0000
commit9de907d07a17843d6eb19ea0124f5558dca4c8a4 (patch)
tree86a6a9b9ac4397da54b584d0a8050a8b1bfe7cd5
parent06d52e333e51584ad3b6c5e9f8ee76c57141766f (diff)
downloadyelp-9de907d07a17843d6eb19ea0124f5558dca4c8a4.tar.gz
- Make a hash of section ids and do resolve_frag properly
* src/yelp-info-pager.c: - Make a hash of section ids and do resolve_frag properly
-rw-r--r--ChangeLog5
-rw-r--r--src/yelp-info-pager.c47
2 files changed, 49 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index b94a747c..a1237273 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,11 @@
2004-12-31 Shaun McCance <shaunm@gnome.org>
* src/yelp-info-pager.c:
+ - Make a hash of section ids and do resolve_frag properly
+
+2004-12-31 Shaun McCance <shaunm@gnome.org>
+
+ * src/yelp-info-pager.c:
- Put the GtkTreeStore in the YelpInfoPagerPriv
- Return "Top" in resolve_frag, just so something will show up
diff --git a/src/yelp-info-pager.c b/src/yelp-info-pager.c
index 5e0d1f76..8d346926 100644
--- a/src/yelp-info-pager.c
+++ b/src/yelp-info-pager.c
@@ -45,6 +45,7 @@
struct _YelpInfoPagerPriv {
GtkTreeStore *tree;
+ GHashTable *frags_hash;
};
static void info_pager_class_init (YelpInfoPagerClass *klass);
@@ -55,9 +56,14 @@ static xmlDocPtr info_pager_parse (YelpPager *pager);
static gchar ** info_pager_params (YelpPager *pager);
static const gchar * info_pager_resolve_frag (YelpPager *pager,
- const gchar *frag_id);
+ const gchar *frag_id);
static GtkTreeModel * info_pager_get_sections (YelpPager *pager);
+static gboolean tree_hash_id (GtkTreeModel *model,
+ GtkTreePath *path,
+ GtkTreeIter *iter,
+ YelpInfoPager *pager);
+
static YelpPagerClass *parent_class;
GType
@@ -110,6 +116,10 @@ info_pager_init (YelpInfoPager *pager)
YelpInfoPagerPriv *priv;
priv = g_new0 (YelpInfoPagerPriv, 1);
+
+ /* In this hash, key == value */
+ priv->frags_hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
+
pager->priv = priv;
}
@@ -118,6 +128,9 @@ info_pager_dispose (GObject *object)
{
YelpInfoPager *pager = YELP_INFO_PAGER (object);
+ g_object_unref (pager->priv->tree);
+ g_hash_table_destroy (pager->priv->frags_hash);
+
g_free (pager->priv);
G_OBJECT_CLASS (parent_class)->dispose (object);
@@ -163,6 +176,10 @@ info_pager_parse (YelpPager *pager)
/* create the XML file */
doc = yelp_info_parser_parse_tree (priv->tree);
+
+ gtk_tree_model_foreach (GTK_TREE_MODEL (priv->tree),
+ (GtkTreeModelForeachFunc) tree_hash_id,
+ pager);
g_object_unref (pager);
@@ -189,8 +206,12 @@ info_pager_params (YelpPager *pager)
static const gchar *
info_pager_resolve_frag (YelpPager *pager, const gchar *frag_id)
{
- /* MUST DO THIS RIGHTLY */
- return "Top";
+ g_return_val_if_fail (YELP_IS_INFO_PAGER (pager), NULL);
+
+ if (frag_id)
+ return g_hash_table_lookup (YELP_INFO_PAGER (pager)->priv->frags_hash, frag_id);
+ else
+ return g_hash_table_lookup (YELP_INFO_PAGER (pager)->priv->frags_hash, "Top");
}
static GtkTreeModel *
@@ -200,3 +221,23 @@ info_pager_get_sections (YelpPager *pager)
return YELP_INFO_PAGER (pager)->priv->tree;
}
+
+static gboolean
+tree_hash_id (GtkTreeModel *model,
+ GtkTreePath *path,
+ GtkTreeIter *iter,
+ YelpInfoPager *pager)
+{
+ YelpInfoPagerPriv *priv;
+ gchar *id;
+
+ priv = pager->priv;
+
+ gtk_tree_model_get (model, iter,
+ YELP_PAGER_COLUMN_ID, &id,
+ -1);
+ if (id)
+ g_hash_table_replace (priv->frags_hash, id, id);
+
+ return FALSE;
+}