summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShaun McCance <shaunm@src.gnome.org>2004-12-09 05:35:22 +0000
committerShaun McCance <shaunm@src.gnome.org>2004-12-09 05:35:22 +0000
commit9b5a210f00d6aa82788adec7a7859e378ca5d253 (patch)
treea471dc980e4deee88d774f2c36bdf3f51bfb43e2
parentd3ce9c37cdeefc901e1e842fee16b84250843245 (diff)
downloadyelp-9b5a210f00d6aa82788adec7a7859e378ca5d253.tar.gz
- Hooked up reload, at least for DocBook
* src/yelp-db-pager.c: * src/yelp-pager.c: * src/yelp-utils.c: * src/yelp-window.c: - Hooked up reload, at least for DocBook
-rw-r--r--ChangeLog8
-rw-r--r--src/yelp-db-pager.c58
-rw-r--r--src/yelp-pager.c4
-rw-r--r--src/yelp-utils.c6
-rw-r--r--src/yelp-window.c47
5 files changed, 106 insertions, 17 deletions
diff --git a/ChangeLog b/ChangeLog
index 03a0f97d..d6cb0daa 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2004-12-08 Shaun McCance <shaunm@gnome.org>
+
+ * src/yelp-db-pager.c:
+ * src/yelp-pager.c:
+ * src/yelp-utils.c:
+ * src/yelp-window.c:
+ - Hooked up reload, at least for DocBook
+
2004-12-05 Shaun McCance <shaunm@gnome.org>
* src/yelp-window.c:
diff --git a/src/yelp-db-pager.c b/src/yelp-db-pager.c
index 41012829..a546595b 100644
--- a/src/yelp-db-pager.c
+++ b/src/yelp-db-pager.c
@@ -205,8 +205,9 @@ yelp_db_pager_new (YelpDocInfo *doc_info)
"document-info", doc_info,
NULL);
- pager->priv->sects =
- GTK_TREE_MODEL (gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_STRING));
+ if (!pager->priv->sects)
+ pager->priv->sects =
+ GTK_TREE_MODEL (gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_STRING));
return (YelpPager *) pager;
}
@@ -276,7 +277,7 @@ db_pager_process (YelpPager *pager)
id = xmlGetProp (walker->cur, "id");
if (id)
- priv->root_id = (gchar *) id;
+ priv->root_id = g_strdup (id);
else
priv->root_id = g_strdup ("index");
@@ -424,11 +425,40 @@ db_pager_error (YelpPager *pager)
static void
db_pager_cancel (YelpPager *pager)
{
+ YelpDBPagerPriv *priv = YELP_DB_PAGER (pager)->priv;
+
d (g_print ("db_pager_cancel\n"));
+
yelp_pager_set_state (pager, YELP_PAGER_STATE_INVALID);
if (yelp_pager_get_state (pager) <= YELP_PAGER_STATE_RUNNING)
yelp_toc_pager_unpause (yelp_toc_pager_get ());
- // FIXME: actually cancel
+
+ gtk_tree_store_clear (GTK_TREE_STORE (priv->sects));
+ g_hash_table_foreach_remove (priv->frags_hash, gtk_true, NULL);
+
+ g_free (priv->root_id);
+ priv->root_id = NULL;
+
+ if (priv->inputDoc) {
+ xmlFreeDoc (priv->inputDoc);
+ priv->inputDoc = NULL;
+ }
+ if (priv->outputDoc) {
+ xmlFreeDoc (priv->outputDoc);
+ priv->outputDoc = NULL;
+ }
+ if (priv->parserCtxt) {
+ xmlFreeParserCtxt (priv->parserCtxt);
+ priv->parserCtxt = NULL;
+ }
+ if (priv->stylesheet) {
+ xsltFreeStylesheet (priv->stylesheet);
+ priv->stylesheet = NULL;
+ }
+ if (priv->transformContext) {
+ xsltFreeTransformContext (priv->transformContext);
+ priv->transformContext = NULL;
+ }
}
static void
@@ -497,9 +527,11 @@ xslt_yelp_document (xsltTransformContextPtr ctxt,
EVENTS_PENDING;
CANCEL_CHECK;
+ d (g_print ("xslt_yelp_document\n"));
+
page_id = xsltEvalAttrValueTemplate (ctxt, inst,
- (const xmlChar *) "href",
- NULL);
+ (const xmlChar *) "href",
+ NULL);
if (page_id == NULL) {
xsltTransformError (ctxt, NULL, inst,
_("No href attribute found on yelp:document"));
@@ -507,6 +539,7 @@ xslt_yelp_document (xsltTransformContextPtr ctxt,
yelp_pager_error (pager, error);
goto done;
}
+ d (g_print (" page_id = \"%s\"\n", page_id));
old_outfile = ctxt->outputFile;
old_doc = ctxt->output;
@@ -551,7 +584,10 @@ xslt_yelp_document (xsltTransformContextPtr ctxt,
page = g_new0 (YelpPage, 1);
- page->page_id = page_id;
+ page->page_id = g_strdup (page_id);
+ xmlFree (page_id);
+ page_id = NULL;
+
page->title = page_title;
page->contents = page_buf;
@@ -563,11 +599,11 @@ xslt_yelp_document (xsltTransformContextPtr ctxt,
xmlChar *rel = xmlGetProp (cur, "rel");
if (!xmlStrcmp (rel, (xmlChar *) "Previous"))
- page->prev_id = xmlGetProp (cur, "href");
+ page->prev_id = g_strdup (xmlGetProp (cur, "href"));
else if (!xmlStrcmp (rel, (xmlChar *) "Next"))
- page->next_id = xmlGetProp (cur, "href");
+ page->next_id = g_strdup (xmlGetProp (cur, "href"));
else if (!xmlStrcmp (rel, (xmlChar *) "Top"))
- page->toc_id = xmlGetProp (cur, "href");
+ page->toc_id = g_strdup (xmlGetProp (cur, "href"));
xmlFree (rel);
}
@@ -579,7 +615,7 @@ xslt_yelp_document (xsltTransformContextPtr ctxt,
CANCEL_CHECK;
yelp_pager_add_page (pager, page);
- g_signal_emit_by_name (pager, "page", page_id);
+ g_signal_emit_by_name (pager, "page", page->page_id);
EVENTS_PENDING;
CANCEL_CHECK;
diff --git a/src/yelp-pager.c b/src/yelp-pager.c
index e730a8b4..6d99f273 100644
--- a/src/yelp-pager.c
+++ b/src/yelp-pager.c
@@ -186,7 +186,7 @@ pager_init (YelpPager *pager)
priv->page_hash =
g_hash_table_new_full (g_str_hash,
g_str_equal,
- g_free,
+ NULL, /* Use page->page_id directly */
(GDestroyNotify) yelp_page_free);
}
@@ -380,7 +380,7 @@ yelp_pager_add_page (YelpPager *pager,
g_return_if_fail (page->page_id != NULL);
- g_hash_table_insert (pager->priv->page_hash, page->page_id, page);
+ g_hash_table_replace (pager->priv->page_hash, page->page_id, page);
}
void
diff --git a/src/yelp-utils.c b/src/yelp-utils.c
index 3a51bd63..39ac5b7b 100644
--- a/src/yelp-utils.c
+++ b/src/yelp-utils.c
@@ -238,7 +238,8 @@ yelp_doc_info_free (YelpDocInfo *doc)
if (!doc)
return;
- g_object_unref (doc->pager);
+ if (doc->pager)
+ g_object_unref (doc->pager);
g_free (doc->title);
for (i = 0; i < doc->num_uris; i++)
@@ -503,7 +504,8 @@ get_doc_type (gchar *uri)
return YELP_DOC_TYPE_EXTERNAL;
mime_type = gnome_vfs_get_mime_type (uri);
- g_return_val_if_fail (mime_type != NULL, YELP_DOC_TYPE_ERROR);
+ if (mime_type == NULL)
+ return YELP_DOC_TYPE_ERROR;
if (g_str_equal (mime_type, "text/xml"))
type = YELP_DOC_TYPE_DOCBOOK_XML;
diff --git a/src/yelp-window.c b/src/yelp-window.c
index 224f6244..e36fba6f 100644
--- a/src/yelp-window.c
+++ b/src/yelp-window.c
@@ -66,6 +66,11 @@
#define BUFFER_SIZE 16384
typedef struct {
+ YelpWindow *window;
+ gchar *uri;
+} YelpLoadData;
+
+typedef struct {
YelpDocInfo *doc_info;
gchar *frag_id;
@@ -170,6 +175,8 @@ static void window_copy_link_cb (GtkAction *action, YelpWindow *window);
static void window_open_link_cb (GtkAction *action, YelpWindow *window);
static void window_open_link_new_cb (GtkAction *action, YelpWindow *window);
+static gboolean window_load_async (YelpLoadData *data);
+
/** History Functions **/
static void history_push_back (YelpWindow *window);
static void history_push_forward (YelpWindow *window);
@@ -179,6 +186,8 @@ static YelpHistoryEntry * history_pop_back (YelpWindow *window);
static YelpHistoryEntry * history_pop_forward (YelpWindow *window);
static void history_entry_free (YelpHistoryEntry *entry);
+static void load_data_free (YelpLoadData *data);
+
static void location_response_cb (GtkDialog *dialog,
gint id,
YelpWindow *window);
@@ -611,6 +620,17 @@ history_entry_free (YelpHistoryEntry *entry)
g_free (entry);
}
+static void
+load_data_free (YelpLoadData *data)
+{
+ g_return_if_fail (data != NULL);
+
+ g_object_unref (data->window);
+ g_free (data->uri);
+
+ g_free (data);
+}
+
/******************************************************************************/
GtkWidget *
@@ -669,10 +689,10 @@ yelp_window_load (YelpWindow *window, gchar *uri)
if (priv->current_doc && yelp_doc_info_equal (priv->current_doc, doc_info)) {
if (priv->current_frag) {
if (frag_id && g_str_equal (priv->current_frag, frag_id))
- goto done;
+ goto load;
}
else if (!frag_id)
- goto done;
+ goto load;
}
if (priv->current_doc)
@@ -687,6 +707,7 @@ yelp_window_load (YelpWindow *window, gchar *uri)
priv->current_doc = yelp_doc_info_ref (doc_info);
priv->current_frag = g_strdup (frag_id);
+ load:
window_do_load (window, doc_info, frag_id);
done:
@@ -715,6 +736,8 @@ window_do_load (YelpWindow *window,
g_return_if_fail (YELP_IS_WINDOW (window));
g_return_if_fail (doc_info != NULL);
+ d (g_print ("window_do_laod\n"));
+
priv = window->priv;
switch (yelp_doc_info_get_type (doc_info)) {
@@ -1767,15 +1790,35 @@ window_reload_cb (GtkAction *action, YelpWindow *window)
d (g_print ("window_reload_cb\n"));
if (window->priv->current_doc) {
+ YelpLoadData *data;
+ gchar *uri;
pager = yelp_doc_info_get_pager (window->priv->current_doc);
if (!pager)
return;
yelp_pager_cancel (pager);
+
+ uri = yelp_doc_info_get_uri (window->priv->current_doc,
+ window->priv->current_frag,
+ YELP_URI_TYPE_ANY);
+ data = g_new0 (YelpLoadData, 1);
+ data->window = g_object_ref (window);
+ data->uri = uri;
+ g_idle_add ((GSourceFunc) window_load_async, data);
}
}
+static gboolean
+window_load_async (YelpLoadData *data)
+{
+ yelp_window_load (data->window, data->uri);
+
+ load_data_free (data);
+
+ return FALSE;
+}
+
static void
window_go_back_cb (GtkAction *action, YelpWindow *window)
{