#include "ev-navigation-action.h"
#include "ev-navigation-action-widget.h"
-#include "ev-window.h"
#include <gtk/gtklabel.h>
#include <gtk/gtkimage.h>
#include <gtk/gtkmenutoolbutton.h>
#include <glib/gi18n.h>
+enum
+{
+ WIDGET_ACTIVATE_LINK,
+ WIDGET_N_SIGNALS
+};
+
+static guint widget_signals[WIDGET_N_SIGNALS] = {0, };
+
struct _EvNavigationActionPrivate
{
- EvWindow *window;
EvHistory *history;
};
#define EV_NAVIGATION_ACTION_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), EV_TYPE_NAVIGATION_ACTION, EvNavigationActionPrivate))
+static void
+ev_navigation_action_history_changed (EvHistory *history,
+ gpointer data)
+{
+ EvNavigationAction *action = EV_NAVIGATION_ACTION (data);
+
+ gtk_action_set_sensitive (action, ev_history_get_n_links (history) > 0);
+
+ return;
+}
+
void
ev_navigation_action_set_history (EvNavigationAction *action,
EvHistory *history)
action->priv->history = history;
g_object_add_weak_pointer (G_OBJECT (action->priv->history),
- (gpointer *) &action->priv->history);
-}
-
-void
-ev_navigation_action_set_window (EvNavigationAction *action,
- EvWindow *window)
-{
- action->priv->window = window;
+ (gpointer) &action->priv->history);
+
+ g_signal_connect_object (history, "changed",
+ ev_navigation_action_history_changed,
+ action, 0);
}
static void
g_return_if_fail (EV_IS_HISTORY (action->priv->history));
index = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (widget), "index"));
- ev_history_set_current_index (action->priv->history, index);
- if (action->priv->window) {
+ if (action->priv->history) {
EvLink *link;
- EvLinkAction *link_action;
- EvLinkDest *dest;
link = ev_history_get_link_nth (action->priv->history, index);
- link_action = ev_link_get_action (link);
- dest = ev_link_action_get_dest (link_action);
- ev_window_goto_dest (action->priv->window, dest);
+ g_signal_emit (action, widget_signals[WIDGET_ACTIVATE_LINK], 0, link);
}
}
title = ev_link_get_title (link);
item = gtk_image_menu_item_new_with_label (title);
+ gtk_label_set_use_markup (GTK_LABEL (gtk_bin_get_child (GTK_BIN (item))), TRUE);
g_object_set_data (G_OBJECT (item), "index",
GINT_TO_POINTER (index));
return item;
}
-static GtkWidget *
-new_empty_history_menu_item (EvNavigationAction *action)
-{
- GtkWidget *item;
-
- item = gtk_image_menu_item_new_with_label (_("Empty"));
- gtk_widget_set_sensitive (item, FALSE);
- gtk_widget_show (item);
-
- return item;
-}
-
static GtkWidget *
build_menu (EvNavigationAction *action)
{
EvHistory *history = action->priv->history;
int start, end, i;
- menu = GTK_MENU_SHELL (gtk_menu_new ());
-
if (history == NULL || ev_history_get_n_links (history) <= 0) {
- item = new_empty_history_menu_item (action);
- gtk_menu_shell_append (menu, item);
- return GTK_WIDGET (menu);
+ return NULL;
}
+ menu = GTK_MENU_SHELL (gtk_menu_new ());
+
start = 0;
end = ev_history_get_n_links (history);
for (i = start; i < end; i++) {
link = ev_history_get_link_nth (history, i);
item = new_history_menu_item (action, link, i);
- gtk_menu_shell_append (menu, item);
+ gtk_menu_shell_prepend (menu, item);
}
return GTK_WIDGET (menu);
{
GtkWidget *menu;
- /* set dummy menu so the arrow gets sensitive */
- menu = gtk_menu_new ();
- ev_navigation_action_widget_set_menu (EV_NAVIGATION_ACTION_WIDGET (proxy), menu);
+ if (GTK_IS_TOOL_ITEM (proxy)) {
+ /* set dummy menu so the arrow gets sensitive */
+ menu = gtk_menu_new ();
+ ev_navigation_action_widget_set_menu (EV_NAVIGATION_ACTION_WIDGET (proxy), menu);
- g_signal_connect (proxy, "show-menu",
- G_CALLBACK (menu_activated_cb), action);
+ g_signal_connect (proxy, "show-menu",
+ G_CALLBACK (menu_activated_cb), action);
+ }
GTK_ACTION_CLASS (ev_navigation_action_parent_class)->connect_proxy (action, proxy);
}
return GTK_WIDGET (proxy);
}
+static GtkWidget *
+create_menu_item (GtkAction *action)
+{
+ GtkWidget *menu;
+ GtkWidget *menu_item;
+
+ menu = build_menu (EV_NAVIGATION_ACTION (action));
+
+ menu_item = GTK_ACTION_CLASS (ev_navigation_action_parent_class)->create_menu_item (action);
+
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu_item), menu);
+
+ gtk_widget_show (menu_item);
+
+ return menu_item;
+}
+
static void
ev_navigation_action_init (EvNavigationAction *action)
{
EvNavigationAction *action = EV_NAVIGATION_ACTION (object);
if (action->priv->history) {
- g_object_add_weak_pointer (G_OBJECT (action->priv->history),
- (gpointer *) &action->priv->history);
+ g_object_remove_weak_pointer (G_OBJECT (action->priv->history),
+ (gpointer) &action->priv->history);
+ action->priv->history = NULL;
}
G_OBJECT_CLASS (ev_navigation_action_parent_class)->finalize (object);
action_class->toolbar_item_type = GTK_TYPE_TOOL_ITEM;
action_class->create_tool_item = create_tool_item;
action_class->connect_proxy = connect_proxy;
+ action_class->create_menu_item = create_menu_item;
+
+ widget_signals[WIDGET_ACTIVATE_LINK] = g_signal_new ("activate_link",
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+ G_STRUCT_OFFSET (EvNavigationActionClass, activate_link),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__OBJECT,
+ G_TYPE_NONE, 1,
+ G_TYPE_OBJECT);
g_type_class_add_private (object_class, sizeof (EvNavigationActionPrivate));
}