summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShaun McCance <shaunm@gnome.org>2010-03-15 16:43:39 -0500
committerShaun McCance <shaunm@gnome.org>2010-03-15 16:43:39 -0500
commitc5e5136c89108a02e937ec8203d2393374c021fc (patch)
tree38a29f42c2d4968b02cbe73a058856223cf28eca
parentcc04e44175b4f210b4b5b1192d280cccee30c84e (diff)
downloadyelp-c5e5136c89108a02e937ec8203d2393374c021fc.tar.gz
[yelp-window.c] Adding menu with Close, plus new Ctrl+L entry
-rw-r--r--data/ui/yelp-ui.xml14
-rw-r--r--src/yelp-application.c4
-rw-r--r--src/yelp-window.c193
3 files changed, 198 insertions, 13 deletions
diff --git a/data/ui/yelp-ui.xml b/data/ui/yelp-ui.xml
index e3ab6d43..a7f3ab73 100644
--- a/data/ui/yelp-ui.xml
+++ b/data/ui/yelp-ui.xml
@@ -1,6 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<ui>
<menubar>
+ <menu action="PageMenu">
+ <menuitem action="Close"/>
+ </menu>
+ <menu action="ViewMenu">
+ </menu>
+ <menu action="GoMenu">
+ </menu>
+ </menubar>
+ <accelerator action="OpenLocation"/>
+<!--
+ <menubar>
<menu action="FileMenu">
<menuitem action="NewWindow"/>
<separator/>
@@ -9,7 +20,6 @@
<menuitem action="PrintPage"/>
<menuitem action="PrintDocument"/>
<separator/>
- <menuitem action="CloseWindow"/>
</menu>
<menu action="EditMenu">
<menuitem action="Copy"/>
@@ -58,7 +68,7 @@
<popup name="mail_popup">
<menuitem name="CpMail" action="CopyMail"/>
</popup>
- <accelerator action="OpenLocation"/>
<accelerator action="Reload"/>
<accelerator action="TextCursor"/>
+-->
</ui>
diff --git a/src/yelp-application.c b/src/yelp-application.c
index d12f7300..14b7b05a 100644
--- a/src/yelp-application.c
+++ b/src/yelp-application.c
@@ -258,8 +258,8 @@ application_uri_resolved (YelpUri *uri,
static gboolean
application_window_deleted (YelpWindow *window,
- GdkEvent *event,
- YelpApplication *app)
+ GdkEvent *event,
+ YelpApplication *app)
{
gchar *doc_uri; /* owned by windows_by_document */
YelpApplicationPrivate *priv = GET_PRIV (app);
diff --git a/src/yelp-window.c b/src/yelp-window.c
index 4ec84adc..53fced6b 100644
--- a/src/yelp-window.c
+++ b/src/yelp-window.c
@@ -24,6 +24,7 @@
#include <config.h>
#endif
+#include <gdk/gdkkeysyms.h>
#include <glib/gi18n.h>
#include <gtk/gtk.h>
@@ -40,6 +41,11 @@ static void yelp_window_class_init (YelpWindowClass *klass);
static void yelp_window_dispose (GObject *object);
static void yelp_window_finalize (GObject *object);
+static void window_close (GtkAction *action,
+ YelpWindow *window);
+static void window_open_location (GtkAction *action,
+ YelpWindow *window);
+
static void entry_location_selected (YelpLocationEntry *entry,
YelpWindow *window);
@@ -56,6 +62,13 @@ static void view_page_desc (YelpView *view,
GParamSpec *pspec,
YelpWindow *window);
+static void hidden_entry_activate (GtkEntry *entry,
+ YelpWindow *window);
+static void hidden_entry_hide (YelpWindow *window);
+static gboolean hidden_key_press (GtkWidget *widget,
+ GdkEventKey *event,
+ YelpWindow *window);
+
G_DEFINE_TYPE (YelpWindow, yelp_window, GTK_TYPE_WINDOW);
#define GET_PRIV(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), YELP_TYPE_WINDOW, YelpWindowPrivate))
@@ -91,8 +104,14 @@ struct _YelpWindowPrivate {
/* no refs on these, owned by containers */
YelpView *view;
- YelpLocationEntry *entry;
GtkWidget *back_button;
+ GtkWidget *hbox;
+ YelpLocationEntry *entry;
+ GtkWidget *hidden_entry;
+
+ /* refs because we dynamically add & remove */
+ GtkWidget *align_location;
+ GtkWidget *align_hidden;
GSList *back_list;
gboolean back_load;
@@ -100,10 +119,30 @@ struct _YelpWindowPrivate {
gulong entry_location_selected;
};
+static const GtkActionEntry entries[] = {
+ { "PageMenu", NULL, N_("_Page") },
+ { "ViewMenu", NULL, N_("_View") },
+ { "GoMenu", NULL, N_("_Go") },
+
+ { "Close", GTK_STOCK_CLOSE,
+ N_("_Close"),
+ "<Control>W",
+ NULL,
+ G_CALLBACK (window_close) },
+ { "OpenLocation", NULL,
+ N_("Open _Location"),
+ "<Control>L",
+ NULL,
+ G_CALLBACK (window_open_location) }
+};
+
static void
yelp_window_init (YelpWindow *window)
{
- GtkWidget *vbox, *hbox, *scroll, *align;;
+ GtkWidget *vbox, *scroll;
+ GtkActionGroup *action_group;
+ GtkUIManager *ui_manager;
+ GError *error = NULL;
YelpWindowPrivate *priv = GET_PRIV (window);
gtk_window_set_type_hint (GTK_WINDOW (window), GDK_WINDOW_TYPE_HINT_UTILITY);
@@ -112,12 +151,38 @@ yelp_window_init (YelpWindow *window)
vbox = gtk_vbox_new (FALSE, 0);
gtk_container_add (GTK_CONTAINER (window), vbox);
- hbox = gtk_hbox_new (FALSE, 0);
- gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
+ action_group = gtk_action_group_new ("MenuActions");
+ gtk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE);
+ gtk_action_group_add_actions (action_group,
+ entries, G_N_ELEMENTS (entries),
+ window);
+ ui_manager = gtk_ui_manager_new ();
+ gtk_ui_manager_insert_action_group (ui_manager, action_group, 0);
+ gtk_window_add_accel_group (GTK_WINDOW (window),
+ gtk_ui_manager_get_accel_group (ui_manager));
+ if (!gtk_ui_manager_add_ui_from_file (ui_manager,
+ DATADIR "/yelp/ui/yelp-ui.xml",
+ &error)) {
+ GtkWidget *dialog = gtk_message_dialog_new (NULL, 0,
+ GTK_MESSAGE_ERROR,
+ GTK_BUTTONS_OK,
+ "%s", _("Cannot create window"));
+ gtk_message_dialog_format_secondary_markup (GTK_MESSAGE_DIALOG (dialog), "%s",
+ error->message);
+ gtk_dialog_run (GTK_DIALOG (dialog));
+ gtk_widget_destroy (dialog);
+ g_error_free (error);
+ }
+ gtk_box_pack_start (GTK_BOX (vbox),
+ gtk_ui_manager_get_widget (ui_manager, "/ui/menubar"),
+ FALSE, FALSE, 0);
+
+ priv->hbox = gtk_hbox_new (FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (vbox), priv->hbox, FALSE, FALSE, 0);
priv->back_button = (GtkWidget *) gtk_tool_button_new_from_stock (GTK_STOCK_GO_BACK);
g_signal_connect (priv->back_button, "clicked", back_button_clicked, window);
- gtk_box_pack_start (GTK_BOX (hbox), priv->back_button, FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (priv->hbox), priv->back_button, FALSE, FALSE, 0);
priv->history = gtk_list_store_new (6,
G_TYPE_STRING, /* title */
@@ -135,9 +200,22 @@ yelp_window_init (YelpWindow *window)
COL_FLAGS);
priv->entry_location_selected = g_signal_connect (priv->entry, "location-selected",
G_CALLBACK (entry_location_selected), window);
- align = gtk_alignment_new (0.0, 0.5, 1.0, 0.0);
- gtk_box_pack_start (GTK_BOX (hbox), GTK_WIDGET (align), TRUE, TRUE, 0);
- gtk_container_add (GTK_CONTAINER (align), GTK_WIDGET (priv->entry));
+ priv->align_location = g_object_ref_sink (gtk_alignment_new (0.0, 0.5, 1.0, 0.0));
+ gtk_box_pack_start (GTK_BOX (priv->hbox),
+ GTK_WIDGET (priv->align_location),
+ TRUE, TRUE, 0);
+ gtk_container_add (GTK_CONTAINER (priv->align_location), GTK_WIDGET (priv->entry));
+
+ priv->hidden_entry = gtk_entry_new ();
+ priv->align_hidden = g_object_ref_sink (gtk_alignment_new (0.0, 0.5, 1.0, 0.0));
+ gtk_container_add (GTK_CONTAINER (priv->align_hidden), GTK_WIDGET (priv->hidden_entry));
+
+ g_signal_connect (priv->hidden_entry, "activate",
+ G_CALLBACK (hidden_entry_activate), window);
+ g_signal_connect_swapped (priv->hidden_entry, "focus-out-event",
+ G_CALLBACK (hidden_entry_hide), window);
+ g_signal_connect (priv->hidden_entry, "key-press-event",
+ G_CALLBACK (hidden_key_press), window);
scroll = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll),
@@ -174,6 +252,16 @@ yelp_window_dispose (GObject *object)
priv->history = NULL;
}
+ if (priv->align_location) {
+ g_object_unref (priv->align_location);
+ priv->align_location = NULL;
+ }
+
+ if (priv->align_hidden) {
+ g_object_unref (priv->align_hidden);
+ priv->align_hidden = NULL;
+ }
+
while (priv->back_list) {
back_entry_free ((YelpBackEntry *) priv->back_list->data);
priv->back_list = g_slist_delete_link (priv->back_list, priv->back_list);
@@ -213,6 +301,55 @@ yelp_window_load_uri (YelpWindow *window,
/******************************************************************************/
static void
+window_close (GtkAction *action, YelpWindow *window)
+{
+ gboolean ret;
+ g_signal_emit_by_name (window, "delete-event", NULL, &ret);
+ gtk_widget_destroy (GTK_WIDGET (window));
+}
+
+static void
+window_open_location (GtkAction *action, YelpWindow *window)
+{
+ gchar *uri = NULL;
+ const GdkColor yellow;
+ gchar *color;
+ YelpWindowPrivate *priv = GET_PRIV (window);
+
+ gtk_container_remove (GTK_CONTAINER (priv->hbox),
+ priv->align_location);
+ gtk_box_pack_start (GTK_BOX (priv->hbox),
+ priv->align_hidden,
+ TRUE, TRUE, 0);
+
+ gtk_widget_show_all (priv->align_hidden);
+ gtk_entry_set_text (GTK_ENTRY (priv->hidden_entry), "");
+ gtk_widget_grab_focus (priv->hidden_entry);
+
+ color = yelp_settings_get_color (yelp_settings_get_default (),
+ YELP_SETTINGS_COLOR_YELLOW_BASE);
+ if (gdk_color_parse (color, &yellow)) {
+ gtk_widget_modify_base (priv->hidden_entry,
+ GTK_STATE_NORMAL,
+ &yellow);
+ }
+ g_free (color);
+
+ if (priv->back_list && priv->back_list->data)
+ uri = yelp_uri_get_canonical_uri (((YelpBackEntry *) priv->back_list->data)->uri);
+ if (uri) {
+ gchar *c;
+ gtk_entry_set_text (GTK_ENTRY (priv->hidden_entry), uri);
+ c = strchr (uri, ':');
+ if (c)
+ gtk_editable_select_region (GTK_EDITABLE (priv->hidden_entry), c - uri + 1, -1);
+ else
+ gtk_editable_select_region (GTK_EDITABLE (priv->hidden_entry), 5, -1);
+ g_free (uri);
+ }
+}
+
+static void
entry_location_selected (YelpLocationEntry *entry,
YelpWindow *window)
{
@@ -220,7 +357,7 @@ entry_location_selected (YelpLocationEntry *entry,
gchar *uri;
YelpWindowPrivate *priv = GET_PRIV (window);
- gtk_combo_box_get_active_iter (GTK_COMBO_BOX (priv->entry), &iter);
+ gtk_tree_model_get_iter_first (GTK_TREE_MODEL (priv->history), &iter);
gtk_tree_model_get (GTK_TREE_MODEL (priv->history), &iter,
COL_URI, &uri,
-1);
@@ -404,3 +541,41 @@ view_page_desc (YelpView *view,
back->desc = g_strdup (desc);
}
}
+
+static void
+hidden_entry_activate (GtkEntry *entry,
+ YelpWindow *window)
+{
+ YelpWindowPrivate *priv = GET_PRIV (window);
+ YelpUri *uri = yelp_uri_new (gtk_entry_get_text (entry));
+
+ yelp_window_load_uri (window, uri);
+ g_object_unref (uri);
+
+ gtk_widget_grab_focus (GTK_WIDGET (priv->view));
+}
+
+static void
+hidden_entry_hide (YelpWindow *window)
+{
+ YelpWindowPrivate *priv = GET_PRIV (window);
+
+ gtk_container_remove (GTK_CONTAINER (priv->hbox),
+ priv->align_hidden);
+ gtk_box_pack_start (GTK_BOX (priv->hbox),
+ priv->align_location,
+ TRUE, TRUE, 0);
+}
+
+static gboolean
+hidden_key_press (GtkWidget *widget,
+ GdkEventKey *event,
+ YelpWindow *window)
+{
+ YelpWindowPrivate *priv = GET_PRIV (window);
+ if (event->keyval == GDK_Escape) {
+ gtk_widget_grab_focus (GTK_WIDGET (priv->view));
+ return TRUE;
+ }
+ return FALSE;
+}