diff options
-rw-r--r-- | ChangeLog | 20 | ||||
-rw-r--r-- | data/ui/yelp-ui.xml | 2 | ||||
-rw-r--r-- | src/Makefile.am | 1 | ||||
-rw-r--r-- | src/test-uri.c | 70 | ||||
-rw-r--r-- | src/yelp-base.c | 6 | ||||
-rw-r--r-- | src/yelp-cache.h | 2 | ||||
-rw-r--r-- | src/yelp-pager.c | 3 | ||||
-rw-r--r-- | src/yelp-utils.c | 179 | ||||
-rw-r--r-- | src/yelp-utils.h | 40 | ||||
-rw-r--r-- | src/yelp-window.c | 223 |
10 files changed, 406 insertions, 140 deletions
@@ -1,3 +1,23 @@ +2004-10-12 Shaun McCance <shaunm@gnome.org> + + * data/ui/yelp-ui.xml: + * src/yelp-window.c: + - Added Copy, breaking Copy + - DND from the tree view + + * src/Makefile.am: + * src/yelp-cache.h: + - Removed yelp-uri + + * src/test-uri.c: + * src/yelp-base.c: + * src/yelp-pager.c: + * src/yelp-utils.c: + * src/yelp-utils.h: + * src/yelp-window.c: + - Privatized YelpDocInfo + - Added multiple URI support to YelpDocInfo + 2004-10-10 Shaun McCance <shaunm@gnome.org> * data/ui/yelp.glade: diff --git a/data/ui/yelp-ui.xml b/data/ui/yelp-ui.xml index 947db5de..5f81d7c2 100644 --- a/data/ui/yelp-ui.xml +++ b/data/ui/yelp-ui.xml @@ -6,6 +6,8 @@ <menuitem action="CloseWindow"/> </menu> <menu action="EditMenu"> + <menuitem action="Copy"/> + <separator/> <menuitem action="Find"/> </menu> <menu action="GoMenu"> diff --git a/src/Makefile.am b/src/Makefile.am index 8c60ef54..bc5608fe 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -65,7 +65,6 @@ test_pager_SOURCES = \ yelp-pager.c yelp-pager.h \ yelp-theme.c yelp-theme.h \ yelp-toc-pager.c yelp-toc-pager.h \ - yelp-uri.c yelp-uri.h \ yelp-utils.c yelp-utils.h \ yelp-marshal-main.c test-pager.c diff --git a/src/test-uri.c b/src/test-uri.c index 9cf589ae..093908df 100644 --- a/src/test-uri.c +++ b/src/test-uri.c @@ -27,52 +27,64 @@ #include <libgnomevfs/gnome-vfs.h> #include "yelp-utils.h" -#include "yelp-uri.h" static void print_doc_info (YelpDocInfo *doc) { - gchar *type, *file; + gchar *type, *uri, *file; + gboolean hasfile = FALSE; + gint i, max, tmp; - switch (doc->type) { - case YELP_TYPE_ERROR: - type = "YELP_TYPE_ERROR"; + switch (yelp_doc_info_get_type(doc)) { + case YELP_DOC_TYPE_ERROR: + type = "YELP_DOC_TYPE_ERROR"; break; - case YELP_TYPE_DOCBOOK_XML: - type = "YELP_TYPE_DOCBOOK_XML"; + case YELP_DOC_TYPE_DOCBOOK_XML: + type = "YELP_DOC_TYPE_DOCBOOK_XML"; break; - case YELP_TYPE_DOCBOOK_SGML: - type = "YELP_TYPE_DOCBOOK_SGML"; + case YELP_DOC_TYPE_DOCBOOK_SGML: + type = "YELP_DOC_TYPE_DOCBOOK_SGML"; break; - case YELP_TYPE_HTML: - type = "YELP_TYPE_HTML"; + case YELP_DOC_TYPE_HTML: + type = "YELP_DOC_TYPE_HTML"; break; - case YELP_TYPE_MAN: - type = "YELP_TYPE_MAN"; + case YELP_DOC_TYPE_MAN: + type = "YELP_DOC_TYPE_MAN"; break; - case YELP_TYPE_INFO: - type = "YELP_TYPE_INFO"; + case YELP_DOC_TYPE_INFO: + type = "YELP_DOC_TYPE_INFO"; break; - case YELP_TYPE_TOC: - type = "YELP_TYPE_DOC"; + case YELP_DOC_TYPE_TOC: + type = "YELP_DOC_TYPE_DOC"; break; - case YELP_TYPE_EXTERNAL: - type = "YELP_TYPE_EXTERNAL"; + case YELP_DOC_TYPE_EXTERNAL: + type = "YELP_DOC_TYPE_EXTERNAL"; break; } - file = yelp_doc_info_get_filename (doc); + printf ("Address: %i\n", (guint) doc); + printf ("Type: %s\n", type); - printf ("Address: %i\n" - "URI: %s\n" - "Type: %s\n" - "Filename: %s\n", - (gint) doc, - doc->uri, - type, - file); + max = 0; + tmp = YELP_URI_TYPE_ANY; + while ((tmp = tmp >> 1)) + max++; - g_free (file); + for (i = 0; i <= max; i++) { + uri = yelp_doc_info_get_uri (doc, NULL, 1 << i); + if (uri) { + printf ("URI: %s\n", uri); + if ((1 << i) == YELP_URI_TYPE_FILE) + hasfile = TRUE; + g_free (uri); + } + } + + if (hasfile) { + file = yelp_doc_info_get_filename (doc); + printf ("Filename: %s\n", file); + g_free (file); + } } int diff --git a/src/yelp-base.c b/src/yelp-base.c index 001c8434..fa689ea2 100644 --- a/src/yelp-base.c +++ b/src/yelp-base.c @@ -23,6 +23,7 @@ #include <config.h> #include <bonobo/bonobo-main.h> +#include <libgnomevfs/gnome-vfs.h> #include <string.h> @@ -73,6 +74,7 @@ impl_Yelp_getWindows (PortableServer_Servant servant, gint len, i; GSList *node; YelpDocInfo *doc_info; + gchar *uri; base = YELP_BASE (bonobo_object (servant)); priv = base->priv; @@ -87,7 +89,9 @@ impl_Yelp_getWindows (PortableServer_Servant servant, for (node = priv->windows, i = 0; node; node = node->next, i++) { doc_info = yelp_window_get_doc_info (YELP_WINDOW (node->data)); - list->_buffer[i] = CORBA_string_dup (doc_info->uri); + uri = yelp_doc_info_get_uri (doc_info, NULL, YELP_URI_TYPE_ANY); + list->_buffer[i] = CORBA_string_dup (uri); + g_free (uri); } return list; diff --git a/src/yelp-cache.h b/src/yelp-cache.h index 60f5478e..74f0b9dc 100644 --- a/src/yelp-cache.h +++ b/src/yelp-cache.h @@ -26,8 +26,6 @@ #include <glib.h> #include <glib-object.h> -#include "yelp-uri.h" - void yelp_cache_init (void); GObject * yelp_cache_lookup (const gchar *path); diff --git a/src/yelp-pager.c b/src/yelp-pager.c index 2c568c83..b03222b4 100644 --- a/src/yelp-pager.c +++ b/src/yelp-pager.c @@ -257,9 +257,6 @@ yelp_pager_start (YelpPager *pager) pager->priv->state == YELP_PAGER_STATE_INVALID, FALSE); - d (printf ("yelp_pager_start\n")); - d (printf (" uri = \"%s\"\n", pager->priv->doc_info->uri)); - pager->priv->state = YELP_PAGER_STATE_STARTED; gtk_idle_add ((GtkFunction) (YELP_PAGER_GET_CLASS (pager)->process), pager); diff --git a/src/yelp-utils.c b/src/yelp-utils.c index 84726a1e..a37e6384 100644 --- a/src/yelp-utils.c +++ b/src/yelp-utils.c @@ -42,50 +42,87 @@ GHashTable *doc_info_table; +typedef struct { + gchar *uri; + YelpURIType type; +} DocInfoURI; + +struct _YelpDocInfo { + DocInfoURI *uris; + gint num_uris; + gint max_uris; + + YelpDocType type; + + YelpPager *pager; + + gint ref_count; +}; + +static void doc_info_add_uri (YelpDocInfo *doc_info, + gchar *uri, + YelpURIType type); static gchar * convert_ghelp_uri (gchar *uri); static gchar * convert_man_uri (gchar *uri); static gchar * convert_info_uri (gchar *uri); static YelpDocType get_doc_type (gchar *uri); - YelpDocInfo * yelp_doc_info_new (gchar *uri) { YelpDocInfo *doc; gchar *doc_uri = NULL; YelpDocType doc_type; + YelpURIType uri_type; gchar *cur; g_return_val_if_fail (uri != NULL, NULL); - if (!strncmp (uri, "file:", 5)) { + d (printf ("yelp_doc_info_new\n")); + d (printf (" uri = \"%s\"\n", uri)); + + if (g_str_has_prefix (uri, "file:")) { if ((cur = strchr (uri, '#'))) doc_uri = g_strndup (uri, cur - uri); else doc_uri = g_strdup (uri); doc_type = get_doc_type (doc_uri); + uri_type = YELP_URI_TYPE_FILE; } - if (!strncmp (uri, "ghelp:", 6)) { + if (g_str_has_prefix (uri, "ghelp:")) { doc_uri = convert_ghelp_uri (uri); if (doc_uri) doc_type = get_doc_type (doc_uri); + uri_type = YELP_URI_TYPE_GHELP; } - else if (!strncmp (uri, "man:", 4)) { + else if (g_str_has_prefix (uri, "man:")) { doc_uri = convert_man_uri (uri); doc_type = YELP_DOC_TYPE_MAN; + uri_type = YELP_URI_TYPE_MAN; } - else if (!strncmp (uri, "info:", 5)) { + else if (g_str_has_prefix (uri, "info:")) { doc_uri = convert_info_uri (uri); doc_type = YELP_DOC_TYPE_INFO; + uri_type = YELP_URI_TYPE_INFO; } - else if (!strncmp (uri, "x-yelp-toc:", 11)) { + else if (g_str_has_prefix (uri, "x-yelp-toc:")) { doc_uri = g_strdup ("file://" DATADIR "/yelp/toc.xml"); doc_type = YELP_DOC_TYPE_TOC; + uri_type = YELP_URI_TYPE_TOC; } + d (printf (" doc_uri = \"%s\"\n", uri)); + if (doc_uri) { doc = g_new0 (YelpDocInfo, 1); - doc->uri = doc_uri; + doc->uris = g_new (DocInfoURI, 8); + doc->num_uris = 0; + doc->max_uris = 8; + + doc_info_add_uri (doc, doc_uri, YELP_URI_TYPE_FILE); + if (uri_type && uri_type != YELP_URI_TYPE_FILE) + doc_info_add_uri (doc, uri, uri_type); + doc->type = doc_type; doc->ref_count = 1; return doc; @@ -98,9 +135,13 @@ YelpDocInfo * yelp_doc_info_get (gchar *uri) { YelpDocInfo *doc; + gint i; g_return_val_if_fail (uri != NULL, NULL); + d (printf ("yelp_doc_info_get\n")); + d (printf (" uri = \"%s\"\n", uri)); + if (!doc_info_table) doc_info_table = g_hash_table_new_full (g_str_hash, @@ -115,19 +156,18 @@ yelp_doc_info_get (gchar *uri) if (doc && doc->type != YELP_DOC_TYPE_EXTERNAL) { YelpDocInfo *old_doc; - if ((old_doc = g_hash_table_lookup (doc_info_table, doc->uri))) { + /* Hackish and not reliable, but it basically works */ + if ((old_doc = g_hash_table_lookup (doc_info_table, doc->uris->uri))) { yelp_doc_info_free (doc); doc = old_doc; - g_hash_table_insert (doc_info_table, - g_strdup (uri), - doc); + for (i = 0; i < doc->num_uris; i++) + g_hash_table_insert (doc_info_table, + g_strdup ((doc->uris + i)->uri), + doc); } else { - g_hash_table_insert (doc_info_table, - g_strdup (uri), - doc); - if (!g_str_equal (uri, doc->uri)) + for (i = 0; i < doc->num_uris; i++) g_hash_table_insert (doc_info_table, - g_strdup (doc->uri), + g_strdup ((doc->uris + i)->uri), doc); } } @@ -156,40 +196,92 @@ yelp_doc_info_unref (YelpDocInfo *doc) void yelp_doc_info_free (YelpDocInfo *doc) { - if (!doc) - return; + gint i; d (printf ("yelp_doc_info_free\n")); - d (printf (" uri = \"%s\"\n", doc->uri)); + d (printf (" uri = \"%s\"\n", doc->uris->uri)); + + if (!doc) + return; g_object_unref (doc->pager); - g_free (doc->uri); + for (i = 0; i < doc->num_uris; i++) + g_free ((doc->uris + i)->uri); + g_free (doc->uris); g_free (doc); } +YelpPager * +yelp_doc_info_get_pager (YelpDocInfo *doc) +{ + g_return_val_if_fail (doc != NULL, NULL); + + return doc->pager; +} + +void +yelp_doc_info_set_pager (YelpDocInfo *doc, YelpPager *pager) +{ + g_return_if_fail (doc != NULL); + + if (doc->pager) + g_object_unref (doc->pager); + + doc->pager = g_object_ref (pager); +} + +YelpDocType +yelp_doc_info_get_type (YelpDocInfo *doc) +{ + g_return_val_if_fail (doc != NULL, YELP_DOC_TYPE_ERROR); + + return doc->type; +} + gchar * yelp_doc_info_get_uri (YelpDocInfo *doc, - gchar *frag_id) + gchar *frag_id, + YelpURIType uri_type) { + gchar *base = NULL; + gint i; + g_return_val_if_fail (doc != NULL, NULL); + for (i = 0; i < doc->num_uris; i++) + if ((doc->uris + i)->type & uri_type) { + base = (doc->uris + i)->uri; + break; + } + + if (!base) + return NULL; + if (!frag_id || *frag_id == '\0') - return g_strdup (doc->uri); + return g_strdup (base); - return g_strconcat (doc->uri, "#", frag_id, NULL); + return g_strconcat (base, "#", frag_id, NULL); } gchar * yelp_doc_info_get_filename (YelpDocInfo *doc) { - gchar *path = NULL; + gchar *filename = NULL; + gchar *base = NULL; + gint i; g_return_val_if_fail (doc != NULL, NULL); - if (!strncmp (doc->uri, "file://", 7)) - path = g_strdup (doc->uri + 7); + for (i = 0; i < doc->num_uris; i++) + if ((doc->uris + i)->type == YELP_URI_TYPE_FILE) { + base = (doc->uris + i)->uri; + break; + } + + if (g_str_has_prefix (base, "file://")) + filename = g_strdup (base + 7); - return path; + return filename; } gboolean @@ -200,7 +292,8 @@ yelp_doc_info_equal (YelpDocInfo *doc1, YelpDocInfo *doc2) g_return_val_if_fail (doc1 != NULL, FALSE); g_return_val_if_fail (doc2 != NULL, FALSE); - if (!g_str_equal (doc1->uri, doc2->uri)) + /* FIXME: this sucks */ + if (!g_str_equal (doc1->uris->uri, doc2->uris->uri)) equal = FALSE; return equal; @@ -295,6 +388,36 @@ get_doc_type (gchar *uri) return type; } +static void +doc_info_add_uri (YelpDocInfo *doc_info, + gchar *uri, + YelpURIType type) +{ + DocInfoURI *info_uri; + + d (printf ("yelp_doc_add_uri\n")); + + g_assert (doc_info->num_uris <= doc_info->max_uris); + + if (doc_info->num_uris == doc_info->max_uris) { + doc_info->max_uris += 8; + doc_info->uris = g_renew (DocInfoURI, + doc_info->uris, + doc_info->max_uris); + } + + info_uri = doc_info->uris + doc_info->num_uris; + + info_uri->uri = g_strdup (uri); + info_uri->type = type; + + doc_info->num_uris++; + + d (printf (" uri = \"%s\"\n", uri)); + d (printf (" num_uris = %i\n", doc_info->num_uris)); + d (printf (" max_uris = %i\n", doc_info->max_uris)); +} + /******************************************************************************/ /** Convert fancy URIs to file URIs *******************************************/ diff --git a/src/yelp-utils.h b/src/yelp-utils.h index 801141d0..f423222b 100644 --- a/src/yelp-utils.h +++ b/src/yelp-utils.h @@ -37,17 +37,31 @@ typedef enum { YELP_DOC_TYPE_EXTERNAL } YelpDocType; -#include "yelp-pager.h" - -struct _YelpDocInfo { - gchar *uri; - - YelpDocType type; +typedef enum { + YELP_URI_TYPE_ERROR = 0, + YELP_URI_TYPE_FILE = 1 << 0, + YELP_URI_TYPE_GHELP = 1 << 1, + YELP_URI_TYPE_MAN = 1 << 2, + YELP_URI_TYPE_INFO = 1 << 3, + YELP_URI_TYPE_TOC = 1 << 4, + YELP_URI_TYPE_EXTERNAL = 1 << 5, - YelpPager *pager; + YELP_URI_TYPE_NO_FILE = + YELP_URI_TYPE_GHELP | + YELP_URI_TYPE_MAN | + YELP_URI_TYPE_INFO | + YELP_URI_TYPE_TOC | + YELP_URI_TYPE_EXTERNAL, + YELP_URI_TYPE_ANY = + YELP_URI_TYPE_FILE | + YELP_URI_TYPE_GHELP | + YELP_URI_TYPE_MAN | + YELP_URI_TYPE_INFO | + YELP_URI_TYPE_TOC | + YELP_URI_TYPE_EXTERNAL +} YelpURIType; - gint ref_count; -}; +#include "yelp-pager.h" struct _YelpDocPage { YelpDocInfo *document; @@ -66,8 +80,14 @@ YelpDocInfo * yelp_doc_info_ref (YelpDocInfo *doc); void yelp_doc_info_unref (YelpDocInfo *doc); void yelp_doc_info_free (YelpDocInfo *doc); +YelpPager * yelp_doc_info_get_pager (YelpDocInfo *doc); +void yelp_doc_info_set_pager (YelpDocInfo *doc, + YelpPager *pager); + +YelpDocType yelp_doc_info_get_type (YelpDocInfo *doc); gchar * yelp_doc_info_get_uri (YelpDocInfo *doc, - gchar *frag_id); + gchar *frag_id, + YelpURIType uri_type); gchar * yelp_doc_info_get_filename (YelpDocInfo *doc); gboolean yelp_doc_info_equal (YelpDocInfo *doc1, YelpDocInfo *doc2); diff --git a/src/yelp-window.c b/src/yelp-window.c index ad2827b0..79473070 100644 --- a/src/yelp-window.c +++ b/src/yelp-window.c @@ -131,6 +131,12 @@ static void html_title_changed_cb (YelpHtml *html, /** GtkTreeView Callbacks **/ static void tree_selection_changed_cb (GtkTreeSelection *selection, YelpWindow *window); +static void tree_drag_data_get_cb (GtkWidget *widget, + GdkDragContext *context, + GtkSelectionData *selection, + guint info, + guint32 time, + YelpWindow *window); /** UIManager Callbacks **/ static void window_add_widget (GtkUIManager *ui_manager, @@ -139,6 +145,7 @@ static void window_add_widget (GtkUIManager *ui_manager, static void window_new_window_cb (GtkAction *action, YelpWindow *window); static void window_open_location_cb (GtkAction *action, YelpWindow *window); static void window_close_window_cb (GtkAction *action, YelpWindow *window); +static void window_copy_cb (GtkAction *action, YelpWindow *window); static void window_find_cb (GtkAction *action, YelpWindow *window); static void window_go_back_cb (GtkAction *action, YelpWindow *window); static void window_go_forward_cb (GtkAction *action, YelpWindow *window); @@ -245,6 +252,15 @@ struct _IdleWriterContext { static gboolean idle_write (IdleWriterContext *context); +#define TARGET_TYPE_URI_LIST "text/uri-list" +enum { + TARGET_URI_LIST +}; + +static GtkTargetEntry row_targets[] = { + { TARGET_TYPE_URI_LIST, 0, TARGET_URI_LIST } +}; + static GtkActionEntry entries[] = { { "FileMenu", NULL, N_("_File") }, { "EditMenu", NULL, N_("_Edit") }, @@ -267,6 +283,11 @@ static GtkActionEntry entries[] = { NULL, G_CALLBACK (window_close_window_cb) }, + { "Copy", GTK_STOCK_COPY, + N_("_Copy"), + "<Control>C", + NULL, + G_CALLBACK (window_copy_cb) }, { "Find", GTK_STOCK_FIND, N_("_Find..."), "<Control>F", @@ -567,9 +588,6 @@ yelp_window_load (YelpWindow *window, gchar *uri) } frag_id = yelp_uri_get_fragment (uri); - d (printf (" doc_info = \"%s\"\n", doc_info->uri)); - d (printf (" frag_id = \"%s\"\n", frag_id)); - 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)) @@ -613,17 +631,14 @@ window_do_load (YelpWindow *window, YelpWindowPriv *priv; GError *error = NULL; gboolean handled = FALSE; + gchar *uri; g_return_if_fail (YELP_IS_WINDOW (window)); g_return_if_fail (doc_info != NULL); - d (printf ("window_do_load\n")); - d (printf (" doc_info = \"%s\"\n", doc_info->uri)); - d (printf (" frag_id = \"%s\"\n", frag_id)); - priv = window->priv; - switch (doc_info->type) { + switch (yelp_doc_info_get_type (doc_info)) { case YELP_DOC_TYPE_DOCBOOK_XML: case YELP_DOC_TYPE_MAN: case YELP_DOC_TYPE_INFO: @@ -637,7 +652,9 @@ window_do_load (YelpWindow *window, handled = window_do_load_html (window, doc_info, frag_id); break; case YELP_DOC_TYPE_EXTERNAL: - gnome_url_show (doc_info->uri, &error); + uri = yelp_doc_info_get_uri (doc_info, NULL, YELP_URI_TYPE_ANY); + gnome_url_show (uri, &error); + g_free (uri); break; case YELP_DOC_TYPE_ERROR: default: @@ -756,11 +773,20 @@ window_populate (YelpWindow *window) "text", 1, NULL); + gtk_tree_view_enable_model_drag_source (GTK_TREE_VIEW (priv->side_sects), + GDK_BUTTON1_MASK, + row_targets, + G_N_ELEMENTS (row_targets), + GDK_ACTION_LINK); + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->side_sects)); g_signal_connect (selection, "changed", G_CALLBACK (tree_selection_changed_cb), window); + g_signal_connect (priv->side_sects, "drag_data_get", + G_CALLBACK (tree_drag_data_get_cb), + window); gtk_container_add (GTK_CONTAINER (priv->side_sw), priv->side_sects); gtk_paned_add1 (GTK_PANED (priv->pane), priv->side_sw); @@ -895,6 +921,7 @@ window_do_load_pager (YelpWindow *window, { YelpWindowPriv *priv; YelpPagerState state; + YelpPager *pager; GError *error = NULL; YelpPage *page = NULL; gboolean loadnow = FALSE; @@ -906,36 +933,36 @@ window_do_load_pager (YelpWindow *window, g_return_val_if_fail (YELP_IS_WINDOW (window), FALSE); g_return_val_if_fail (doc_info != NULL, FALSE); - d (printf ("window_do_load_pager\n")); - d (printf (" doc_info = \"%s\"\n", doc_info->uri)); - d (printf (" frag_id = \"%s\"\n", frag_id)); - priv = window->priv; - uri = yelp_doc_info_get_uri (doc_info, frag_id); + uri = yelp_doc_info_get_uri (doc_info, frag_id, YELP_URI_TYPE_FILE); window_disconnect (window); - if (!doc_info->pager) { - switch (doc_info->type) { + pager = yelp_doc_info_get_pager (doc_info); + + if (!pager) { + switch (yelp_doc_info_get_type (doc_info)) { case YELP_DOC_TYPE_DOCBOOK_XML: - doc_info->pager = yelp_db_pager_new (doc_info); + pager = yelp_db_pager_new (doc_info); break; case YELP_DOC_TYPE_INFO: // FIXME: yelp_info_pager_new (doc_info); break; case YELP_DOC_TYPE_MAN: - doc_info->pager = yelp_man_pager_new (doc_info); + pager = yelp_man_pager_new (doc_info); break; case YELP_DOC_TYPE_TOC: - doc_info->pager = YELP_PAGER (yelp_toc_pager_get ()); + pager = YELP_PAGER (yelp_toc_pager_get ()); break; default: break; } + if (pager) + yelp_doc_info_set_pager (doc_info, pager); } - if (!doc_info->pager) { + if (!pager) { yelp_set_error (&error, YELP_ERROR_NO_DOC); window_error (window, error); g_error_free (error); @@ -943,15 +970,15 @@ window_do_load_pager (YelpWindow *window, goto done; } - g_object_ref (doc_info->pager); + g_object_ref (pager); loadnow = FALSE; startnow = FALSE; - state = yelp_pager_get_state (doc_info->pager); + state = yelp_pager_get_state (pager); switch (state) { case YELP_PAGER_STATE_ERROR: - error = yelp_pager_get_error (doc_info->pager); + error = yelp_pager_get_error (pager); if (error) window_error (window, error); handled = FALSE; @@ -960,9 +987,9 @@ window_do_load_pager (YelpWindow *window, case YELP_PAGER_STATE_RUNNING: case YELP_PAGER_STATE_FINISHED: /* Check if the page exists */ - pager_start_cb (doc_info->pager, window); + pager_start_cb (pager, window); - page = (YelpPage *) yelp_pager_get_page (doc_info->pager, frag_id); + page = (YelpPage *) yelp_pager_get_page (pager, frag_id); if (!page && (state == YELP_PAGER_STATE_FINISHED)) { yelp_set_error (&error, YELP_ERROR_NO_PAGE); window_error (window, error); @@ -980,7 +1007,7 @@ window_do_load_pager (YelpWindow *window, case YELP_PAGER_STATE_STARTED: case YELP_PAGER_STATE_PARSING: priv->start_handler = - g_signal_connect (doc_info->pager, + g_signal_connect (pager, "start", G_CALLBACK (pager_start_cb), window); @@ -990,7 +1017,7 @@ window_do_load_pager (YelpWindow *window, } window_set_sections (window, - yelp_pager_get_sections (doc_info->pager)); + yelp_pager_get_sections (pager)); if (loadnow) { window_handle_page (window, page); @@ -1000,23 +1027,23 @@ window_do_load_pager (YelpWindow *window, window_set_loading (window); priv->page_handler = - g_signal_connect (doc_info->pager, + g_signal_connect (pager, "page", G_CALLBACK (pager_page_cb), window); priv->error_handler = - g_signal_connect (doc_info->pager, + g_signal_connect (pager, "error", G_CALLBACK (pager_error_cb), window); priv->finish_handler = - g_signal_connect (doc_info->pager, + g_signal_connect (pager, "finish", G_CALLBACK (pager_finish_cb), window); if (startnow) - handled = yelp_pager_start (doc_info->pager); + handled = yelp_pager_start (pager); // FIXME: error if !handled } @@ -1047,7 +1074,7 @@ window_do_load_html (YelpWindow *window, priv = window->priv; - uri = yelp_doc_info_get_uri (doc_info, frag_id); + uri = yelp_doc_info_get_uri (doc_info, frag_id, YELP_URI_TYPE_FILE); window_set_sections (window, NULL); @@ -1061,7 +1088,7 @@ window_do_load_html (YelpWindow *window, if (action) g_object_set (G_OBJECT (action), "sensitive", FALSE, NULL); - result = gnome_vfs_open (&handle, doc_info->uri, GNOME_VFS_OPEN_READ); + result = gnome_vfs_open (&handle, uri, GNOME_VFS_OPEN_READ); if (result != GNOME_VFS_OK) { GError *error = NULL; @@ -1140,7 +1167,7 @@ window_handle_page (YelpWindow *window, YelpPage *page) { YelpWindowPriv *priv; - + YelpPager *pager; GtkAction *action; GtkTreeModel *model; GtkTreeIter iter; @@ -1161,6 +1188,7 @@ window_handle_page (YelpWindow *window, d (printf (" page->contents = %i bytes\n", strlen (page->contents))); model = gtk_tree_view_get_model (GTK_TREE_VIEW (priv->side_sects)); + pager = yelp_doc_info_get_pager (priv->current_doc); if (model) { valid = gtk_tree_model_get_iter_first (model, &iter); @@ -1168,7 +1196,7 @@ window_handle_page (YelpWindow *window, gtk_tree_model_get (model, &iter, 0, &id, -1); - if (yelp_pager_page_contains_frag (priv->current_doc->pager, + if (yelp_pager_page_contains_frag (pager, id, priv->current_frag)) { GtkTreePath *path = gtk_tree_model_get_path (model, &iter); @@ -1229,7 +1257,9 @@ window_handle_page (YelpWindow *window, context->buffer = page->contents; context->length = strlen (page->contents); - uri = yelp_doc_info_get_uri (priv->current_doc, page->page_id); + uri = yelp_doc_info_get_uri (priv->current_doc, + page->page_id, + YELP_URI_TYPE_FILE); d (printf (" uri = %s\n", uri)); @@ -1252,30 +1282,35 @@ window_handle_page (YelpWindow *window, static void window_disconnect (YelpWindow *window) { - YelpWindowPriv *priv = window->priv; + YelpWindowPriv *priv; + YelpPager *pager; + g_return_if_fail (YELP_IS_WINDOW (window)); + priv = window->priv; + pager = yelp_doc_info_get_pager (priv->current_doc); + if (GTK_WIDGET (window)->window) gdk_window_set_cursor (GTK_WIDGET (window)->window, NULL); if (window->priv->current_doc) { if (priv->start_handler) { - g_signal_handler_disconnect (priv->current_doc->pager, + g_signal_handler_disconnect (pager, priv->start_handler); priv->start_handler = 0; } if (priv->page_handler) { - g_signal_handler_disconnect (priv->current_doc->pager, + g_signal_handler_disconnect (pager, priv->page_handler); priv->page_handler = 0; } if (priv->error_handler) { - g_signal_handler_disconnect (priv->current_doc->pager, + g_signal_handler_disconnect (pager, priv->error_handler); priv->error_handler = 0; } if (priv->finish_handler) { - g_signal_handler_disconnect (priv->current_doc->pager, + g_signal_handler_disconnect (pager, priv->finish_handler); priv->finish_handler = 0; } @@ -1441,31 +1476,72 @@ static void tree_selection_changed_cb (GtkTreeSelection *selection, YelpWindow *window) { - GtkTreeModel *model; - GtkTreeIter iter; - gchar *id, *frag; + YelpWindowPriv *priv; + GtkTreeModel *model; + GtkTreeIter iter; + gchar *id, *uri; - // FIXME + g_return_if_fail (YELP_IS_WINDOW (window)); - /* - YelpWindowPriv *priv = window->priv; + priv = window->priv; if (gtk_tree_selection_get_selected (selection, NULL, &iter)) { model = gtk_tree_view_get_model (GTK_TREE_VIEW (priv->side_sects)); - gtk_tree_model_get (model, &iter, 0, &id, -1); + uri = yelp_doc_info_get_uri (priv->current_doc, id, YELP_URI_TYPE_ANY); + yelp_window_load (window, uri); + g_free (uri); + } +} - frag = g_strconcat ("#", id, NULL); - uri = yelp_uri_resolve_relative - (yelp_window_get_current_uri (window), frag); +static void +tree_drag_data_get_cb (GtkWidget *widget, + GdkDragContext *context, + GtkSelectionData *selection, + guint info, + guint32 time, + YelpWindow *window) +{ + YelpWindowPriv *priv; + GtkTreeSelection *tree_selection; + GtkTreeModel *model; + GtkTreeIter iter; + gchar *id, *uri; - yelp_window_load (window, uri); + g_return_if_fail (YELP_IS_WINDOW (window)); + + d (printf ("tree_drag_data_get_cb\n")); - g_free (frag); + priv = window->priv; + + tree_selection = + gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->side_sects)); + + if (gtk_tree_selection_get_selected (tree_selection, NULL, &iter)) { + model = gtk_tree_view_get_model (GTK_TREE_VIEW (priv->side_sects)); + gtk_tree_model_get (model, &iter, + 0, &id, + -1); + uri = yelp_doc_info_get_uri (priv->current_doc, id, + YELP_URI_TYPE_NO_FILE); + if (!uri) + uri = yelp_doc_info_get_uri (priv->current_doc, id, + YELP_URI_TYPE_FILE); } - */ + + switch (info) { + case TARGET_URI_LIST: + gtk_selection_data_set (selection, + selection->target, + 8, uri, strlen (uri)); + break; + default: + g_assert_not_reached (); + } + + g_free (uri); } /** UIManager Callbacks *******************************************************/ @@ -1533,6 +1609,11 @@ window_close_window_cb (GtkAction *action, YelpWindow *window) } static void +window_copy_cb (GtkAction *action, YelpWindow *window) +{ +} + +static void window_find_cb (GtkAction *action, YelpWindow *window) { YelpWindowPriv *priv; @@ -1615,51 +1696,60 @@ static void window_go_previous_cb (GtkAction *action, YelpWindow *window) { YelpWindowPriv *priv; - gchar *uri; + gchar *base, *uri; d (printf ("window_go_previous_cb\n")); g_return_if_fail (YELP_IS_WINDOW (window)); g_return_if_fail (window->priv->current_doc); priv = window->priv; - uri = yelp_uri_get_relative (priv->current_doc->uri, - priv->prev_id); + base = yelp_doc_info_get_uri (priv->current_doc, NULL, YELP_URI_TYPE_ANY); + uri = yelp_uri_get_relative (base, priv->prev_id); + yelp_window_load (window, uri); + g_free (uri); + g_free (base); } static void window_go_next_cb (GtkAction *action, YelpWindow *window) { YelpWindowPriv *priv; - gchar *uri; + gchar *base, *uri; - d (printf ("window_go_previous_cb\n")); + d (printf ("window_go_next_cb\n")); g_return_if_fail (YELP_IS_WINDOW (window)); g_return_if_fail (window->priv->current_doc); priv = window->priv; - uri = yelp_uri_get_relative (priv->current_doc->uri, - priv->next_id); + base = yelp_doc_info_get_uri (priv->current_doc, NULL, YELP_URI_TYPE_ANY); + uri = yelp_uri_get_relative (base, priv->next_id); + yelp_window_load (window, uri); + g_free (uri); + g_free (base); } static void window_go_toc_cb (GtkAction *action, YelpWindow *window) { YelpWindowPriv *priv; - gchar *uri; + gchar *base, *uri; - d (printf ("window_go_previous_cb\n")); + d (printf ("window_go_toc_cb\n")); g_return_if_fail (YELP_IS_WINDOW (window)); g_return_if_fail (window->priv->current_doc); priv = window->priv; - uri = yelp_uri_get_relative (priv->current_doc->uri, - priv->toc_id); + base = yelp_doc_info_get_uri (priv->current_doc, NULL, YELP_URI_TYPE_ANY); + uri = yelp_uri_get_relative (base, priv->toc_id); + yelp_window_load (window, uri); + g_free (uri); + g_free (base); } static void @@ -1710,7 +1800,8 @@ location_response_cb (GtkDialog *dialog, gint id, YelpWindow *window) d (printf (" id = %i\n", id)); if (id == GTK_RESPONSE_OK) { - const gchar *uri = gtk_entry_get_text (window->priv->location_entry); + const gchar *uri = + gtk_entry_get_text (GTK_ENTRY (window->priv->location_entry)); yelp_window_load (window, uri); } |