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>
36 GtkWidget *window; /* The top level window of the editor */
37 GtkTextBuffer *buffer; /* The buffer which contains the text */
38 gchar *name; /* The name of this syntax buffer/editor */
41 static gboolean save_editor_to_file (struct syntax_editor *se,
42 const gchar *filename,
45 /* If the buffer's modified flag is set, then save it, and close the window.
46 Otherwise just close the window.
49 save_if_modified (struct syntax_editor *se)
51 if ( TRUE == gtk_text_buffer_get_modified (se->buffer))
55 gtk_message_dialog_new (GTK_WINDOW(se->window),
59 _("Save contents of syntax editor to %s?"),
60 se->name ? se->name : _("Untitled")
63 gtk_dialog_add_button (GTK_DIALOG(dialog),
66 gtk_dialog_add_button (GTK_DIALOG(dialog),
69 gtk_dialog_add_button (GTK_DIALOG(dialog),
74 response = gtk_dialog_run (GTK_DIALOG(dialog));
76 gtk_widget_destroy (dialog);
78 if ( response == GTK_RESPONSE_ACCEPT )
82 if ( ! save_editor_to_file (se, se->name ? se->name : _("Untitled"),
85 msg (ME, err->message);
90 if ( response == GTK_RESPONSE_CANCEL )
94 gtk_widget_destroy (se->window);
97 /* Callback for the File->SaveAs menuitem */
99 on_syntax_save_as (GtkMenuItem *menuitem,
102 GtkFileFilter *filter;
104 struct syntax_editor *se = user_data;
107 gtk_file_chooser_dialog_new (_("Save Syntax"),
108 GTK_WINDOW(se->window),
109 GTK_FILE_CHOOSER_ACTION_SAVE,
110 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
111 GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
114 filter = gtk_file_filter_new ();
115 gtk_file_filter_set_name (filter, _("Syntax Files (*.sps) "));
116 gtk_file_filter_add_pattern (filter, "*.sps");
117 gtk_file_filter_add_pattern (filter, "*.SPS");
118 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog), filter);
120 filter = gtk_file_filter_new ();
121 gtk_file_filter_set_name (filter, _("All Files"));
122 gtk_file_filter_add_pattern (filter, "*");
123 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
125 gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER(dialog),
127 response = gtk_dialog_run (GTK_DIALOG (dialog));
129 if ( response == GTK_RESPONSE_ACCEPT )
133 gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog) );
135 if ( save_editor_to_file (se, filename, &err) )
138 se->name = g_strdup (filename);
142 msg ( ME, err->message );
149 gtk_widget_destroy ( dialog );
152 /* Callback for the File->Save menuitem */
154 on_syntax_save (GtkMenuItem *menuitem,
157 struct syntax_editor *se = user_data;
159 if ( se->name == NULL )
160 on_syntax_save_as (menuitem, user_data);
164 save_editor_to_file (se, se->name, &err);
165 msg (ME, err->message);
171 /* Callback for the "delete" action (clicking the x on the top right
172 hand corner of the window) */
174 on_delete (GtkWidget *w, GdkEvent *event, gpointer user_data)
176 struct syntax_editor *se = user_data;
177 save_if_modified (se);
182 /* Callback for the File->Quit menuitem */
184 on_quit (GtkMenuItem *menuitem, gpointer user_data)
186 struct syntax_editor *se = user_data;
187 save_if_modified (se);
192 new_syntax_window (GtkMenuItem *menuitem,
197 static void open_syntax_window (GtkMenuItem *menuitem,
201 /* Create a new syntax editor with NAME.
202 If NAME is NULL, a name will be automatically assigned
204 static struct syntax_editor *
205 new_syntax_editor (const gchar *name)
208 GtkWidget *text_view;
209 struct syntax_editor *se ;
211 new_xml = glade_xml_new (xml->filename, "syntax_editor", NULL);
213 se = g_malloc (sizeof (*se));
215 se->window = get_widget_assert (new_xml, "syntax_editor");
216 text_view = get_widget_assert (new_xml, "syntax_text_view");
217 se->buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(text_view));
219 se->name = g_strdup (name);
223 g_signal_connect (get_widget_assert (new_xml,"file_new_syntax"),
225 G_CALLBACK(new_syntax_window),
228 g_signal_connect (get_widget_assert (new_xml,"file_open_syntax"),
230 G_CALLBACK(open_syntax_window),
233 g_signal_connect (get_widget_assert (new_xml,"file_quit"),
238 g_signal_connect (get_widget_assert (new_xml,"file_save"),
240 G_CALLBACK(on_syntax_save),
243 g_signal_connect (get_widget_assert (new_xml,"file_save_as"),
245 G_CALLBACK(on_syntax_save_as),
248 g_object_unref (new_xml);
250 g_signal_connect (se->window, "delete-event",
251 G_CALLBACK(on_delete), se);
256 /* Callback for the File->New->Syntax menuitem */
258 new_syntax_window (GtkMenuItem *menuitem,
261 struct syntax_editor *se = new_syntax_editor (NULL);
262 gtk_widget_show (se->window);
267 set_window_title_from_filename (struct syntax_editor *se,
268 const gchar *filename)
273 se->name = strdup (filename);
274 basename = g_path_get_basename (filename);
276 g_strdup_printf (_("%s --- PSPP Syntax Editor"), basename);
278 gtk_window_set_title (GTK_WINDOW(se->window), title);
283 /* Save BUFFER to the file called FILENAME.
284 If successful, clears the buffer's modified flag */
286 save_editor_to_file (struct syntax_editor *se,
287 const gchar *filename,
290 GtkTextBuffer *buffer = se->buffer;
292 GtkTextIter start, stop;
298 glibfilename = g_filename_from_utf8 (filename, -1, 0, 0, err);
300 if ( ! glibfilename )
303 gtk_text_buffer_get_iter_at_line (buffer, &start, 0);
304 gtk_text_buffer_get_iter_at_offset (buffer, &stop, -1);
306 text = gtk_text_buffer_get_text (buffer, &start, &stop, FALSE);
308 result = g_file_set_contents (glibfilename, text, -1, err);
312 set_window_title_from_filename (se, filename);
313 gtk_text_buffer_set_modified (buffer, FALSE);
320 /* Loads the buffer from the file called FILENAME
323 load_editor_from_file (struct syntax_editor *se,
324 const gchar *filename,
327 GtkTextBuffer *buffer = se->buffer;
331 gchar *glibfilename = g_filename_from_utf8 (filename, -1, 0, 0, err);
333 if ( ! glibfilename )
336 /* FIXME: What if it's a very big file ? */
337 if ( ! g_file_get_contents (glibfilename, &text, NULL, err) )
339 g_free (glibfilename);
342 g_free (glibfilename);
344 gtk_text_buffer_get_iter_at_line (buffer, &iter, 0);
346 gtk_text_buffer_insert (buffer, &iter, text, -1);
348 set_window_title_from_filename (se, filename);
349 gtk_text_buffer_set_modified (buffer, FALSE);
355 /* Callback for the File->Open->Syntax menuitem */
357 open_syntax_window (GtkMenuItem *menuitem, gpointer parent)
359 GtkFileFilter *filter;
363 gtk_file_chooser_dialog_new (_("Open Syntax"),
365 GTK_FILE_CHOOSER_ACTION_OPEN,
366 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
367 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
370 filter = gtk_file_filter_new ();
371 gtk_file_filter_set_name (filter, _("Syntax Files (*.sps) "));
372 gtk_file_filter_add_pattern (filter, "*.sps");
373 gtk_file_filter_add_pattern (filter, "*.SPS");
374 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog), filter);
376 filter = gtk_file_filter_new ();
377 gtk_file_filter_set_name (filter, _("All Files"));
378 gtk_file_filter_add_pattern (filter, "*");
379 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
381 response = gtk_dialog_run (GTK_DIALOG (dialog));
383 if (response == GTK_RESPONSE_ACCEPT)
385 const char *file_name = gtk_file_chooser_get_filename
386 (GTK_FILE_CHOOSER (dialog));
388 struct syntax_editor *se = new_syntax_editor (file_name);
390 load_editor_from_file (se, file_name, NULL);
392 gtk_widget_show (se->window);
395 gtk_widget_destroy (dialog);
400 /* FIXME: get rid of these functions */
402 on_syntax4_activate (GtkMenuItem *menuitem,
405 g_print ("%s\n", __FUNCTION__);
411 on_syntax2_activate (GtkMenuItem *menuitem,
414 g_print ("%s\n", __FUNCTION__);
418 on_syntax1_activate (GtkMenuItem *menuitem,
421 g_print ("%s\n", __FUNCTION__);
422 new_syntax_window (menuitem, user_data);