2 PSPPIRE --- A Graphical User Interface for PSPP
3 Copyright (C) 2006 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
23 #define _(msgid) gettext (msgid)
24 #define N_(msgid) msgid
26 #include <glade/glade.h>
28 #include <libpspp/message.h>
29 #include <libpspp/getl.h>
31 #include "data-editor.h"
34 #include "window-manager.h"
36 #include <language/command.h>
37 #include <data/procedure.h>
38 #include "syntax-editor.h"
39 #include "syntax-editor-source.h"
41 extern struct source_stream *the_source_stream ;
42 extern struct lexer *the_lexer;
43 extern struct dataset *the_dataset;
45 static gboolean save_editor_to_file (struct syntax_editor *se,
46 const gchar *filename,
49 /* If the buffer's modified flag is set, then save it, and close the window.
50 Otherwise just close the window.
53 save_if_modified (struct syntax_editor *se)
55 struct editor_window *e = (struct editor_window *) se;
56 if ( TRUE == gtk_text_buffer_get_modified (se->buffer))
60 gtk_message_dialog_new (GTK_WINDOW(e->window),
64 _("Save contents of syntax editor to %s?"),
65 e->name ? e->name : _("Untitled")
68 gtk_dialog_add_button (GTK_DIALOG(dialog),
71 gtk_dialog_add_button (GTK_DIALOG(dialog),
74 gtk_dialog_add_button (GTK_DIALOG(dialog),
79 response = gtk_dialog_run (GTK_DIALOG(dialog));
81 gtk_widget_destroy (dialog);
83 if ( response == GTK_RESPONSE_ACCEPT )
87 if ( ! save_editor_to_file (se, e->name ? e->name : _("Untitled"),
90 msg (ME, err->message);
95 if ( response == GTK_RESPONSE_CANCEL )
99 gtk_widget_destroy (e->window);
102 /* Callback for the File->SaveAs menuitem */
104 on_syntax_save_as (GtkMenuItem *menuitem,
107 GtkFileFilter *filter;
109 struct syntax_editor *se = user_data;
110 struct editor_window *e = user_data;
113 gtk_file_chooser_dialog_new (_("Save Syntax"),
114 GTK_WINDOW(e->window),
115 GTK_FILE_CHOOSER_ACTION_SAVE,
116 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
117 GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
120 filter = gtk_file_filter_new ();
121 gtk_file_filter_set_name (filter, _("Syntax Files (*.sps) "));
122 gtk_file_filter_add_pattern (filter, "*.sps");
123 gtk_file_filter_add_pattern (filter, "*.SPS");
124 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog), filter);
126 filter = gtk_file_filter_new ();
127 gtk_file_filter_set_name (filter, _("All Files"));
128 gtk_file_filter_add_pattern (filter, "*");
129 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
131 gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER(dialog),
133 response = gtk_dialog_run (GTK_DIALOG (dialog));
135 if ( response == GTK_RESPONSE_ACCEPT )
139 gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog) );
141 if ( save_editor_to_file (se, filename, &err) )
144 e->name = g_strdup (filename);
148 msg ( ME, err->message );
155 gtk_widget_destroy ( dialog );
158 /* Callback for the File->Save menuitem */
160 on_syntax_save (GtkMenuItem *menuitem,
163 struct syntax_editor *se = user_data;
164 struct editor_window *e = user_data;
166 if ( e->name == NULL )
167 on_syntax_save_as (menuitem, user_data);
171 save_editor_to_file (se, e->name, &err);
172 msg (ME, err->message);
178 /* Callback for the "delete" action (clicking the x on the top right
179 hand corner of the window) */
181 on_delete (GtkWidget *w, GdkEvent *event, gpointer user_data)
183 struct syntax_editor *se = user_data;
184 save_if_modified (se);
189 /* Callback for the File->Quit menuitem */
191 on_quit (GtkMenuItem *menuitem, gpointer user_data)
193 struct syntax_editor *se = user_data;
194 save_if_modified (se);
199 on_run_all (GtkMenuItem *menuitem, gpointer user_data)
201 GtkTextIter begin, end;
202 struct syntax_editor *se = user_data;
204 gtk_text_buffer_get_iter_at_line (se->buffer, &begin, 0);
205 gtk_text_buffer_get_iter_at_line (se->buffer, &end, -1);
207 getl_append_source (the_source_stream,
208 create_syntax_editor_source (se, begin, end));
211 int result = cmd_parse (the_lexer, the_dataset,
212 proc_has_source (the_dataset)
213 ? CMD_STATE_DATA : CMD_STATE_INITIAL);
215 if (result == CMD_EOF || result == CMD_FINISH)
224 Create a new syntax editor with NAME.
225 If NAME is NULL, a name will be automatically assigned
227 struct syntax_editor *
228 new_syntax_editor (void)
231 glade_xml_new (PKGDATADIR "/syntax-editor.glade", NULL, NULL);
233 GtkWidget *text_view;
234 struct syntax_editor *se ;
235 struct editor_window *e;
237 se = g_malloc (sizeof (*se));
239 e = (struct editor_window *)se;
241 e->window = get_widget_assert (xml, "syntax_editor");
242 text_view = get_widget_assert (xml, "syntax_text_view");
243 se->buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(text_view));
245 g_signal_connect (get_widget_assert (xml,"file_new_syntax"),
247 G_CALLBACK(new_syntax_window),
250 g_signal_connect (get_widget_assert (xml,"file_open_syntax"),
252 G_CALLBACK(open_syntax_window),
255 g_signal_connect (get_widget_assert (xml,"file_new_data"),
257 G_CALLBACK(new_data_window),
260 g_signal_connect (get_widget_assert (xml,"file_open_data"),
262 G_CALLBACK(open_data_window),
266 g_signal_connect (get_widget_assert (xml,"help_about"),
268 G_CALLBACK(about_new),
274 g_signal_connect (get_widget_assert (xml,"file_quit"),
279 g_signal_connect (get_widget_assert (xml,"file_save"),
281 G_CALLBACK(on_syntax_save),
284 g_signal_connect (get_widget_assert (xml,"file_save_as"),
286 G_CALLBACK(on_syntax_save_as),
291 g_signal_connect (get_widget_assert (xml,"run_all"),
293 G_CALLBACK(on_run_all),
298 g_object_unref (xml);
300 g_signal_connect (e->window, "delete-event",
301 G_CALLBACK(on_delete), se);
307 Callback for the File->New->Syntax menuitem
310 new_syntax_window (GtkMenuItem *menuitem,
313 window_create (WINDOW_SYNTAX, NULL);
318 Save BUFFER to the file called FILENAME.
319 If successful, clears the buffer's modified flag
322 save_editor_to_file (struct syntax_editor *se,
323 const gchar *filename,
326 GtkTextBuffer *buffer = se->buffer;
328 GtkTextIter start, stop;
334 glibfilename = g_filename_from_utf8 (filename, -1, 0, 0, err);
336 if ( ! glibfilename )
339 gtk_text_buffer_get_iter_at_line (buffer, &start, 0);
340 gtk_text_buffer_get_iter_at_offset (buffer, &stop, -1);
342 text = gtk_text_buffer_get_text (buffer, &start, &stop, FALSE);
344 result = g_file_set_contents (glibfilename, text, -1, err);
348 window_set_name_from_filename ((struct editor_window *) se, filename);
349 gtk_text_buffer_set_modified (buffer, FALSE);
357 Loads the buffer from the file called FILENAME
360 load_editor_from_file (struct syntax_editor *se,
361 const gchar *filename,
364 GtkTextBuffer *buffer = se->buffer;
368 gchar *glibfilename = g_filename_from_utf8 (filename, -1, 0, 0, err);
370 if ( ! glibfilename )
373 /* FIXME: What if it's a very big file ? */
374 if ( ! g_file_get_contents (glibfilename, &text, NULL, err) )
376 g_free (glibfilename);
379 g_free (glibfilename);
381 gtk_text_buffer_get_iter_at_line (buffer, &iter, 0);
383 gtk_text_buffer_insert (buffer, &iter, text, -1);
385 window_set_name_from_filename ((struct editor_window *)se, filename);
386 gtk_text_buffer_set_modified (buffer, FALSE);
392 /* Callback for the File->Open->Syntax menuitem */
394 open_syntax_window (GtkMenuItem *menuitem, gpointer parent)
396 GtkFileFilter *filter;
400 gtk_file_chooser_dialog_new (_("Open Syntax"),
402 GTK_FILE_CHOOSER_ACTION_OPEN,
403 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
404 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
407 filter = gtk_file_filter_new ();
408 gtk_file_filter_set_name (filter, _("Syntax Files (*.sps) "));
409 gtk_file_filter_add_pattern (filter, "*.sps");
410 gtk_file_filter_add_pattern (filter, "*.SPS");
411 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog), filter);
413 filter = gtk_file_filter_new ();
414 gtk_file_filter_set_name (filter, _("All Files"));
415 gtk_file_filter_add_pattern (filter, "*");
416 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
418 response = gtk_dialog_run (GTK_DIALOG (dialog));
420 if (response == GTK_RESPONSE_ACCEPT)
422 const char *file_name = gtk_file_chooser_get_filename
423 (GTK_FILE_CHOOSER (dialog));
425 struct syntax_editor *se = (struct syntax_editor *)
426 window_create (WINDOW_SYNTAX, file_name);
428 load_editor_from_file (se, file_name, NULL);
431 gtk_widget_destroy (dialog);