]> www.fi.muni.cz Git - evince.git/blob - shell/ev-navigation-action.c
Change the layout to match clarkbw design.
[evince.git] / shell / ev-navigation-action.c
1 /*
2  *  Copyright (C) 2003, 2004 Marco Pesenti Gritti
3  *  Copyright (C) 2003, 2004 Christian Persch
4  *
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)
8  *  any later version.
9  *
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.
14  *
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.
18  *
19  *  $Id$
20  */
21
22 #include "config.h"
23
24 #include "ev-navigation-action.h"
25 #include "ev-window.h"
26
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>
34
35 struct _EvNavigationActionPrivate
36 {
37         EvWindow *window;
38         EvNavigationDirection direction;
39         char *arrow_tooltip;
40 };
41
42 enum
43 {
44         PROP_0,
45         PROP_ARROW_TOOLTIP,
46         PROP_DIRECTION
47 };
48
49 static void ev_navigation_action_init       (EvNavigationAction *action);
50 static void ev_navigation_action_class_init (EvNavigationActionClass *class);
51
52 static GObjectClass *parent_class = NULL;
53
54 G_DEFINE_TYPE (EvNavigationAction, ev_navigation_action, GTK_TYPE_ACTION)
55
56 #define EV_NAVIGATION_ACTION_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), EV_TYPE_NAVIGATION_ACTION, EvNavigationActionPrivate))
57
58 static GtkWidget *
59 build_menu (EvNavigationAction *action)
60 {
61         GtkMenuShell *menu;
62
63         menu = GTK_MENU_SHELL (gtk_menu_new ());
64
65         return GTK_WIDGET (menu);
66 }
67
68 static void
69 menu_activated_cb (GtkMenuToolButton *button,
70                    EvNavigationAction *action)
71 {
72         GtkWidget *menu;
73
74         menu = build_menu (action);
75         gtk_menu_tool_button_set_menu (button, menu);
76 }
77
78 static gboolean
79 set_tooltip_cb (GtkMenuToolButton *proxy,
80                 GtkTooltips *tooltips,
81                 const char *tip,
82                 const char *tip_private,
83                 EvNavigationAction *action)
84 {
85         gtk_menu_tool_button_set_arrow_tooltip (proxy, tooltips,
86                                                 action->priv->arrow_tooltip,
87                                                 NULL);
88
89         /* don't stop emission */
90         return FALSE;
91 }
92
93 static void
94 connect_proxy (GtkAction *action, GtkWidget *proxy)
95 {
96         if (GTK_IS_MENU_TOOL_BUTTON (proxy))
97         {
98                 GtkWidget *menu;
99
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);
103
104                 g_signal_connect (proxy, "show-menu",
105                                   G_CALLBACK (menu_activated_cb), action);
106
107                 g_signal_connect (proxy, "set-tooltip",
108                                   G_CALLBACK (set_tooltip_cb), action);
109         }
110
111         GTK_ACTION_CLASS (parent_class)->connect_proxy (action, proxy);
112 }
113
114 static void
115 ev_navigation_action_init (EvNavigationAction *action)
116 {
117         action->priv = EV_NAVIGATION_ACTION_GET_PRIVATE (action);
118 }
119
120 static void
121 ev_navigation_action_finalize (GObject *object)
122 {
123         EvNavigationAction *action = EV_NAVIGATION_ACTION (object);
124
125         g_free (action->priv->arrow_tooltip);
126
127         parent_class->finalize (object);
128 }
129
130 static void
131 ev_navigation_action_set_property (GObject *object,
132                                      guint prop_id,
133                                      const GValue *value,
134                                      GParamSpec *pspec)
135 {
136         EvNavigationAction *nav = EV_NAVIGATION_ACTION (object);
137
138         switch (prop_id)
139         {
140                 case PROP_ARROW_TOOLTIP:
141                         nav->priv->arrow_tooltip = g_value_dup_string (value);
142                         g_object_notify (object, "tooltip");
143                         break;
144                 case PROP_DIRECTION:
145                         nav->priv->direction = g_value_get_int (value);
146                         break;
147         }
148 }
149
150 static void
151 ev_navigation_action_get_property (GObject *object,
152                                      guint prop_id,
153                                      GValue *value,
154                                      GParamSpec *pspec)
155 {
156         EvNavigationAction *nav = EV_NAVIGATION_ACTION (object);
157
158         switch (prop_id)
159         {
160                 case PROP_ARROW_TOOLTIP:
161                         g_value_set_string (value, nav->priv->arrow_tooltip);
162                         break;
163                 case PROP_DIRECTION:
164                         g_value_set_int (value, nav->priv->direction);
165                         break;
166         }
167 }
168
169 static void
170 ev_navigation_action_class_init (EvNavigationActionClass *class)
171 {
172         GObjectClass *object_class = G_OBJECT_CLASS (class);
173         GtkActionClass *action_class = GTK_ACTION_CLASS (class);
174
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;
178
179         parent_class = g_type_class_peek_parent (class);
180
181         action_class->toolbar_item_type = GTK_TYPE_MENU_TOOL_BUTTON;
182         action_class->connect_proxy = connect_proxy;
183
184         g_object_class_install_property (object_class,
185                                          PROP_ARROW_TOOLTIP,
186                                          g_param_spec_string ("arrow-tooltip",
187                                                               "Arrow Tooltip",
188                                                               "Arrow Tooltip",
189                                                               NULL,
190                                                               G_PARAM_READWRITE));
191
192         g_object_class_install_property (object_class,
193                                          PROP_DIRECTION,
194                                          g_param_spec_int ("direction",
195                                                            "Direction",
196                                                            "Direction",
197                                                            0,
198                                                            G_MAXINT,
199                                                            0,
200                                                            G_PARAM_READWRITE));
201
202         g_type_class_add_private (object_class, sizeof (EvNavigationActionPrivate));
203 }