Update Spanish translation
[gnumeric.git] / src / gnm-graph-window.c
blob59536d5c70e3c2fb32725ad47d078b4695ef8c25
1 #include <gnumeric-config.h>
3 #include <gnm-graph-window.h>
4 #include <application.h>
6 #include <string.h>
8 #include <glib/gi18n-lib.h>
10 #include <goffice/goffice.h>
12 struct _GnmGraphWindow {
13 GtkWindow parent;
15 GtkWidget *vbox;
17 GtkWidget *toolbar;
18 GtkWidget *size_combo;
20 GtkWidget *scrolled_window;
22 GtkWidget *graph;
23 double graph_height;
24 double graph_width;
26 gboolean is_fullscreen;
29 struct _GnmGraphWindowClass {
30 GtkWindowClass parent_class;
33 /* keep in sync with gnm_graph_window_init */
34 typedef enum {
35 CHART_SIZE_FIT = 0,
36 CHART_SIZE_FIT_WIDTH,
37 CHART_SIZE_FIT_HEIGHT,
38 /* separator */
39 CHART_SIZE_100 = 4,
40 CHART_SIZE_125,
41 CHART_SIZE_150,
42 CHART_SIZE_200,
43 CHART_SIZE_300,
44 CHART_SIZE_500
45 } ChartSize;
47 G_DEFINE_TYPE (GnmGraphWindow, gnm_graph_window, GTK_TYPE_WINDOW)
48 #define parent_class gnm_graph_window_parent_class
50 static void
51 fullscreen_button_clicked (GtkToolButton *button,
52 GnmGraphWindow *window)
54 if (!window->is_fullscreen) {
55 gtk_window_fullscreen (GTK_WINDOW (window));
56 gtk_tool_button_set_icon_name (button, "view-restore");
57 } else {
58 gtk_window_unfullscreen (GTK_WINDOW (window));
59 gtk_tool_button_set_icon_name (button, "view-fullscreen");
62 window->is_fullscreen = !window->is_fullscreen;
65 static void
66 update_graph_sizing_mode (GnmGraphWindow *window)
68 int height, width;
69 gboolean obey_ratio;
70 GOGraphWidgetSizeMode size_mode;
71 ChartSize size;
73 g_return_if_fail (GO_IS_GRAPH_WIDGET (window->graph));
75 obey_ratio = FALSE;
77 size = gtk_combo_box_get_active (GTK_COMBO_BOX (window->size_combo));
78 switch (size) {
79 case CHART_SIZE_FIT:
80 size_mode = GO_GRAPH_WIDGET_SIZE_MODE_FIT;
81 height = width = -1;
82 obey_ratio = TRUE;
83 break;
85 case CHART_SIZE_FIT_WIDTH:
86 size_mode = GO_GRAPH_WIDGET_SIZE_MODE_FIT_WIDTH;
87 height = width = -1;
88 obey_ratio = TRUE;
89 break;
91 case CHART_SIZE_FIT_HEIGHT:
92 size_mode = GO_GRAPH_WIDGET_SIZE_MODE_FIT_HEIGHT;
93 height = width = -1;
94 obey_ratio = TRUE;
95 break;
97 case CHART_SIZE_100:
98 size_mode = GO_GRAPH_WIDGET_SIZE_MODE_FIXED_SIZE;
99 width = window->graph_width;
100 height = window->graph_height;
101 break;
103 case CHART_SIZE_125:
104 size_mode = GO_GRAPH_WIDGET_SIZE_MODE_FIXED_SIZE;
105 width = window->graph_width * 1.25;
106 height = window->graph_height * 1.25;
107 break;
109 case CHART_SIZE_150:
110 size_mode = GO_GRAPH_WIDGET_SIZE_MODE_FIXED_SIZE;
111 width = window->graph_width * 1.50;
112 height = window->graph_height * 1.50;
113 break;
115 case CHART_SIZE_200:
116 size_mode = GO_GRAPH_WIDGET_SIZE_MODE_FIXED_SIZE;
117 width = window->graph_width * 2.0;
118 height = window->graph_height * 2.0;
119 break;
121 case CHART_SIZE_300:
122 size_mode = GO_GRAPH_WIDGET_SIZE_MODE_FIXED_SIZE;
123 width = window->graph_width * 3.0;
124 height = window->graph_height * 3.0;
125 break;
127 case CHART_SIZE_500:
128 size_mode = GO_GRAPH_WIDGET_SIZE_MODE_FIXED_SIZE;
129 width = window->graph_width * 5.0;
130 height = window->graph_height * 5.0;
131 break;
133 default:
134 g_assert_not_reached ();
135 return;
138 g_object_set (window->graph,
139 "aspect-ratio", obey_ratio ? window->graph_height / window->graph_width : 0.0,
140 NULL);
141 go_graph_widget_set_size_mode (GO_GRAPH_WIDGET (window->graph), size_mode, width, height);
144 static gboolean
145 size_combo_is_row_separator (GtkTreeModel *model,
146 GtkTreeIter *iter,
147 G_GNUC_UNUSED gpointer data)
149 gboolean is_sep;
150 char *str;
152 gtk_tree_model_get (model, iter, 0, &str, -1);
153 is_sep = (strcmp (str, "SEPARATOR") == 0);
155 g_free (str);
157 return is_sep;
160 static void
161 gnm_graph_window_init (GnmGraphWindow *window)
163 GtkToolItem *item;
164 unsigned int i;
166 /* these indexes match the ChartSize enum */
167 static char const * chart_sizes[] = {
168 N_("Fit"),
169 N_("Fit Width"),
170 N_("Fit Height"),
171 "SEPARATOR",
172 N_("100%"),
173 N_("125%"),
174 N_("150%"),
175 N_("200%"),
176 N_("300%"),
177 N_("500%")
180 window->vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
181 gtk_widget_show (GTK_WIDGET (window->vbox));
182 gtk_container_add (GTK_CONTAINER (window), window->vbox);
184 window->toolbar = gtk_toolbar_new ();
185 gtk_widget_show (GTK_WIDGET (window->toolbar));
186 gtk_box_pack_start (GTK_BOX (window->vbox), window->toolbar, FALSE, FALSE, 0);
188 window->scrolled_window = gtk_scrolled_window_new (NULL, NULL);
189 gtk_widget_show (GTK_WIDGET (window->scrolled_window));
190 gtk_container_add (GTK_CONTAINER (window->vbox), window->scrolled_window);
191 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (window->scrolled_window),
192 GTK_POLICY_NEVER, GTK_POLICY_NEVER);
194 item = gtk_tool_item_new ();
195 gtk_widget_show (GTK_WIDGET (item));
196 gtk_toolbar_insert (GTK_TOOLBAR (window->toolbar), item, -1);
198 window->size_combo = gtk_combo_box_text_new ();
199 for (i = 0; i < G_N_ELEMENTS (chart_sizes); i++)
200 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (window->size_combo), _(chart_sizes[i]));
201 gtk_widget_set_sensitive (window->size_combo, FALSE);
202 gtk_widget_show (window->size_combo);
203 gtk_combo_box_set_active (GTK_COMBO_BOX (window->size_combo), CHART_SIZE_FIT);
204 gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (window->size_combo),
205 size_combo_is_row_separator, NULL, NULL);
206 gtk_container_add (GTK_CONTAINER (item), window->size_combo);
207 g_signal_connect_swapped (window->size_combo, "changed",
208 G_CALLBACK (update_graph_sizing_mode), window);
210 item = g_object_new (GTK_TYPE_TOOL_BUTTON,
211 "icon-name", "view-fullscreen",
212 NULL);
213 gtk_widget_show (GTK_WIDGET (item));
215 gtk_toolbar_insert (GTK_TOOLBAR (window->toolbar), item, -1);
216 g_signal_connect (item, "clicked",
217 G_CALLBACK (fullscreen_button_clicked), window);
219 gtk_window_set_title (GTK_WINDOW (window), "Chart Viewer");
222 static void
223 gnm_graph_window_class_init (GnmGraphWindowClass *class)
227 static void
228 gnm_graph_window_set_graph (GnmGraphWindow *window,
229 GogGraph *graph,
230 gdouble graph_width,
231 gdouble graph_height)
233 GtkRequisition toolbar_requisition;
234 GogGraph *old_graph =
235 window->graph != NULL ?
236 go_graph_widget_get_graph (GO_GRAPH_WIDGET (window->graph)) :
237 NULL;
239 if (graph == old_graph)
240 return;
242 if (old_graph != NULL) {
243 gtk_container_remove (GTK_CONTAINER (window->scrolled_window), window->graph);
244 g_object_unref (window->graph);
245 window->graph = NULL;
248 if (graph != NULL) {
249 graph = gog_graph_dup (graph);
250 window->graph = g_object_new (GO_TYPE_GRAPH_WIDGET,
251 "graph", graph,
252 "hres", gnm_app_display_dpi_get (TRUE),
253 "vres", gnm_app_display_dpi_get (FALSE),
254 NULL);
255 g_object_unref (graph);
256 gtk_widget_show (window->graph);
257 gtk_container_add (GTK_CONTAINER (window->scrolled_window), window->graph);
258 g_object_set (G_OBJECT (window->graph), "expand", TRUE, NULL);
260 gtk_widget_get_preferred_size (window->toolbar, &toolbar_requisition, NULL);
261 gtk_window_set_default_size (GTK_WINDOW (window),
262 (int) graph_width,
263 (int) graph_height + toolbar_requisition.height);
265 window->graph_width = graph_width;
266 window->graph_height = graph_height;
268 /* ensure that the aspect ratio is updated */
269 gtk_widget_set_sensitive (window->size_combo, TRUE);
270 g_signal_emit_by_name (window->size_combo, "changed");
274 GtkWidget *
275 gnm_graph_window_new (GogGraph *graph,
276 gdouble graph_width,
277 gdouble graph_height)
279 GtkWidget *ret;
281 g_return_val_if_fail (GOG_IS_GRAPH (graph), NULL);
283 ret = g_object_new (gnm_graph_window_get_type (), NULL);
284 gnm_graph_window_set_graph (GNM_GRAPH_WINDOW (ret), graph, graph_width, graph_height);
286 return ret;