+/* Callback for data_save_as action. Prompt for a filename and save */
+static void
+data_save_as_dialog (GtkAction *action, struct data_editor *de)
+{
+ struct editor_window *e = (struct editor_window *) de;
+
+ GtkWidget *button_sys;
+ GtkWidget *dialog =
+ gtk_file_chooser_dialog_new (_("Save"),
+ GTK_WINDOW (e->window),
+ GTK_FILE_CHOOSER_ACTION_SAVE,
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+ GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
+ NULL);
+
+ GtkFileFilter *filter = gtk_file_filter_new ();
+ gtk_file_filter_set_name (filter, _("System Files (*.sav)"));
+ gtk_file_filter_add_pattern (filter, "*.sav");
+ gtk_file_filter_add_pattern (filter, "*.SAV");
+ gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
+
+ filter = gtk_file_filter_new ();
+ gtk_file_filter_set_name (filter, _("Portable Files (*.por) "));
+ gtk_file_filter_add_pattern (filter, "*.por");
+ gtk_file_filter_add_pattern (filter, "*.POR");
+ gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
+
+ filter = gtk_file_filter_new ();
+ gtk_file_filter_set_name (filter, _("All Files"));
+ gtk_file_filter_add_pattern (filter, "*");
+ gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
+
+ {
+ GtkWidget *button_por;
+ GtkWidget *vbox = gtk_vbox_new (TRUE, 5);
+ button_sys =
+ gtk_radio_button_new_with_label (NULL, _("System File"));
+
+ button_por =
+ gtk_radio_button_new_with_label
+ (gtk_radio_button_get_group (GTK_RADIO_BUTTON(button_sys)),
+ _("Portable File"));
+
+ gtk_box_pack_start_defaults (GTK_BOX (vbox), button_sys);
+ gtk_box_pack_start_defaults (GTK_BOX (vbox), button_por);
+
+ gtk_widget_show_all (vbox);
+
+ gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER(dialog), vbox);
+ }
+
+ switch (gtk_dialog_run (GTK_DIALOG (dialog)))
+ {
+ case GTK_RESPONSE_ACCEPT:
+ {
+ g_free (de->file_name);
+
+ de->file_name =
+ gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
+
+ de->save_as_portable =
+ ! gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button_sys));
+
+ save_file (de);
+
+ window_set_name_from_filename (e, de->file_name);
+ }
+ break;
+ default:
+ break;
+ }
+
+ gtk_widget_destroy (dialog);
+}
+
+
+/* Callback for data_new action.
+ Performs the NEW FILE command */
+static void
+new_file (GtkAction *action, struct editor_window *e)
+{
+ struct data_editor *de = (struct data_editor *) e;
+
+ struct getl_interface *sss =
+ create_syntax_string_source ("NEW FILE.");
+
+ execute_syntax (sss);
+
+ g_free (de->file_name);
+ de->file_name = NULL;
+
+ default_window_name (e);
+}
+
+
+static void
+open_data_file (const gchar *file_name, struct data_editor *de)
+{
+ struct getl_interface *sss;
+ struct string filename;
+
+ ds_init_cstr (&filename, file_name);
+
+ gen_quoted_string (&filename);
+
+ sss = create_syntax_string_source ("GET FILE=%s.",
+ ds_cstr (&filename));
+
+ execute_syntax (sss);
+ ds_destroy (&filename);
+
+ window_set_name_from_filename ((struct editor_window *) de, file_name);
+}
+
+
+/* Callback for the data_open action.
+ Prompts for a filename and opens it */
+static void
+open_data_dialog (GtkAction *action, struct data_editor *de)
+{
+ struct editor_window *e = (struct editor_window *) de;
+
+ GtkWidget *dialog =
+ gtk_file_chooser_dialog_new (_("Open"),
+ GTK_WINDOW (e->window),
+ GTK_FILE_CHOOSER_ACTION_OPEN,
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+ GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
+ NULL);
+
+ GtkFileFilter *filter = gtk_file_filter_new ();
+ gtk_file_filter_set_name (filter, _("System Files (*.sav)"));
+ gtk_file_filter_add_pattern (filter, "*.sav");
+ gtk_file_filter_add_pattern (filter, "*.SAV");
+ gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
+
+ filter = gtk_file_filter_new ();
+ gtk_file_filter_set_name (filter, _("Portable Files (*.por) "));
+ gtk_file_filter_add_pattern (filter, "*.por");
+ gtk_file_filter_add_pattern (filter, "*.POR");
+ gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
+
+ filter = gtk_file_filter_new ();
+ gtk_file_filter_set_name (filter, _("All Files"));
+ gtk_file_filter_add_pattern (filter, "*");
+ gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
+
+ switch (gtk_dialog_run (GTK_DIALOG (dialog)))
+ {
+ case GTK_RESPONSE_ACCEPT:
+ {
+ g_free (de->file_name);
+ de->file_name =
+ gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
+
+ open_data_file (de->file_name, de);
+
+#if RECENT_LISTS_AVAILABLE
+ {
+ GtkRecentManager *manager = gtk_recent_manager_get_default();
+ gchar *uri = g_filename_to_uri (de->file_name, NULL, NULL);
+
+ if ( ! gtk_recent_manager_add_item (manager, uri))
+ g_warning ("Could not add item %s to recent list\n",uri);
+
+ g_free (uri);
+ }
+#endif
+
+ }
+ break;
+ default:
+ break;
+ }
+
+ gtk_widget_destroy (dialog);
+}
+
+
+
+/* Update the data_ref_entry with the reference of the active cell */
+static gint
+update_data_ref_entry (const GtkSheet *sheet, gint row, gint col, gpointer data)
+{
+ GladeXML *data_editor_xml = data;
+
+ PsppireDataStore *data_store =
+ PSPPIRE_DATA_STORE (gtk_sheet_get_model (sheet));
+
+ g_return_val_if_fail (data_editor_xml, FALSE);
+
+ if (data_store)
+ {
+ const struct variable *var =
+ psppire_dict_get_variable (data_store->dict, col);
+
+ /* The entry where the reference to the current cell is displayed */
+ GtkEntry *cell_ref_entry =
+ GTK_ENTRY (get_widget_assert (data_editor_xml,
+ "cell_ref_entry"));
+ GtkEntry *datum_entry =
+ GTK_ENTRY (get_widget_assert (data_editor_xml,
+ "datum_entry"));
+
+ if ( var )
+ {
+ gchar *text = g_strdup_printf ("%d: %s", row + FIRST_CASE_NUMBER,
+ var_get_name (var));
+
+ gchar *s = pspp_locale_to_utf8 (text, -1, 0);
+
+ g_free (text);
+
+ gtk_entry_set_text (cell_ref_entry, s);
+
+ g_free (s);
+ }
+ else
+ gtk_entry_set_text (cell_ref_entry, "");
+
+
+ if ( var )
+ {
+ gchar *text =
+ psppire_data_store_get_string (data_store, row,
+ var_get_dict_index(var));
+ g_strchug (text);
+
+ gtk_entry_set_text (datum_entry, text);
+
+ free (text);
+ }
+ else
+ gtk_entry_set_text (datum_entry, "");
+ }
+
+ return FALSE;
+}