Whitespace changes only.
[pspp-builds.git] / src / ui / gui / syntax-editor.c
index 05a4c8851b09019fd156db44fbfcd6e95f78bf6c..d8bf15b9cd8477ba73211c87e857a36326aa1602 100644 (file)
 
 #include "window-manager.h"
 
+#include <language/lexer/lexer.h>
 #include <language/command.h>
 #include <data/procedure.h>
 #include "syntax-editor.h"
 #include "syntax-editor-source.h"
 
 extern struct source_stream *the_source_stream ;
-extern struct lexer *the_lexer;
 extern struct dataset *the_dataset;
 
 static gboolean save_editor_to_file (struct syntax_editor *se,
@@ -57,7 +57,7 @@ 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,
@@ -65,18 +65,18 @@ save_if_modified (struct syntax_editor *se)
                                e->name ? e->name : _("Untitled")
                                );
 
-      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);
 
@@ -111,7 +111,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 +121,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));
 
@@ -196,19 +196,14 @@ on_quit (GtkMenuItem *menuitem, gpointer    user_data)
 }
 
 static void
-on_run_all (GtkMenuItem *menuitem, gpointer user_data)
+execute_syntax (const struct syntax_editor *se, GtkTextIter start,
+               GtkTextIter stop)
 {
-  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);
-
   getl_append_source (the_source_stream,
-                     create_syntax_editor_source (se, begin, end));
+                     create_syntax_editor_source (se, start, stop));
   for (;;)
     {
-      int result = cmd_parse (the_lexer, the_dataset,
+      int result = cmd_parse (se->lexer, the_dataset,
                              proc_has_source (the_dataset)
                              ? CMD_STATE_DATA : CMD_STATE_INITIAL);
 
@@ -217,6 +212,87 @@ on_run_all (GtkMenuItem *menuitem, gpointer user_data)
     }
 }
 
+/* Parse and execute all the text in the buffer */
+static void
+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);
+
+
+  execute_syntax (se, begin, end);
+}
+
+/* Parse and execute the currently selected text */
+static void
+on_run_selection (GtkMenuItem *menuitem, gpointer user_data)
+{
+  GtkTextIter begin, end;
+  struct syntax_editor *se = user_data;
+
+  if ( gtk_text_buffer_get_selection_bounds (se->buffer, &begin, &end) )
+    execute_syntax (se, begin, end);
+}
+
+
+/* Parse and execute the current line */
+static void
+on_run_current_line (GtkMenuItem *menuitem, gpointer user_data)
+{
+  GtkTextIter begin, end;
+  GtkTextIter here;
+  gint line;
+
+  struct syntax_editor *se = user_data;
+
+  /* Get the current line */
+  gtk_text_buffer_get_iter_at_mark (se->buffer,
+                                   &here,
+                                   gtk_text_buffer_get_insert (se->buffer)
+                                   );
+
+  line = gtk_text_iter_get_line (&here) ;
+
+  /* Now set begin and end to the start of this line, and start of
+     following line respectively */
+  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);
+}
+
+
+
+/* Parse and execute the from the current line, to the end of the
+   buffer */
+static void
+on_run_to_end (GtkMenuItem *menuitem, gpointer user_data)
+{
+  GtkTextIter begin, end;
+  GtkTextIter here;
+  gint line;
+
+  struct syntax_editor *se = user_data;
+
+  /* Get the current line */
+  gtk_text_buffer_get_iter_at_mark (se->buffer,
+                                   &here,
+                                   gtk_text_buffer_get_insert (se->buffer)
+                                   );
+
+  line = gtk_text_iter_get_line (&here) ;
+
+  /* Now set begin and end to the start of this line, and end of buffer
+     respectively */
+  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);
+}
+
 
 
 
@@ -240,65 +316,85 @@ new_syntax_editor (void)
 
   e->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"),
                    "activate",
-                   G_CALLBACK(new_syntax_window),
+                   G_CALLBACK (new_syntax_window),
                    e->window);
 
   g_signal_connect (get_widget_assert (xml,"file_open_syntax"),
                    "activate",
-                   G_CALLBACK(open_syntax_window),
+                   G_CALLBACK (open_syntax_window),
                    e->window);
 
   g_signal_connect (get_widget_assert (xml,"file_new_data"),
                    "activate",
-                   G_CALLBACK(new_data_window),
+                   G_CALLBACK (new_data_window),
                    e->window);
 
   g_signal_connect (get_widget_assert (xml,"file_open_data"),
                    "activate",
-                   G_CALLBACK(open_data_window),
+                   G_CALLBACK (open_data_window),
                    e->window);
 
 
   g_signal_connect (get_widget_assert (xml,"help_about"),
                    "activate",
-                   G_CALLBACK(about_new),
+                   G_CALLBACK (about_new),
                    e->window);
 
 
 #if 0
 
-  g_signal_connect (get_widget_assert (xml,"file_quit"),
-                   "activate",
-                   G_CALLBACK(on_quit),
-                   se);
-
   g_signal_connect (get_widget_assert (xml,"file_save"),
                    "activate",
-                   G_CALLBACK(on_syntax_save),
+                   G_CALLBACK (on_syntax_save),
                    se);
 
   g_signal_connect (get_widget_assert (xml,"file_save_as"),
                    "activate",
-                   G_CALLBACK(on_syntax_save_as),
+                   G_CALLBACK (on_syntax_save_as),
                    se);
 
 #endif
 
+  g_signal_connect (get_widget_assert (xml,"file_quit"),
+                   "activate",
+                   G_CALLBACK (on_quit),
+                   se);
+
+
   g_signal_connect (get_widget_assert (xml,"run_all"),
                    "activate",
-                   G_CALLBACK(on_run_all),
+                   G_CALLBACK (on_run_all),
+                   se);
+
+
+  g_signal_connect (get_widget_assert (xml,"run_selection"),
+                   "activate",
+                   G_CALLBACK (on_run_selection),
                    se);
 
+  g_signal_connect (get_widget_assert (xml,"run_current_line"),
+                   "activate",
+                   G_CALLBACK (on_run_current_line),
+                   se);
+
+
+  g_signal_connect (get_widget_assert (xml,"run_to_end"),
+                   "activate",
+                   G_CALLBACK (on_run_to_end),
+                   se);
 
 
   g_object_unref (xml);
 
   g_signal_connect (e->window, "delete-event",
-                   G_CALLBACK(on_delete), se);
+                   G_CALLBACK (on_delete), se);
+
+
 
   return se;
 }
@@ -398,7 +494,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,
@@ -408,7 +504,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"));
@@ -431,8 +527,3 @@ open_syntax_window (GtkMenuItem *menuitem, gpointer parent)
   gtk_widget_destroy (dialog);
 }
 
-
-
-
-
-