+static void
+case_inserted_callback (PsppireDataStore *ds, gint before, gpointer data)
+{
+ gint i;
+ PsppireDataEditor *de = PSPPIRE_DATA_EDITOR (data);
+
+ for (i = 0; i < 2; ++i)
+ psppire_axis_insert (de->vaxis[i], before, DEFAULT_ROW_HEIGHT);
+}
+
+
+static void
+cases_deleted_callback (PsppireDataStore *ds, gint first, gint n_cases, gpointer data)
+{
+ gint i;
+ PsppireDataEditor *de = PSPPIRE_DATA_EDITOR (data);
+
+ for (i = 0; i < 2; ++i)
+ psppire_axis_delete (de->vaxis[0], first, n_cases);
+}
+
+
+
+/* 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;
+}
+
+/* Callback for the axis' resize signal.
+ Changes the variable's display width */
+static void
+rewidth_variable (GtkWidget *w, gint unit, glong size)
+{
+ PsppireDataEditor *de = PSPPIRE_DATA_EDITOR (w);
+
+ const PsppireDict *dict = de->data_store->dict;
+ struct variable *var = psppire_dict_get_variable (dict, unit);
+
+ if (NULL == var)
+ return;
+
+ var_set_display_width (var, size / (float) width_of_m (w));
+}
+
+