2 * Copyright (C) 2003, 2004 Marco Pesenti Gritti
3 * Copyright (C) 2003, 2004 Christian Persch
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2, or (at your option)
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24 #include "ev-navigation-action.h"
25 #include "ev-window.h"
27 #include <gtk/gtklabel.h>
28 #include <gtk/gtkimage.h>
29 #include <gtk/gtkmenuitem.h>
30 #include <gtk/gtkimagemenuitem.h>
31 #include <gtk/gtkmenushell.h>
32 #include <gtk/gtkmenu.h>
33 #include <gtk/gtkmenutoolbutton.h>
35 struct _EvNavigationActionPrivate
38 EvNavigationDirection direction;
49 static void ev_navigation_action_init (EvNavigationAction *action);
50 static void ev_navigation_action_class_init (EvNavigationActionClass *class);
52 static GObjectClass *parent_class = NULL;
54 G_DEFINE_TYPE (EvNavigationAction, ev_navigation_action, GTK_TYPE_ACTION)
56 #define EV_NAVIGATION_ACTION_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), EV_TYPE_NAVIGATION_ACTION, EvNavigationActionPrivate))
59 build_menu (EvNavigationAction *action)
63 menu = GTK_MENU_SHELL (gtk_menu_new ());
65 return GTK_WIDGET (menu);
69 menu_activated_cb (GtkMenuToolButton *button,
70 EvNavigationAction *action)
74 menu = build_menu (action);
75 gtk_menu_tool_button_set_menu (button, menu);
79 set_tooltip_cb (GtkMenuToolButton *proxy,
80 GtkTooltips *tooltips,
82 const char *tip_private,
83 EvNavigationAction *action)
85 gtk_menu_tool_button_set_arrow_tooltip (proxy, tooltips,
86 action->priv->arrow_tooltip,
89 /* don't stop emission */
94 connect_proxy (GtkAction *action, GtkWidget *proxy)
96 if (GTK_IS_MENU_TOOL_BUTTON (proxy))
100 /* set dummy menu so the arrow gets sensitive */
101 menu = gtk_menu_new ();
102 gtk_menu_tool_button_set_menu (GTK_MENU_TOOL_BUTTON (proxy), menu);
104 g_signal_connect (proxy, "show-menu",
105 G_CALLBACK (menu_activated_cb), action);
107 g_signal_connect (proxy, "set-tooltip",
108 G_CALLBACK (set_tooltip_cb), action);
111 GTK_ACTION_CLASS (parent_class)->connect_proxy (action, proxy);
115 ev_navigation_action_init (EvNavigationAction *action)
117 action->priv = EV_NAVIGATION_ACTION_GET_PRIVATE (action);
121 ev_navigation_action_finalize (GObject *object)
123 EvNavigationAction *action = EV_NAVIGATION_ACTION (object);
125 g_free (action->priv->arrow_tooltip);
127 parent_class->finalize (object);
131 ev_navigation_action_set_property (GObject *object,
136 EvNavigationAction *nav = EV_NAVIGATION_ACTION (object);
140 case PROP_ARROW_TOOLTIP:
141 nav->priv->arrow_tooltip = g_value_dup_string (value);
142 g_object_notify (object, "tooltip");
145 nav->priv->direction = g_value_get_int (value);
151 ev_navigation_action_get_property (GObject *object,
156 EvNavigationAction *nav = EV_NAVIGATION_ACTION (object);
160 case PROP_ARROW_TOOLTIP:
161 g_value_set_string (value, nav->priv->arrow_tooltip);
164 g_value_set_int (value, nav->priv->direction);
170 ev_navigation_action_class_init (EvNavigationActionClass *class)
172 GObjectClass *object_class = G_OBJECT_CLASS (class);
173 GtkActionClass *action_class = GTK_ACTION_CLASS (class);
175 object_class->finalize = ev_navigation_action_finalize;
176 object_class->set_property = ev_navigation_action_set_property;
177 object_class->get_property = ev_navigation_action_get_property;
179 parent_class = g_type_class_peek_parent (class);
181 action_class->toolbar_item_type = GTK_TYPE_MENU_TOOL_BUTTON;
182 action_class->connect_proxy = connect_proxy;
184 g_object_class_install_property (object_class,
186 g_param_spec_string ("arrow-tooltip",
192 g_object_class_install_property (object_class,
194 g_param_spec_int ("direction",
202 g_type_class_add_private (object_class, sizeof (EvNavigationActionPrivate));