X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fsyntax-editor.c;h=fc9a44011dd045223a248e901b0436637d41c628;hb=fe3a0a8896cc9f099196f0d0228bb0cfa688c34a;hp=31307978a970df67e08330532581affc5d30ae4d;hpb=13d1b533c6ce0545a4b06e5e30c73211591034c5;p=pspp-builds.git diff --git a/src/ui/gui/syntax-editor.c b/src/ui/gui/syntax-editor.c index 31307978..fc9a4401 100644 --- a/src/ui/gui/syntax-editor.c +++ b/src/ui/gui/syntax-editor.c @@ -33,6 +33,7 @@ #include "window-manager.h" +#include #include #include #include @@ -46,6 +47,21 @@ static gboolean save_editor_to_file (struct syntax_editor *se, const gchar *filename, GError **err); +/* Append ".sps" to FILENAME if necessary. + The returned result must be freed when no longer required. + */ +static gchar * +append_suffix (const gchar *filename) +{ + if ( ! g_str_has_suffix (filename, ".sps" ) && + ! g_str_has_suffix (filename, ".SPS" ) ) + { + return g_strdup_printf ("%s.sps", filename); + } + + return strdup (filename); +} + /* If the buffer's modified flag is set, then save it, and close the window. Otherwise just close the window. */ @@ -57,26 +73,26 @@ save_if_modified (struct syntax_editor *se) { gint response; GtkWidget *dialog = - gtk_message_dialog_new (GTK_WINDOW(e->window), + gtk_message_dialog_new (GTK_WINDOW (e->window), GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, _("Save contents of syntax editor to %s?"), - e->name ? e->name : _("Untitled") + e->name ); - gtk_dialog_add_button (GTK_DIALOG(dialog), + gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_YES, GTK_RESPONSE_ACCEPT); - gtk_dialog_add_button (GTK_DIALOG(dialog), + gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_NO, GTK_RESPONSE_REJECT); - gtk_dialog_add_button (GTK_DIALOG(dialog), + gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); - response = gtk_dialog_run (GTK_DIALOG(dialog)); + response = gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); @@ -84,8 +100,7 @@ save_if_modified (struct syntax_editor *se) { GError *err = NULL; - if ( ! save_editor_to_file (se, e->name ? e->name : _("Untitled"), - &err) ) + if ( ! save_editor_to_file (se, e->name, &err) ) { msg (ME, err->message); g_error_free (err); @@ -96,13 +111,12 @@ save_if_modified (struct syntax_editor *se) return ; } - gtk_widget_destroy (e->window); + gtk_widget_destroy (GTK_WIDGET (e->window)); } /* Callback for the File->SaveAs menuitem */ static void -on_syntax_save_as (GtkMenuItem *menuitem, - gpointer user_data) +on_syntax_save_as (GtkMenuItem *menuitem, gpointer user_data) { GtkFileFilter *filter; gint response; @@ -111,7 +125,7 @@ on_syntax_save_as (GtkMenuItem *menuitem, GtkWidget *dialog = gtk_file_chooser_dialog_new (_("Save Syntax"), - GTK_WINDOW(e->window), + GTK_WINDOW (e->window), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, @@ -121,14 +135,14 @@ on_syntax_save_as (GtkMenuItem *menuitem, gtk_file_filter_set_name (filter, _("Syntax Files (*.sps) ")); gtk_file_filter_add_pattern (filter, "*.sps"); gtk_file_filter_add_pattern (filter, "*.SPS"); - gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog), filter); + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter); filter = gtk_file_filter_new (); gtk_file_filter_set_name (filter, _("All Files")); gtk_file_filter_add_pattern (filter, "*"); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter); - gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER(dialog), + gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (dialog), TRUE); response = gtk_dialog_run (GTK_DIALOG (dialog)); @@ -156,9 +170,8 @@ on_syntax_save_as (GtkMenuItem *menuitem, } /* Callback for the File->Save menuitem */ -void -on_syntax_save (GtkMenuItem *menuitem, - gpointer user_data) +static void +on_syntax_save (GtkMenuItem *menuitem, gpointer user_data) { struct syntax_editor *se = user_data; struct editor_window *e = user_data; @@ -167,10 +180,13 @@ on_syntax_save (GtkMenuItem *menuitem, on_syntax_save_as (menuitem, user_data); else { - GError *err; + GError *err = NULL; save_editor_to_file (se, e->name, &err); - msg (ME, err->message); - g_error_free (err); + if ( err ) + { + msg (ME, err->message); + g_error_free (err); + } } } @@ -196,20 +212,10 @@ on_quit (GtkMenuItem *menuitem, gpointer user_data) } static void -execute_syntax (const struct syntax_editor *se, GtkTextIter start, +editor_execute_syntax (const struct syntax_editor *se, GtkTextIter start, GtkTextIter stop) { - getl_append_source (the_source_stream, - create_syntax_editor_source (se, start, stop)); - for (;;) - { - int result = cmd_parse (se->lexer, the_dataset, - proc_has_source (the_dataset) - ? CMD_STATE_DATA : CMD_STATE_INITIAL); - - if (result == CMD_EOF || result == CMD_FINISH) - break; - } + execute_syntax (create_syntax_editor_source (se, start, stop)); } /* Parse and execute all the text in the buffer */ @@ -219,11 +225,10 @@ on_run_all (GtkMenuItem *menuitem, gpointer user_data) GtkTextIter begin, end; struct syntax_editor *se = user_data; - gtk_text_buffer_get_iter_at_line (se->buffer, &begin, 0); - gtk_text_buffer_get_iter_at_line (se->buffer, &end, -1); - + gtk_text_buffer_get_iter_at_offset (se->buffer, &begin, 0); + gtk_text_buffer_get_iter_at_offset (se->buffer, &end, -1); - execute_syntax (se, begin, end); + editor_execute_syntax (se, begin, end); } /* Parse and execute the currently selected text */ @@ -234,7 +239,7 @@ on_run_selection (GtkMenuItem *menuitem, gpointer user_data) struct syntax_editor *se = user_data; if ( gtk_text_buffer_get_selection_bounds (se->buffer, &begin, &end) ) - execute_syntax (se, begin, end); + editor_execute_syntax (se, begin, end); } @@ -261,7 +266,7 @@ on_run_current_line (GtkMenuItem *menuitem, gpointer user_data) gtk_text_buffer_get_iter_at_line (se->buffer, &begin, line); gtk_text_buffer_get_iter_at_line (se->buffer, &end, line + 1); - execute_syntax (se, begin, end); + editor_execute_syntax (se, begin, end); } @@ -290,7 +295,7 @@ on_run_to_end (GtkMenuItem *menuitem, gpointer user_data) gtk_text_buffer_get_iter_at_line (se->buffer, &begin, line); gtk_text_buffer_get_iter_at_line (se->buffer, &end, -1); - execute_syntax (se, begin, end); + editor_execute_syntax (se, begin, end); } @@ -303,20 +308,21 @@ on_run_to_end (GtkMenuItem *menuitem, gpointer user_data) struct syntax_editor * new_syntax_editor (void) { - GladeXML *xml = - glade_xml_new (PKGDATADIR "/syntax-editor.glade", NULL, NULL); + GladeXML *xml = XML_NEW ("syntax-editor.glade"); GtkWidget *text_view; struct syntax_editor *se ; struct editor_window *e; + connect_help (xml); + se = g_malloc (sizeof (*se)); e = (struct editor_window *)se; - e->window = get_widget_assert (xml, "syntax_editor"); + e->window = GTK_WINDOW (get_widget_assert (xml, "syntax_editor")); text_view = get_widget_assert (xml, "syntax_text_view"); - se->buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(text_view)); + se->buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text_view)); se->lexer = lex_create (the_source_stream); g_signal_connect (get_widget_assert (xml,"file_new_syntax"), @@ -334,31 +340,27 @@ new_syntax_editor (void) G_CALLBACK (new_data_window), e->window); - g_signal_connect (get_widget_assert (xml,"file_open_data"), - "activate", - G_CALLBACK (open_data_window), - e->window); - - g_signal_connect (get_widget_assert (xml,"help_about"), "activate", G_CALLBACK (about_new), e->window); + g_signal_connect (get_widget_assert (xml,"help_reference"), + "activate", + G_CALLBACK (reference_manual), + NULL); -#if 0 - g_signal_connect (get_widget_assert (xml,"file_save"), + g_signal_connect (get_widget_assert (xml, "file_save"), "activate", G_CALLBACK (on_syntax_save), se); - g_signal_connect (get_widget_assert (xml,"file_save_as"), + g_signal_connect (get_widget_assert (xml, "file_save_as"), "activate", G_CALLBACK (on_syntax_save_as), se); -#endif g_signal_connect (get_widget_assert (xml,"file_quit"), "activate", @@ -389,6 +391,13 @@ new_syntax_editor (void) se); + g_signal_connect (get_widget_assert (xml,"windows_minimise_all"), + "activate", + G_CALLBACK (minimise_all_windows), + NULL); + + + g_object_unref (xml); g_signal_connect (e->window, "delete-event", @@ -424,10 +433,15 @@ save_editor_to_file (struct syntax_editor *se, GtkTextIter start, stop; gchar *text; + gchar *suffixedname; gchar *glibfilename; g_assert (filename); - glibfilename = g_filename_from_utf8 (filename, -1, 0, 0, err); + suffixedname = append_suffix (filename); + + glibfilename = g_filename_from_utf8 (suffixedname, -1, 0, 0, err); + + g_free ( suffixedname); if ( ! glibfilename ) return FALSE; @@ -452,7 +466,7 @@ save_editor_to_file (struct syntax_editor *se, /* Loads the buffer from the file called FILENAME */ -static gboolean +gboolean load_editor_from_file (struct syntax_editor *se, const gchar *filename, GError **err) @@ -478,6 +492,9 @@ load_editor_from_file (struct syntax_editor *se, gtk_text_buffer_insert (buffer, &iter, text, -1); + + + window_set_name_from_filename ((struct editor_window *)se, filename); gtk_text_buffer_set_modified (buffer, FALSE); @@ -494,7 +511,7 @@ open_syntax_window (GtkMenuItem *menuitem, gpointer parent) GtkWidget *dialog = gtk_file_chooser_dialog_new (_("Open Syntax"), - GTK_WINDOW(parent), + GTK_WINDOW (parent), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, @@ -504,7 +521,7 @@ open_syntax_window (GtkMenuItem *menuitem, gpointer parent) gtk_file_filter_set_name (filter, _("Syntax Files (*.sps) ")); gtk_file_filter_add_pattern (filter, "*.sps"); gtk_file_filter_add_pattern (filter, "*.SPS"); - gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog), filter); + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter); filter = gtk_file_filter_new (); gtk_file_filter_set_name (filter, _("All Files")); @@ -522,6 +539,19 @@ open_syntax_window (GtkMenuItem *menuitem, gpointer parent) window_create (WINDOW_SYNTAX, file_name); load_editor_from_file (se, file_name, NULL); + +#if RECENT_LISTS_AVAILABLE + { + GtkRecentManager *manager = gtk_recent_manager_get_default(); + gchar *uri = g_filename_to_uri (file_name, NULL, NULL); + + if ( ! gtk_recent_manager_add_item (manager, uri)) + g_warning ("Could not add item %s to recent list\n",uri); + + g_free (uri); + } +#endif + } gtk_widget_destroy (dialog);