2 PSPPIRE --- A Graphical User Interface for PSPP
3 Copyright (C) 2006, 2007 Free Software Foundation
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
24 #include <glade/glade.h>
27 #include "window-manager.h"
28 #include <gtksheet/gtksheet.h>
32 #include "psppire-dialog.h"
33 #include "psppire-var-select.h"
35 #define _(msgid) gettext (msgid)
36 #define N_(msgid) msgid
38 #include "data-editor.h"
39 #include "syntax-editor.h"
40 #include <language/syntax-string-source.h>
41 #include "window-manager.h"
43 #include "psppire-data-store.h"
44 #include "psppire-var-store.h"
46 #include "weight-cases-dialog.h"
48 static void register_data_editor_actions (struct data_editor *de);
50 static void insert_variable (GtkCheckMenuItem *m, gpointer data);
53 /* Switch between the VAR SHEET and the DATA SHEET */
54 enum {PAGE_DATA_SHEET = 0, PAGE_VAR_SHEET};
56 static gboolean click2column (GtkWidget *w, gint col, gpointer data);
58 static gboolean click2row (GtkWidget *w, gint row, gpointer data);
61 static void select_sheet (struct data_editor *de, guint page_num);
64 /* Callback for when the dictionary changes properties*/
65 static void on_weight_change (GObject *, gint, gpointer);
66 static void on_filter_change (GObject *, gint, gpointer);
67 static void on_split_change (PsppireDict *, gpointer);
69 static void data_var_select (GtkNotebook *notebook,
70 GtkNotebookPage *page,
74 static void status_bar_activate (GtkCheckMenuItem *, gpointer);
76 static void grid_lines_activate (GtkCheckMenuItem *, gpointer);
78 static void data_sheet_activate (GtkCheckMenuItem *, gpointer);
80 static void variable_sheet_activate (GtkCheckMenuItem *, gpointer );
82 static void fonts_activate (GtkMenuItem *, gpointer);
84 static void value_labels_activate (GtkCheckMenuItem *, gpointer);
85 static void value_labels_toggled (GtkToggleToolButton *, gpointer);
88 static void file_quit (GtkCheckMenuItem *, gpointer );
90 static void on_clear_activate (GtkMenuItem *, gpointer);
93 enable_edit_clear (GtkWidget *w, gint row, gpointer data)
95 struct data_editor *de = data;
97 GtkWidget *menuitem = get_widget_assert (de->xml, "edit_clear");
99 gtk_widget_set_sensitive (menuitem, TRUE);
103 disable_edit_clear (GtkWidget *w, gint x, gint y, gpointer data)
105 struct data_editor *de = data;
107 GtkWidget *menuitem = get_widget_assert (de->xml, "edit_clear");
109 gtk_widget_set_sensitive (menuitem, FALSE);
114 static void weight_cases_dialog (GObject *o, gpointer data);
118 Create a new data editor.
121 new_data_editor (void)
123 struct data_editor *de ;
124 struct editor_window *e;
125 GtkSheet *var_sheet ;
128 de = g_malloc0 (sizeof (*de));
130 e = (struct editor_window *) de;
132 de->xml = glade_xml_new (PKGDATADIR "/data-editor.glade", NULL, NULL);
135 var_sheet = GTK_SHEET (get_widget_assert (de->xml, "variable_sheet"));
137 vs = PSPPIRE_VAR_STORE (gtk_sheet_get_model (var_sheet));
139 g_signal_connect (vs->dict, "weight-changed",
140 G_CALLBACK (on_weight_change),
143 g_signal_connect (vs->dict, "filter-changed",
144 G_CALLBACK (on_filter_change),
147 g_signal_connect (vs->dict, "split-changed",
148 G_CALLBACK (on_split_change),
151 connect_help (de->xml);
154 register_data_editor_actions (de);
156 de->invoke_weight_cases_dialog =
157 gtk_action_new ("weight-cases-dialog",
159 _("Weight cases by variable"),
160 "pspp-weight-cases");
163 g_signal_connect (de->invoke_weight_cases_dialog, "activate",
164 G_CALLBACK (weight_cases_dialog), de);
166 e->window = GTK_WINDOW (get_widget_assert (de->xml, "data_editor"));
168 g_signal_connect_swapped (get_widget_assert (de->xml,"file_new_data"),
170 G_CALLBACK (gtk_action_activate),
171 de->action_data_new);
173 g_signal_connect_swapped (get_widget_assert (de->xml,"file_open_data"),
175 G_CALLBACK (gtk_action_activate),
176 de->action_data_open);
178 g_signal_connect (get_widget_assert (de->xml,"file_new_syntax"),
180 G_CALLBACK (new_syntax_window),
183 g_signal_connect (get_widget_assert (de->xml,"file_open_syntax"),
185 G_CALLBACK (open_syntax_window),
188 g_signal_connect_swapped (get_widget_assert (de->xml,"file_save"),
190 G_CALLBACK (gtk_action_activate),
191 de->action_data_save);
193 g_signal_connect_swapped (get_widget_assert (de->xml,"file_save_as"),
195 G_CALLBACK (gtk_action_activate),
196 de->action_data_save_as);
199 g_signal_connect (get_widget_assert (de->xml,"edit_clear"),
201 G_CALLBACK (on_clear_activate),
205 g_signal_connect (get_widget_assert (de->xml,"data_insert-variable"),
207 G_CALLBACK (insert_variable),
210 gtk_action_connect_proxy (de->invoke_weight_cases_dialog,
211 get_widget_assert (de->xml, "data_weight-cases")
215 g_signal_connect (get_widget_assert (de->xml,"help_about"),
217 G_CALLBACK (about_new),
221 g_signal_connect (get_widget_assert (de->xml,"help_reference"),
223 G_CALLBACK (reference_manual),
228 g_signal_connect (get_widget_assert (de->xml,"data_sheet"),
229 "double-click-column",
230 G_CALLBACK (click2column),
234 g_signal_connect (get_widget_assert (de->xml, "variable_sheet"),
236 GTK_SIGNAL_FUNC (click2row),
240 g_signal_connect (get_widget_assert (de->xml, "variable_sheet"),
242 GTK_SIGNAL_FUNC (enable_edit_clear),
245 g_signal_connect (get_widget_assert (de->xml, "variable_sheet"),
247 GTK_SIGNAL_FUNC (disable_edit_clear),
251 g_signal_connect (get_widget_assert (de->xml, "notebook"),
253 G_CALLBACK (data_var_select), de);
257 g_signal_connect (get_widget_assert (de->xml, "view_statusbar"),
259 G_CALLBACK (status_bar_activate), de);
262 g_signal_connect (get_widget_assert (de->xml, "view_gridlines"),
264 G_CALLBACK (grid_lines_activate), de);
268 g_signal_connect (get_widget_assert (de->xml, "view_data"),
270 G_CALLBACK (data_sheet_activate), de);
272 g_signal_connect (get_widget_assert (de->xml, "view_variables"),
274 G_CALLBACK (variable_sheet_activate), de);
278 g_signal_connect (get_widget_assert (de->xml, "view_fonts"),
280 G_CALLBACK (fonts_activate), de);
284 g_signal_connect (get_widget_assert (de->xml, "view_valuelabels"),
286 G_CALLBACK (value_labels_activate), de);
289 g_signal_connect (get_widget_assert (de->xml, "togglebutton-value-labels"),
291 G_CALLBACK (value_labels_toggled), de);
293 gtk_action_connect_proxy (de->action_data_open,
294 get_widget_assert (de->xml, "button-open")
297 gtk_action_connect_proxy (de->action_data_save,
298 get_widget_assert (de->xml, "button-save")
301 gtk_action_connect_proxy (de->invoke_weight_cases_dialog,
302 get_widget_assert (de->xml, "button-weight-cases")
305 g_signal_connect (get_widget_assert (de->xml, "file_quit"),
307 G_CALLBACK (file_quit), de);
310 g_signal_connect (get_widget_assert (de->xml, "windows_minimise_all"),
312 G_CALLBACK (minimise_all_windows), NULL);
315 select_sheet (de, PAGE_DATA_SHEET);
321 /* Callback which occurs when the var sheet's row title
322 button is double clicked */
324 click2row (GtkWidget *w, gint row, gpointer data)
326 struct data_editor *de = data;
328 gint current_row, current_column;
330 GtkWidget *data_sheet = get_widget_assert (de->xml, "data_sheet");
332 data_editor_select_sheet (de, PAGE_DATA_SHEET);
334 gtk_sheet_get_active_cell (GTK_SHEET (data_sheet),
335 ¤t_row, ¤t_column);
337 gtk_sheet_set_active_cell (GTK_SHEET (data_sheet), current_row, row);
343 /* Callback which occurs when the data sheet's column title
346 click2column (GtkWidget *w, gint col, gpointer data)
348 struct data_editor *de = data;
350 gint current_row, current_column;
352 GtkWidget *var_sheet = get_widget_assert (de->xml, "variable_sheet");
354 data_editor_select_sheet (de, PAGE_VAR_SHEET);
356 gtk_sheet_get_active_cell (GTK_SHEET (var_sheet),
357 ¤t_row, ¤t_column);
359 gtk_sheet_set_active_cell (GTK_SHEET (var_sheet), col, current_column);
366 new_data_window (GtkMenuItem *menuitem, gpointer parent)
368 window_create (WINDOW_DATA, NULL);
373 select_sheet (struct data_editor *de, guint page_num)
375 GtkWidget *insert_variable = get_widget_assert (de->xml, "data_insert-variable");
376 GtkWidget *insert_cases = get_widget_assert (de->xml, "insert-cases");
378 GtkWidget *view_data = get_widget_assert (de->xml, "view_data");
379 GtkWidget *view_variables = get_widget_assert (de->xml, "view_variables");
384 gtk_widget_hide (view_variables);
385 gtk_widget_show (view_data);
386 gtk_widget_set_sensitive (insert_variable, TRUE);
387 gtk_widget_set_sensitive (insert_cases, FALSE);
389 case PAGE_DATA_SHEET:
390 gtk_widget_show (view_variables);
391 gtk_widget_hide (view_data);
393 gtk_widget_set_sensitive (insert_cases, TRUE);
397 g_assert_not_reached ();
404 data_var_select (GtkNotebook *notebook,
405 GtkNotebookPage *page,
409 struct data_editor *de = user_data;
411 select_sheet (de, page_num);
418 data_editor_select_sheet (struct data_editor *de, gint page)
420 gtk_notebook_set_current_page
422 GTK_NOTEBOOK (get_widget_assert (de->xml,"notebook")), page
428 status_bar_activate (GtkCheckMenuItem *menuitem, gpointer data)
430 struct data_editor *de = data;
431 GtkWidget *statusbar = get_widget_assert (de->xml, "status-bar");
433 if ( gtk_check_menu_item_get_active (menuitem) )
434 gtk_widget_show (statusbar);
436 gtk_widget_hide (statusbar);
441 grid_lines_activate (GtkCheckMenuItem *menuitem, gpointer data)
443 struct data_editor *de = data;
444 const bool grid_visible = gtk_check_menu_item_get_active (menuitem);
446 gtk_sheet_show_grid (GTK_SHEET (get_widget_assert (de->xml,
450 gtk_sheet_show_grid (GTK_SHEET (get_widget_assert (de->xml, "data_sheet")),
457 data_sheet_activate (GtkCheckMenuItem *menuitem, gpointer data)
459 struct data_editor *de = data;
461 data_editor_select_sheet (de, PAGE_DATA_SHEET);
466 variable_sheet_activate (GtkCheckMenuItem *menuitem, gpointer data)
468 struct data_editor *de = data;
470 data_editor_select_sheet (de, PAGE_VAR_SHEET);
475 fonts_activate (GtkMenuItem *menuitem, gpointer data)
477 struct data_editor *de = data;
479 gtk_font_selection_dialog_new (_("Font Selection"));
481 gtk_window_set_transient_for (GTK_WINDOW (dialog),
482 GTK_WINDOW (get_widget_assert (de->xml,
484 if ( GTK_RESPONSE_OK == gtk_dialog_run (GTK_DIALOG (dialog)) )
486 GtkSheet *data_sheet =
487 GTK_SHEET (get_widget_assert (de->xml, "data_sheet"));
489 GtkSheet *var_sheet =
490 GTK_SHEET (get_widget_assert (de->xml, "variable_sheet"));
492 PsppireDataStore *ds = PSPPIRE_DATA_STORE (gtk_sheet_get_model (data_sheet));
493 PsppireVarStore *vs = PSPPIRE_VAR_STORE (gtk_sheet_get_model (var_sheet));
495 const gchar *font = gtk_font_selection_dialog_get_font_name
496 (GTK_FONT_SELECTION_DIALOG (dialog));
498 PangoFontDescription* font_desc =
499 pango_font_description_from_string (font);
501 psppire_var_store_set_font (vs, font_desc);
502 psppire_data_store_set_font (ds, font_desc);
505 gtk_widget_hide (dialog);
509 /* The next two callbacks are mutually co-operative */
511 /* Callback for the value labels menu item */
513 value_labels_activate (GtkCheckMenuItem *menuitem, gpointer data)
515 struct data_editor *de = data;
517 GtkSheet *data_sheet = GTK_SHEET (get_widget_assert (de->xml, "data_sheet"));
519 GtkToggleToolButton *tb =
520 GTK_TOGGLE_TOOL_BUTTON (get_widget_assert (de->xml,
521 "togglebutton-value-labels"));
523 PsppireDataStore *ds = PSPPIRE_DATA_STORE (gtk_sheet_get_model (data_sheet));
525 gboolean show_value_labels = gtk_check_menu_item_get_active (menuitem);
527 gtk_toggle_tool_button_set_active (tb, show_value_labels);
529 psppire_data_store_show_labels (ds, show_value_labels);
533 /* Callback for the value labels tooglebutton */
535 value_labels_toggled (GtkToggleToolButton *toggle_tool_button,
538 struct data_editor *de = data;
540 GtkSheet *data_sheet = GTK_SHEET (get_widget_assert (de->xml, "data_sheet"));
542 GtkCheckMenuItem *item =
543 GTK_CHECK_MENU_ITEM (get_widget_assert (de->xml, "view_valuelabels"));
545 PsppireDataStore *ds = PSPPIRE_DATA_STORE (gtk_sheet_get_model (data_sheet));
547 gboolean show_value_labels =
548 gtk_toggle_tool_button_get_active (toggle_tool_button);
550 gtk_check_menu_item_set_active (item, show_value_labels);
552 psppire_data_store_show_labels (ds, show_value_labels);
557 file_quit (GtkCheckMenuItem *menuitem, gpointer data)
559 /* FIXME: Need to be more intelligent here.
560 Give the user the opportunity to save any unsaved data.
567 /* Callback for when the Clear item in the edit menu is activated */
569 on_clear_activate (GtkMenuItem *menuitem, gpointer data)
571 struct data_editor *de = data;
573 GtkNotebook *notebook = GTK_NOTEBOOK (get_widget_assert (de->xml,
576 switch ( gtk_notebook_get_current_page (notebook) )
580 GtkSheet *var_sheet =
581 GTK_SHEET (get_widget_assert (de->xml, "variable_sheet"));
583 PsppireVarStore *vs = PSPPIRE_VAR_STORE
584 (gtk_sheet_get_model (var_sheet) );
586 /* This shouldn't be able to happen, because the menuitem
587 should be disabled */
588 g_return_if_fail (var_sheet->state == GTK_SHEET_ROW_SELECTED );
590 psppire_dict_delete_variables (vs->dict,
591 var_sheet->range.row0,
593 var_sheet->range.rowi -
594 var_sheet->range.row0 );
597 case PAGE_DATA_SHEET:
600 g_assert_not_reached ();
605 /* Insert a new variable before the current row in the variable sheet,
606 or before the current column in the data sheet, whichever is selected */
608 insert_variable (GtkCheckMenuItem *m, gpointer data)
610 struct data_editor *de = data;
613 GtkWidget *notebook = get_widget_assert (de->xml, "notebook");
615 GtkSheet *var_sheet =
616 GTK_SHEET (get_widget_assert (de->xml, "variable_sheet"));
618 PsppireVarStore *vs = PSPPIRE_VAR_STORE
619 (gtk_sheet_get_model (var_sheet) );
621 switch ( gtk_notebook_get_current_page ( GTK_NOTEBOOK (notebook)) )
624 posn = var_sheet->active_cell.row;
626 case PAGE_DATA_SHEET:
628 GtkSheet *data_sheet =
629 GTK_SHEET (get_widget_assert (de->xml, "data_sheet"));
631 if ( data_sheet->state == GTK_SHEET_COLUMN_SELECTED )
632 posn = data_sheet->range.col0;
634 posn = data_sheet->active_cell.col;
638 g_assert_not_reached ();
641 psppire_dict_insert_variable (vs->dict, posn, NULL);
644 /* Callback for when the dictionary changes its split variables */
646 on_split_change (PsppireDict *dict, gpointer data)
648 struct data_editor *de = data;
650 size_t n_split_vars = dict_get_split_cnt (dict->dict);
652 GtkWidget *split_status_area =
653 get_widget_assert (de->xml, "split-file-status-area");
655 if ( n_split_vars == 0 )
657 gtk_label_set_text (GTK_LABEL (split_status_area), _("No Split"));
663 struct variable *const * split_vars = dict_get_split_vars (dict->dict);
665 text = g_string_new (_("Split by "));
667 for (i = 0 ; i < n_split_vars - 1; ++i )
669 g_string_append_printf (text, "%s, ", var_get_name (split_vars[i]));
671 g_string_append (text, var_get_name (split_vars[i]));
673 gtk_label_set_text (GTK_LABEL (split_status_area), text->str);
675 g_string_free (text, TRUE);
680 /* Callback for when the dictionary changes its filter variable */
682 on_filter_change (GObject *o, gint filter_index, gpointer data)
684 struct data_editor *de = data;
685 GtkWidget *filter_status_area =
686 get_widget_assert (de->xml, "filter-use-status-area");
688 if ( filter_index == -1 )
690 gtk_label_set_text (GTK_LABEL (filter_status_area), _("Filter off"));
694 GtkSheet *var_sheet =
695 GTK_SHEET (get_widget_assert (de->xml, "variable_sheet"));
697 PsppireVarStore *vs = PSPPIRE_VAR_STORE
698 (gtk_sheet_get_model (var_sheet) );
700 struct variable *var = psppire_dict_get_variable (vs->dict,
703 gchar *text = g_strdup_printf (_("Filter by %s"), var_get_name (var));
705 gtk_label_set_text (GTK_LABEL (filter_status_area), text);
711 /* Callback for when the dictionary changes its weights */
713 on_weight_change (GObject *o, gint weight_index, gpointer data)
715 struct data_editor *de = data;
716 GtkWidget *weight_status_area =
717 get_widget_assert (de->xml, "weight-status-area");
719 if ( weight_index == -1 )
721 gtk_label_set_text (GTK_LABEL (weight_status_area), _("Weights off"));
725 GtkSheet *var_sheet =
726 GTK_SHEET (get_widget_assert (de->xml, "variable_sheet"));
728 PsppireVarStore *vs = PSPPIRE_VAR_STORE
729 (gtk_sheet_get_model (var_sheet) );
731 struct variable *var = psppire_dict_get_variable (vs->dict,
734 gchar *text = g_strdup_printf (_("Weight by %s"), var_get_name (var));
736 gtk_label_set_text (GTK_LABEL (weight_status_area), text);
743 weight_cases_dialog (GObject *o, gpointer data)
746 struct data_editor *de = data;
747 GtkSheet *var_sheet =
748 GTK_SHEET (get_widget_assert (de->xml, "variable_sheet"));
751 GladeXML *xml = glade_xml_new (PKGDATADIR "/psppire.glade",
752 "weight-cases-dialog", NULL);
755 GtkWidget *treeview = get_widget_assert (xml, "treeview");
756 GtkWidget *entry = get_widget_assert (xml, "entry1");
759 PsppireVarStore *vs = PSPPIRE_VAR_STORE (gtk_sheet_get_model (var_sheet));
761 PsppireVarSelect *select = psppire_var_select_new (treeview,
765 PsppireDialog *dialog = create_weight_dialog (select, xml);
767 response = psppire_dialog_run (dialog);
769 g_object_unref (xml);
773 case GTK_RESPONSE_OK:
775 struct getl_interface *sss ;
776 const GList *list = psppire_var_select_get_variables (select);
778 g_assert ( g_list_length ((GList *)list) <= 1 );
782 sss = create_syntax_string_source ("WEIGHT OFF.");
786 struct variable *var = list->data;
788 sss = create_syntax_string_source ("WEIGHT BY %s.\n",
792 execute_syntax (sss);
795 case PSPPIRE_RESPONSE_PASTE:
797 struct syntax_editor *se = (struct syntax_editor *) window_create (WINDOW_SYNTAX, NULL);
799 const GList *list = psppire_var_select_get_variables (select);
801 g_assert ( g_list_length ((GList *)list) <= 1 );
805 gtk_text_buffer_insert_at_cursor (se->buffer, "WEIGHT OFF.", -1);
809 struct variable *var = list->data;
811 gchar *text = g_strdup_printf ("WEIGHT BY %s.",
814 gtk_text_buffer_insert_at_cursor (se->buffer,
829 static void data_save_as_dialog (GtkAction *, struct data_editor *de);
830 static void new_file (GtkAction *, struct editor_window *de);
831 static void open_data_dialog (GtkAction *, struct editor_window *de);
832 static void data_save (GtkAction *action, struct data_editor *e);
835 /* Create the GtkActions and connect to their signals */
837 register_data_editor_actions (struct data_editor *de)
839 de->action_data_open =
840 gtk_action_new ("data-open-dialog",
842 _("Open a data file"),
845 g_signal_connect (de->action_data_open, "activate",
846 G_CALLBACK (open_data_dialog), de);
849 de->action_data_save = gtk_action_new ("data-save",
851 _("Save data to file"),
854 g_signal_connect (de->action_data_save, "activate",
855 G_CALLBACK (data_save), de);
859 de->action_data_save_as = gtk_action_new ("data-save-as-dialog",
861 _("Save data to file"),
864 g_signal_connect (de->action_data_save_as, "activate",
865 G_CALLBACK (data_save_as_dialog), de);
867 de->action_data_new =
868 gtk_action_new ("data-new",
873 g_signal_connect (de->action_data_new, "activate",
874 G_CALLBACK (new_file), de);
877 /* Returns true if NAME has a suffix which might denote a PSPP file */
879 name_has_suffix (const gchar *name)
881 if ( g_str_has_suffix (name, ".sav"))
883 if ( g_str_has_suffix (name, ".SAV"))
885 if ( g_str_has_suffix (name, ".por"))
887 if ( g_str_has_suffix (name, ".POR"))
893 /* Append SUFFIX to the filename of DE */
895 append_filename_suffix (struct data_editor *de, const gchar *suffix)
897 if ( ! name_has_suffix (de->file_name))
899 gchar *s = de->file_name;
900 de->file_name = g_strconcat (de->file_name, suffix, NULL);
905 /* Save DE to file */
907 save_file (struct data_editor *de)
909 struct getl_interface *sss;
911 g_assert (de->file_name);
913 if ( de->save_as_portable )
915 append_filename_suffix (de, ".por");
916 sss = create_syntax_string_source ("EXPORT OUTFILE='%s'.",
921 append_filename_suffix (de, ".sav");
922 sss = create_syntax_string_source ("SAVE OUTFILE='%s'.",
926 execute_syntax (sss);
930 /* Callback for data_save action.
931 If there's an existing file name, then just save,
932 otherwise prompt for a file name, then save */
934 data_save (GtkAction *action, struct data_editor *de)
939 data_save_as_dialog (action, de);
943 /* Callback for data_save_as action. Prompt for a filename and save */
945 data_save_as_dialog (GtkAction *action, struct data_editor *de)
947 struct editor_window *e = (struct editor_window *) de;
949 GtkWidget *button_sys;
951 gtk_file_chooser_dialog_new (_("Save"),
952 GTK_WINDOW (e->window),
953 GTK_FILE_CHOOSER_ACTION_SAVE,
954 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
955 GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
958 GtkFileFilter *filter = gtk_file_filter_new ();
959 gtk_file_filter_set_name (filter, _("System Files (*.sav)"));
960 gtk_file_filter_add_pattern (filter, "*.sav");
961 gtk_file_filter_add_pattern (filter, "*.SAV");
962 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
964 filter = gtk_file_filter_new ();
965 gtk_file_filter_set_name (filter, _("Portable Files (*.por) "));
966 gtk_file_filter_add_pattern (filter, "*.por");
967 gtk_file_filter_add_pattern (filter, "*.POR");
968 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
970 filter = gtk_file_filter_new ();
971 gtk_file_filter_set_name (filter, _("All Files"));
972 gtk_file_filter_add_pattern (filter, "*");
973 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
976 GtkWidget *button_por;
977 GtkWidget *vbox = gtk_vbox_new (TRUE, 5);
979 gtk_radio_button_new_with_label (NULL, _("System File"));
982 gtk_radio_button_new_with_label
983 (gtk_radio_button_get_group (GTK_RADIO_BUTTON(button_sys)),
986 gtk_box_pack_start_defaults (GTK_BOX (vbox), button_sys);
987 gtk_box_pack_start_defaults (GTK_BOX (vbox), button_por);
989 gtk_widget_show_all (vbox);
991 gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER(dialog), vbox);
994 switch (gtk_dialog_run (GTK_DIALOG (dialog)))
996 case GTK_RESPONSE_ACCEPT:
998 g_free (de->file_name);
1001 gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
1003 de->save_as_portable =
1004 ! gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button_sys));
1008 window_set_name_from_filename (e, de->file_name);
1015 gtk_widget_destroy (dialog);
1019 /* Callback for data_new action.
1020 Performs the NEW FILE command */
1022 new_file (GtkAction *action, struct editor_window *de)
1024 struct getl_interface *sss =
1025 create_syntax_string_source ("NEW FILE.");
1027 execute_syntax (sss);
1029 default_window_name (de);
1033 /* Callback for the data_open action.
1034 Prompts for a filename and opens it */
1036 open_data_dialog (GtkAction *action, struct editor_window *de)
1039 gtk_file_chooser_dialog_new (_("Open"),
1040 GTK_WINDOW (de->window),
1041 GTK_FILE_CHOOSER_ACTION_OPEN,
1042 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
1043 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
1046 GtkFileFilter *filter = gtk_file_filter_new ();
1047 gtk_file_filter_set_name (filter, _("System Files (*.sav)"));
1048 gtk_file_filter_add_pattern (filter, "*.sav");
1049 gtk_file_filter_add_pattern (filter, "*.SAV");
1050 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
1052 filter = gtk_file_filter_new ();
1053 gtk_file_filter_set_name (filter, _("Portable Files (*.por) "));
1054 gtk_file_filter_add_pattern (filter, "*.por");
1055 gtk_file_filter_add_pattern (filter, "*.POR");
1056 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
1058 filter = gtk_file_filter_new ();
1059 gtk_file_filter_set_name (filter, _("All Files"));
1060 gtk_file_filter_add_pattern (filter, "*");
1061 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
1063 switch (gtk_dialog_run (GTK_DIALOG (dialog)))
1065 case GTK_RESPONSE_ACCEPT:
1067 struct getl_interface *sss;
1069 gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
1071 sss = create_syntax_string_source ("GET FILE='%s'.", file_name);
1073 execute_syntax (sss);
1075 window_set_name_from_filename (de, file_name);
1084 gtk_widget_destroy (dialog);