Made the code relocatable (using the relocate function from gnulib).
[pspp-builds.git] / src / ui / gui / syntax-editor.c
index 31307978a970df67e08330532581affc5d30ae4d..024181e6a910fca42083bb3e9d987b14958ed1c6 100644 (file)
@@ -33,6 +33,7 @@
 
 #include "window-manager.h"
 
+#include <data/dictionary.h>
 #include <language/lexer/lexer.h>
 #include <language/command.h>
 #include <data/procedure.h>
@@ -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;
@@ -494,7 +508,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 +518,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"));