summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog20
-rw-r--r--data/ui/yelp-ui.xml2
-rw-r--r--src/Makefile.am1
-rw-r--r--src/test-uri.c70
-rw-r--r--src/yelp-base.c6
-rw-r--r--src/yelp-cache.h2
-rw-r--r--src/yelp-pager.c3
-rw-r--r--src/yelp-utils.c179
-rw-r--r--src/yelp-utils.h40
-rw-r--r--src/yelp-window.c223
10 files changed, 406 insertions, 140 deletions
diff --git a/ChangeLog b/ChangeLog
index 9762a9f0..f5652a51 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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);
}