+
+#define DEFAULT_ROW_HEIGHT 25
+
+static void
+new_data_callback (PsppireDataStore *ds, gpointer data)
+{
+ PsppireDataEditor *de = PSPPIRE_DATA_EDITOR (data);
+ gint i;
+ for (i = 0 ; i < 4 ; ++i)
+ {
+ PsppireAxisUniform *vaxis;
+ casenumber n_cases = psppire_case_file_get_case_count (ds->case_file);
+
+ g_object_get (de->data_sheet[i], "vertical-axis", &vaxis, NULL);
+
+ psppire_axis_uniform_set_count (vaxis, n_cases);
+ }
+}
+
+static void
+new_variables_callback (PsppireDict *dict, gpointer data)
+{
+ gint v, i;
+ PsppireDataEditor *de = PSPPIRE_DATA_EDITOR (data);
+
+ PsppireAxisHetero *vaxis;
+ g_object_get (de->var_sheet, "vertical-axis", &vaxis, NULL);
+
+ psppire_axis_hetero_clear (vaxis);
+
+ for (v = 0 ; v < psppire_dict_get_var_cnt (dict); ++v)
+ psppire_axis_hetero_append (vaxis, DEFAULT_ROW_HEIGHT);
+
+ for (i = 0 ; i < 4 ; ++i)
+ {
+ PsppireAxisHetero *haxis;
+ g_object_get (de->data_sheet[i], "horizontal-axis", &haxis, NULL);
+
+ psppire_axis_hetero_clear (haxis);
+
+ for (v = 0 ; v < psppire_dict_get_var_cnt (dict); ++v)
+ {
+ const struct variable *var = psppire_dict_get_variable (dict, v);
+
+ psppire_axis_hetero_append (haxis, 10 * var_get_display_width (var));
+ }
+ }
+}
+
+/* Return the width (in pixels) of an upper case M when rendered in the
+ current font of W
+*/
+static gint
+width_of_m (GtkWidget *w)
+{
+ PangoRectangle rect;
+ PangoLayout *layout = gtk_widget_create_pango_layout (w, "M");
+
+ pango_layout_get_pixel_extents (layout, NULL, &rect);
+
+ g_object_unref (layout);
+
+ return rect.width;
+}
+
+static void
+insert_variable_callback (PsppireDict *dict, gint x, gpointer data)
+{
+ gint i;
+
+ PsppireDataEditor *de = PSPPIRE_DATA_EDITOR (data);
+
+ gint m_width = width_of_m (GTK_WIDGET (de));
+
+ PsppireAxisHetero *var_vaxis;
+ g_object_get (de->var_sheet, "vertical-axis", &var_vaxis, NULL);
+
+ psppire_axis_hetero_insert (var_vaxis, DEFAULT_ROW_HEIGHT, x);
+
+ for (i = 0 ; i < 4 ; ++i)
+ {
+ const struct variable *var = psppire_dict_get_variable (dict, x);
+ PsppireAxisHetero *haxis;
+ g_object_get (de->data_sheet[i], "horizontal-axis", &haxis, NULL);
+
+ psppire_axis_hetero_insert (haxis, m_width * var_get_display_width (var), x);
+ }
+}
+
+
+static void
+delete_variable_callback (PsppireDict *dict, gint posn,
+ gint x UNUSED, gint y UNUSED, gpointer data)
+{
+ gint i;
+ PsppireDataEditor *de = PSPPIRE_DATA_EDITOR (data);
+
+ PsppireAxisHetero *var_vaxis;
+ g_object_get (de->var_sheet, "vertical-axis", &var_vaxis, NULL);
+
+ psppire_axis_hetero_remove (var_vaxis, posn);
+
+ for (i = 0 ; i < 4 ; ++i)
+ {
+ PsppireAxisHetero *haxis;
+ g_object_get (de->data_sheet[i], "horizontal-axis", &haxis, NULL);
+
+ psppire_axis_hetero_remove (haxis, posn);
+ }
+}
+
+
+static void
+rewidth_variable_callback (PsppireDict *dict, gint posn, gpointer data)
+{
+ gint i;
+ PsppireDataEditor *de = PSPPIRE_DATA_EDITOR (data);
+ gint m_width = width_of_m (GTK_WIDGET (de));
+
+ for (i = 0 ; i < 4 ; ++i)
+ {
+ const struct variable *var = psppire_dict_get_variable (dict, posn);
+ PsppireAxisHetero *haxis;
+ g_object_get (de->data_sheet[i], "horizontal-axis", &haxis, NULL);
+
+ psppire_axis_hetero_resize_unit (haxis,
+ m_width *
+ var_get_display_width (var), posn);
+ }
+}
+
+