2 PSPPIRE --- A Graphical User Interface for PSPP
3 Copyright (C) 2004, 2005 Free Software Foundation
4 Written by John Darrington
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
23 #include <file-handle-def.h>
24 #include <sys-file-reader.h>
27 #include <glade/glade.h>
32 #include "menu-actions.h"
33 #include "psppire-variable.h"
34 #include "psppire-dict.h"
36 #include "var-sheet.h"
37 #include "data-sheet.h"
39 #include "psppire-var-store.h"
40 #include "psppire-data-store.h"
49 extern PsppireDict *the_dictionary ;
50 extern PsppireCaseArray *the_cases ;
53 static struct file_handle *psppire_handle = 0;
55 static const gchar handle_name[] = "psppire_handle";
57 static const gchar untitled[] = _("Untitled");
59 static const gchar window_title[]=_("PSPP Data Editor");
63 psppire_set_window_title(const gchar *text)
65 GtkWidget *data_editor = get_widget_assert(xml, "data_editor");
67 gchar *title = g_strdup_printf("%s --- %s", text, window_title);
69 gtk_window_set_title(GTK_WINDOW(data_editor), title);
75 on_new1_activate (GtkMenuItem *menuitem,
78 psppire_dict_clear(the_dictionary);
79 psppire_case_array_clear(the_cases);
81 psppire_set_window_title(untitled);
84 fh_free(psppire_handle);
89 populate_case_from_reader(struct ccase *c, gpointer aux)
91 struct sfm_reader *reader = aux;
93 return sfm_read_case(reader, c);
98 on_open1_activate (GtkMenuItem *menuitem,
102 GtkWidget *data_editor = get_widget_assert(xml, "data_editor");
104 dialog = gtk_file_chooser_dialog_new (_("Open"),
105 GTK_WINDOW(data_editor),
106 GTK_FILE_CHOOSER_ACTION_OPEN,
107 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
108 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
110 GtkFileFilter *filter ;
112 filter = gtk_file_filter_new();
113 gtk_file_filter_set_name(filter, _("System Files (*.sav)"));
114 gtk_file_filter_add_pattern(filter, "*.sav");
115 gtk_file_filter_add_pattern(filter, "*.SAV");
116 gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter);
118 filter = gtk_file_filter_new();
119 gtk_file_filter_set_name(filter, _("Portable Files (*.por) "));
120 gtk_file_filter_add_pattern(filter, "*.por");
121 gtk_file_filter_add_pattern(filter, "*.POR");
122 gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter);
124 filter = gtk_file_filter_new();
125 gtk_file_filter_set_name(filter, _("All Files"));
126 gtk_file_filter_add_pattern(filter, "*");
127 gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter);
130 bool finished = FALSE;
133 if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
135 GtkWidget *data_sheet = get_widget_assert(xml, "data_sheet");
136 g_assert(data_sheet);
138 GtkWidget *var_sheet = get_widget_assert(xml, "variable_sheet");
141 char *filename = gtk_file_chooser_get_filename
142 (GTK_FILE_CHOOSER (dialog));
144 if ( psppire_handle )
145 fh_free(psppire_handle);
148 fh_create_file (handle_name, filename, fh_default_properties());
150 if ( !psppire_handle )
152 g_warning("Cannot read handle for reading system file \"%s\"\n",
157 struct dictionary *new_dict;
158 struct sfm_read_info ri;
159 struct sfm_reader *reader ;
161 reader = sfm_open_reader (psppire_handle, &new_dict, &ri);
166 the_dictionary = psppire_dict_new_from_dict(new_dict);
168 PsppireVarStore *var_store =
169 PSPPIRE_VAR_STORE(gtk_sheet_get_model(GTK_SHEET(var_sheet)));
171 psppire_var_store_set_dictionary(var_store, the_dictionary);
174 PsppireDataStore *data_store =
175 PSPPIRE_DATA_STORE(gtk_sheet_get_model(GTK_SHEET(data_sheet)));
178 psppire_data_store_set_dictionary(data_store,
181 psppire_case_array_clear(data_store->cases);
184 psppire_set_window_title(basename(filename));
188 const int ni = dict_get_next_value_idx(the_dictionary->dict);
193 for(case_num=0;;case_num++)
195 if (!psppire_case_array_add_case(the_cases,
196 populate_case_from_reader, reader))
200 sfm_close_reader(reader);
207 } while ( ! finished ) ;
210 gtk_widget_destroy (dialog);
214 /* Re initialise HANDLE, by interrogating the user for a new file name */
216 recreate_save_handle(struct file_handle **handle)
220 GtkWidget *data_editor = get_widget_assert(xml, "data_editor");
222 dialog = gtk_file_chooser_dialog_new (_("Save Data As"),
223 GTK_WINDOW(data_editor),
224 GTK_FILE_CHOOSER_ACTION_SAVE,
225 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
226 GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
229 if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
231 char *filename = gtk_file_chooser_get_filename
232 (GTK_FILE_CHOOSER (dialog));
236 destroy_file_handle(*handle, 0);
238 *handle = fh_create_file (handle_name, filename, fh_default_properties());
240 psppire_set_window_title(basename(filename));
245 gtk_widget_destroy (dialog);
249 on_save1_activate (GtkMenuItem *menuitem,
252 if ( ! psppire_handle )
253 recreate_save_handle(&psppire_handle);
255 GtkSheet *data_sheet = GTK_SHEET(get_widget_assert(xml, "data_sheet"));
256 PsppireDataStore *data_store = PSPPIRE_DATA_STORE(gtk_sheet_get_model(data_sheet));
258 if ( psppire_handle )
259 psppire_data_store_create_system_file(data_store,
265 on_save_as1_activate (GtkMenuItem *menuitem,
268 recreate_save_handle(&psppire_handle);
269 if ( ! psppire_handle )
272 GtkSheet *data_sheet = GTK_SHEET(get_widget_assert(xml, "data_sheet"));
273 PsppireDataStore *data_store = PSPPIRE_DATA_STORE(gtk_sheet_get_model(data_sheet));
275 if ( psppire_handle )
276 psppire_data_store_create_system_file(data_store,
282 on_quit1_activate (GtkMenuItem *menuitem,
290 on_cut1_activate (GtkMenuItem *menuitem,
298 on_copy1_activate (GtkMenuItem *menuitem,
306 on_paste1_activate (GtkMenuItem *menuitem,
314 on_insert1_activate (GtkMenuItem *menuitem,
317 GtkNotebook *notebook = GTK_NOTEBOOK(get_widget_assert(xml, "notebook1"));
320 page = gtk_notebook_get_current_page(notebook);
324 case PAGE_DATA_SHEET:
326 GtkSheet *data_sheet = GTK_SHEET(get_widget_assert(xml, "data_sheet"));
327 PsppireDataStore *data_store =
328 PSPPIRE_DATA_STORE(gtk_sheet_get_model(data_sheet));
330 psppire_case_array_insert_case(data_store->cases, data_sheet->range.row0);
335 GtkSheet *var_sheet =
336 GTK_SHEET(get_widget_assert(xml, "variable_sheet"));
338 PsppireVarStore *var_store =
339 PSPPIRE_VAR_STORE(gtk_sheet_get_model(var_sheet));
341 psppire_dict_insert_variable(var_store->dict, var_sheet->range.row0, 0);
348 on_delete1_activate (GtkMenuItem *menuitem,
352 GtkWidget *notebook = get_widget_assert(xml, "notebook1");
354 page = gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook));
357 case PAGE_DATA_SHEET:
359 GtkSheet *data_sheet = GTK_SHEET(get_widget_assert(xml, "data_sheet"));
360 PsppireDataStore *data_store =
361 PSPPIRE_DATA_STORE(gtk_sheet_get_model(data_sheet));
363 psppire_case_array_delete_cases(data_store->cases,
364 data_sheet->range.row0,
365 1 + data_sheet->range.rowi
366 - data_sheet->range.row0 );
371 GtkSheet *var_sheet =
372 GTK_SHEET(get_widget_assert(xml, "variable_sheet"));
374 PsppireVarStore *var_store =
375 PSPPIRE_VAR_STORE(gtk_sheet_get_model(var_sheet));
377 psppire_dict_delete_variables(var_store->dict,
378 var_sheet->range.row0,
379 1 + var_sheet->range.rowi
380 - var_sheet->range.row0 );
388 on_about1_activate(GtkMenuItem *menuitem,
391 GtkWidget *about = get_widget_assert(xml, "aboutdialog1");
394 GdkPixbuf *pb = gdk_pixbuf_new_from_file_at_size( "pspplogo.png", 64, 64, 0);
396 gtk_about_dialog_set_logo(GTK_ABOUT_DIALOG(about), pb);
398 gtk_widget_show(about);
400 gtk_window_set_transient_for(GTK_WINDOW(about),
401 GTK_WINDOW(get_widget_assert(xml, "data_editor")));
407 on_toolbars1_activate
408 (GtkMenuItem *menuitem,
416 on_value_labels1_activate(GtkCheckMenuItem *menuitem,
419 GtkSheet *data_sheet = GTK_SHEET(get_widget_assert(xml, "data_sheet"));
420 PsppireDataStore *ds = PSPPIRE_DATA_STORE(gtk_sheet_get_model(data_sheet));
422 psppire_data_store_show_labels(ds,
423 gtk_check_menu_item_get_active(menuitem));
427 on_status_bar1_activate(GtkCheckMenuItem *menuitem,
431 if ( gtk_check_menu_item_get_active(menuitem) )
432 gtk_widget_show(get_widget_assert(xml, "statusbar1"));
434 gtk_widget_hide(get_widget_assert(xml, "statusbar1"));
438 on_grid_lines1_activate(GtkCheckMenuItem *menuitem,
442 const bool grid_visible = gtk_check_menu_item_get_active(menuitem);
444 gtk_sheet_show_grid(GTK_SHEET(get_widget_assert(xml, "variable_sheet")),
447 gtk_sheet_show_grid(GTK_SHEET(get_widget_assert(xml, "data_sheet")),
453 on_fonts1_activate(GtkMenuItem *menuitem,
456 static GtkWidget *dialog = 0 ;
458 dialog = gtk_font_selection_dialog_new(_("Font Selection"));
460 gtk_window_set_transient_for(GTK_WINDOW(dialog),
461 GTK_WINDOW(get_widget_assert(xml, "data_editor")));
464 if ( GTK_RESPONSE_OK == gtk_dialog_run(GTK_DIALOG(dialog)) )
466 GtkSheet *data_sheet =
467 GTK_SHEET(get_widget_assert(xml, "data_sheet"));
469 GtkSheet *var_sheet =
470 GTK_SHEET(get_widget_assert(xml, "variable_sheet"));
472 PsppireDataStore *ds = PSPPIRE_DATA_STORE(gtk_sheet_get_model(data_sheet));
473 PsppireVarStore *vs = PSPPIRE_VAR_STORE(gtk_sheet_get_model(var_sheet));
475 const gchar *font = gtk_font_selection_dialog_get_font_name
476 (GTK_FONT_SELECTION_DIALOG(dialog));
478 PangoFontDescription* font_desc =
479 pango_font_description_from_string(font);
481 psppire_var_store_set_font(vs, font_desc);
482 psppire_data_store_set_font(ds, font_desc);
485 gtk_widget_hide(dialog);
490 static GtkWidget *menuitems[2];
491 static GtkNotebook *notebook = 0;
494 switch_menus(gint page)
499 gtk_widget_hide(menuitems[PAGE_VAR_SHEET]);
500 gtk_widget_show(menuitems[PAGE_DATA_SHEET]);
502 case PAGE_DATA_SHEET:
503 gtk_widget_show(menuitems[PAGE_VAR_SHEET]);
504 gtk_widget_hide(menuitems[PAGE_DATA_SHEET]);
507 g_assert_not_reached();
514 select_sheet(gint page)
516 gtk_notebook_set_current_page(notebook, page);
523 data_var_select(GtkNotebook *notebook,
524 GtkNotebookPage *page,
528 switch_menus(page_num);
532 var_data_selection_init()
534 notebook = GTK_NOTEBOOK(get_widget_assert(xml, "notebook1"));
535 menuitems[PAGE_DATA_SHEET] = get_widget_assert(xml, "data1");
536 menuitems[PAGE_VAR_SHEET] = get_widget_assert(xml, "variables1");
538 gtk_notebook_set_current_page(notebook, PAGE_DATA_SHEET);
539 gtk_widget_hide(menuitems[PAGE_DATA_SHEET]);
540 gtk_widget_show(menuitems[PAGE_VAR_SHEET]);
543 g_signal_connect(G_OBJECT(notebook), "switch-page",
544 G_CALLBACK(data_var_select), 0);
550 on_data1_activate(GtkMenuItem *menuitem,
553 select_sheet(PAGE_DATA_SHEET);
558 on_variables1_activate(GtkMenuItem *menuitem,
561 select_sheet(PAGE_VAR_SHEET);
565 /* Callback which occurs when gtk_main is entered */
567 callbacks_on_init(gpointer data)
569 psppire_set_window_title(untitled);
571 var_data_selection_init();