1 #include <gnumeric-config.h>
3 #include <gnm-graph-window.h>
4 #include <application.h>
8 #include <glib/gi18n-lib.h>
10 #include <goffice/goffice.h>
12 struct _GnmGraphWindow
{
18 GtkWidget
*size_combo
;
20 GtkWidget
*scrolled_window
;
26 gboolean is_fullscreen
;
29 struct _GnmGraphWindowClass
{
30 GtkWindowClass parent_class
;
33 /* keep in sync with gnm_graph_window_init */
37 CHART_SIZE_FIT_HEIGHT
,
47 G_DEFINE_TYPE (GnmGraphWindow
, gnm_graph_window
, GTK_TYPE_WINDOW
)
48 #define parent_class gnm_graph_window_parent_class
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");
58 gtk_window_unfullscreen (GTK_WINDOW (window
));
59 gtk_tool_button_set_icon_name (button
, "view-fullscreen");
62 window
->is_fullscreen
= !window
->is_fullscreen
;
66 update_graph_sizing_mode (GnmGraphWindow
*window
)
70 GOGraphWidgetSizeMode size_mode
;
73 g_return_if_fail (GO_IS_GRAPH_WIDGET (window
->graph
));
77 size
= gtk_combo_box_get_active (GTK_COMBO_BOX (window
->size_combo
));
80 size_mode
= GO_GRAPH_WIDGET_SIZE_MODE_FIT
;
85 case CHART_SIZE_FIT_WIDTH
:
86 size_mode
= GO_GRAPH_WIDGET_SIZE_MODE_FIT_WIDTH
;
91 case CHART_SIZE_FIT_HEIGHT
:
92 size_mode
= GO_GRAPH_WIDGET_SIZE_MODE_FIT_HEIGHT
;
98 size_mode
= GO_GRAPH_WIDGET_SIZE_MODE_FIXED_SIZE
;
99 width
= window
->graph_width
;
100 height
= window
->graph_height
;
104 size_mode
= GO_GRAPH_WIDGET_SIZE_MODE_FIXED_SIZE
;
105 width
= window
->graph_width
* 1.25;
106 height
= window
->graph_height
* 1.25;
110 size_mode
= GO_GRAPH_WIDGET_SIZE_MODE_FIXED_SIZE
;
111 width
= window
->graph_width
* 1.50;
112 height
= window
->graph_height
* 1.50;
116 size_mode
= GO_GRAPH_WIDGET_SIZE_MODE_FIXED_SIZE
;
117 width
= window
->graph_width
* 2.0;
118 height
= window
->graph_height
* 2.0;
122 size_mode
= GO_GRAPH_WIDGET_SIZE_MODE_FIXED_SIZE
;
123 width
= window
->graph_width
* 3.0;
124 height
= window
->graph_height
* 3.0;
128 size_mode
= GO_GRAPH_WIDGET_SIZE_MODE_FIXED_SIZE
;
129 width
= window
->graph_width
* 5.0;
130 height
= window
->graph_height
* 5.0;
134 g_assert_not_reached ();
138 g_object_set (window
->graph
,
139 "aspect-ratio", obey_ratio
? window
->graph_height
/ window
->graph_width
: 0.0,
141 go_graph_widget_set_size_mode (GO_GRAPH_WIDGET (window
->graph
), size_mode
, width
, height
);
145 size_combo_is_row_separator (GtkTreeModel
*model
,
147 G_GNUC_UNUSED gpointer data
)
152 gtk_tree_model_get (model
, iter
, 0, &str
, -1);
153 is_sep
= (strcmp (str
, "SEPARATOR") == 0);
161 gnm_graph_window_init (GnmGraphWindow
*window
)
166 /* these indexes match the ChartSize enum */
167 static char const * chart_sizes
[] = {
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",
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");
223 gnm_graph_window_class_init (GnmGraphWindowClass
*class)
228 gnm_graph_window_set_graph (GnmGraphWindow
*window
,
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
)) :
239 if (graph
== old_graph
)
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
;
249 graph
= gog_graph_dup (graph
);
250 window
->graph
= g_object_new (GO_TYPE_GRAPH_WIDGET
,
252 "hres", gnm_app_display_dpi_get (TRUE
),
253 "vres", gnm_app_display_dpi_get (FALSE
),
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
),
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");
275 gnm_graph_window_new (GogGraph
*graph
,
277 gdouble graph_height
)
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
);