2 PSPPIRE --- A Graphical User Interface for PSPP
3 Copyright (C) 2006 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
24 #define _(msgid) gettext (msgid)
25 #define N_(msgid) msgid
27 #include <glade/glade.h>
29 #include <libpspp/message.h>
37 GtkWidget *window; /* The top level window of the editor */
38 GtkTextBuffer *buffer; /* The buffer which contains the text */
39 gchar *name; /* The name of this syntax buffer/editor */
42 static gboolean save_editor_to_file (struct syntax_editor *se,
43 const gchar *filename,
46 /* If the buffer's modified flag is set, then save it, and close the window.
47 Otherwise just close the window.
50 save_if_modified (struct syntax_editor *se)
52 if ( TRUE == gtk_text_buffer_get_modified (se->buffer))
56 gtk_message_dialog_new (GTK_WINDOW(se->window),
60 _("Save contents of syntax editor to %s?"),
61 se->name ? se->name : _("Untitled")
64 gtk_dialog_add_button (GTK_DIALOG(dialog),
67 gtk_dialog_add_button (GTK_DIALOG(dialog),
70 gtk_dialog_add_button (GTK_DIALOG(dialog),
75 response = gtk_dialog_run (GTK_DIALOG(dialog));
77 gtk_widget_destroy (dialog);
79 if ( response == GTK_RESPONSE_ACCEPT )
83 if ( ! save_editor_to_file (se, se->name ? se->name : _("Untitled"),
86 msg (ME, err->message);
91 if ( response == GTK_RESPONSE_CANCEL )
95 gtk_widget_destroy (se->window);
98 /* Callback for the File->SaveAs menuitem */
100 on_syntax_save_as (GtkMenuItem *menuitem,
103 GtkFileFilter *filter;
105 struct syntax_editor *se = user_data;
108 gtk_file_chooser_dialog_new (_("Save Syntax"),
109 GTK_WINDOW(se->window),
110 GTK_FILE_CHOOSER_ACTION_SAVE,
111 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
112 GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
115 filter = gtk_file_filter_new ();
116 gtk_file_filter_set_name (filter, _("Syntax Files (*.sps) "));
117 gtk_file_filter_add_pattern (filter, "*.sps");
118 gtk_file_filter_add_pattern (filter, "*.SPS");
119 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog), filter);
121 filter = gtk_file_filter_new ();
122 gtk_file_filter_set_name (filter, _("All Files"));
123 gtk_file_filter_add_pattern (filter, "*");
124 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
126 gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER(dialog),
128 response = gtk_dialog_run (GTK_DIALOG (dialog));
130 if ( response == GTK_RESPONSE_ACCEPT )
134 gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog) );
136 if ( save_editor_to_file (se, filename, &err) )
139 se->name = g_strdup (filename);
143 msg ( ME, err->message );
150 gtk_widget_destroy ( dialog );
153 /* Callback for the File->Save menuitem */
155 on_syntax_save (GtkMenuItem *menuitem,
158 struct syntax_editor *se = user_data;
160 if ( se->name == NULL )
161 on_syntax_save_as (menuitem, user_data);
165 save_editor_to_file (se, se->name, &err);
166 msg (ME, err->message);
172 /* Callback for the "delete" action (clicking the x on the top right
173 hand corner of the window) */
175 on_delete (GtkWidget *w, GdkEvent *event, gpointer user_data)
177 struct syntax_editor *se = user_data;
178 save_if_modified (se);
183 /* Callback for the File->Quit menuitem */
185 on_quit (GtkMenuItem *menuitem, gpointer user_data)
187 struct syntax_editor *se = user_data;
188 save_if_modified (se);
193 new_syntax_window (GtkMenuItem *menuitem,
198 static void open_syntax_window (GtkMenuItem *menuitem,
202 /* Create a new syntax editor with NAME.
203 If NAME is NULL, a name will be automatically assigned
205 static struct syntax_editor *
206 new_syntax_editor (const gchar *name)
209 GtkWidget *text_view;
210 struct syntax_editor *se ;
212 new_xml = glade_xml_new (xml->filename, "syntax_editor", NULL);
214 se = g_malloc (sizeof (*se));
216 se->window = get_widget_assert (new_xml, "syntax_editor");
217 text_view = get_widget_assert (new_xml, "syntax_text_view");
218 se->buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(text_view));
220 se->name = g_strdup (name);
224 g_signal_connect (get_widget_assert (new_xml,"file_new_syntax"),
226 G_CALLBACK(new_syntax_window),
229 g_signal_connect (get_widget_assert (new_xml,"file_open_syntax"),
231 G_CALLBACK(open_syntax_window),
234 g_signal_connect (get_widget_assert (new_xml,"file_quit"),
239 g_signal_connect (get_widget_assert (new_xml,"file_save"),
241 G_CALLBACK(on_syntax_save),
244 g_signal_connect (get_widget_assert (new_xml,"file_save_as"),
246 G_CALLBACK(on_syntax_save_as),
249 g_object_unref (new_xml);
251 g_signal_connect (se->window, "delete-event",
252 G_CALLBACK(on_delete), se);
257 /* Callback for the File->New->Syntax menuitem */
259 new_syntax_window (GtkMenuItem *menuitem,
262 struct syntax_editor *se = new_syntax_editor (NULL);
263 gtk_widget_show (se->window);
268 set_window_title_from_filename (struct syntax_editor *se,
269 const gchar *filename)
274 se->name = strdup (filename);
275 basename = g_path_get_basename (filename);
277 g_strdup_printf (_("%s --- PSPP Syntax Editor"), basename);
279 gtk_window_set_title (GTK_WINDOW(se->window), title);
284 /* Save BUFFER to the file called FILENAME.
285 If successful, clears the buffer's modified flag */
287 save_editor_to_file (struct syntax_editor *se,
288 const gchar *filename,
291 GtkTextBuffer *buffer = se->buffer;
293 GtkTextIter start, stop;
299 glibfilename = g_filename_from_utf8 (filename, -1, 0, 0, err);
301 if ( ! glibfilename )
304 gtk_text_buffer_get_iter_at_line (buffer, &start, 0);
305 gtk_text_buffer_get_iter_at_offset (buffer, &stop, -1);
307 text = gtk_text_buffer_get_text (buffer, &start, &stop, FALSE);
309 result = g_file_set_contents (glibfilename, text, -1, err);
313 set_window_title_from_filename (se, filename);
314 gtk_text_buffer_set_modified (buffer, FALSE);
321 /* Loads the buffer from the file called FILENAME
324 load_editor_from_file (struct syntax_editor *se,
325 const gchar *filename,
328 GtkTextBuffer *buffer = se->buffer;
332 gchar *glibfilename = g_filename_from_utf8 (filename, -1, 0, 0, err);
334 if ( ! glibfilename )
337 /* FIXME: What if it's a very big file ? */
338 if ( ! g_file_get_contents (glibfilename, &text, NULL, err) )
340 g_free (glibfilename);
343 g_free (glibfilename);
345 gtk_text_buffer_get_iter_at_line (buffer, &iter, 0);
347 gtk_text_buffer_insert (buffer, &iter, text, -1);
349 set_window_title_from_filename (se, filename);
350 gtk_text_buffer_set_modified (buffer, FALSE);
356 /* Callback for the File->Open->Syntax menuitem */
358 open_syntax_window (GtkMenuItem *menuitem, gpointer parent)
360 GtkFileFilter *filter;
364 gtk_file_chooser_dialog_new (_("Open Syntax"),
366 GTK_FILE_CHOOSER_ACTION_OPEN,
367 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
368 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
371 filter = gtk_file_filter_new ();
372 gtk_file_filter_set_name (filter, _("Syntax Files (*.sps) "));
373 gtk_file_filter_add_pattern (filter, "*.sps");
374 gtk_file_filter_add_pattern (filter, "*.SPS");
375 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog), filter);
377 filter = gtk_file_filter_new ();
378 gtk_file_filter_set_name (filter, _("All Files"));
379 gtk_file_filter_add_pattern (filter, "*");
380 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
382 response = gtk_dialog_run (GTK_DIALOG (dialog));
384 if (response == GTK_RESPONSE_ACCEPT)
386 const char *file_name = gtk_file_chooser_get_filename
387 (GTK_FILE_CHOOSER (dialog));
389 struct syntax_editor *se = new_syntax_editor (file_name);
391 load_editor_from_file (se, file_name, NULL);
393 gtk_widget_show (se->window);
396 gtk_widget_destroy (dialog);
401 /* FIXME: get rid of these functions */
403 on_syntax4_activate (GtkMenuItem *menuitem,
406 g_print ("%s\n", __FUNCTION__);
412 on_syntax2_activate (GtkMenuItem *menuitem,
415 g_print ("%s\n", __FUNCTION__);
419 on_syntax1_activate (GtkMenuItem *menuitem,
422 g_print ("%s\n", __FUNCTION__);
423 new_syntax_window (menuitem, user_data);