Add syntax mode radio button to syntax editor window.
authorBen Pfaff <blp@cs.stanford.edu>
Thu, 11 Mar 2021 03:42:27 +0000 (19:42 -0800)
committerBen Pfaff <blp@cs.stanford.edu>
Thu, 11 Mar 2021 03:42:27 +0000 (19:42 -0800)
A number of users have reported problems with the syntax mode.  I am not
sure why.  This should allow them to select the syntax mode they actually
need to use, just in case.  The default should be unchanged (it is still
Auto).

src/ui/gui/psppire-lex-reader.c
src/ui/gui/psppire-lex-reader.h
src/ui/gui/psppire-syntax-window.c
src/ui/gui/psppire-syntax-window.h
src/ui/gui/syntax-editor.ui

index dac318a838e722fe664b127b5b82d9a7078866d3..f975fe4501e8d5bfd7cc1d63ba9ab5a2c692219c 100644 (file)
@@ -54,11 +54,14 @@ lex_gtk_text_buffer_reader_cast (struct lex_reader *r)
 
 
 struct lex_reader *
-lex_reader_for_gtk_text_buffer (GtkTextBuffer *buffer, GtkTextIter start, GtkTextIter stop)
+lex_reader_for_gtk_text_buffer (GtkTextBuffer *buffer,
+                                GtkTextIter start, GtkTextIter stop,
+                                enum lex_syntax_mode syntax_mode)
 {
   struct lex_gtk_text_buffer_reader *r = xmalloc (sizeof *r);
 
   lex_reader_init (&r->reader, &lex_gtk_text_buffer_reader_class);
+  r->reader.syntax = syntax_mode;
 
   r->buffer = buffer;
   g_object_ref (buffer);
index 954d78c423f619f1f722751431c98674aad0ba0c..4da6844249030271f05220fa70c1065de73ee7c8 100644 (file)
 #define  LEX_READER_H
 
 #include <gtk/gtk.h>
+#include "language/lexer/lexer.h"
 
-struct lex_reader;
-
-struct lex_reader *lex_reader_for_gtk_text_buffer (GtkTextBuffer *buffer, GtkTextIter start, GtkTextIter stop);
+struct lex_reader *lex_reader_for_gtk_text_buffer (
+  GtkTextBuffer *buffer,
+  GtkTextIter start, GtkTextIter stop,
+  enum lex_syntax_mode);
 
 #endif
index 3c486848352dd12bd7ab1e0d5e3f12b3bd4c4807..6a84318ab56143f29b6dac35822e537ef173c667 100644 (file)
@@ -197,7 +197,8 @@ editor_execute_syntax (const PsppireSyntaxWindow *sw, GtkTextIter start,
                       GtkTextIter stop)
 {
   PsppireWindow *win = PSPPIRE_WINDOW (sw);
-  struct lex_reader *reader = lex_reader_for_gtk_text_buffer (GTK_TEXT_BUFFER (sw->buffer), start, stop);
+  struct lex_reader *reader = lex_reader_for_gtk_text_buffer (
+    GTK_TEXT_BUFFER (sw->buffer), start, stop, sw->syntax_mode);
 
   lex_reader_set_file_name (reader, psppire_window_get_filename (win));
 
@@ -514,6 +515,24 @@ on_run_current_line (PsppireSyntaxWindow *se)
 
 
 
+static void
+on_syntax (GAction *action, GVariant *param, PsppireSyntaxWindow *sw)
+{
+  g_action_change_state (action, param);
+  GVariant *new_state = g_action_get_state (action);
+
+  const gchar *what = g_variant_get_string (new_state, NULL);
+  if (0 == g_strcmp0 (what, "auto"))
+    sw->syntax_mode = LEX_SYNTAX_AUTO;
+  else if (0 == g_strcmp0 (what, "interactive"))
+    sw->syntax_mode = LEX_SYNTAX_INTERACTIVE;
+  else if (0 == g_strcmp0 (what, "batch"))
+    sw->syntax_mode = LEX_SYNTAX_BATCH;
+  else
+    g_warn_if_reached ();
+}
+
+
 /* Append ".sps" to FILENAME if necessary.
    The returned result must be freed when no longer required.
  */
@@ -760,6 +779,7 @@ psppire_syntax_window_init (PsppireSyntaxWindow *window)
                NULL);
 
   window->encoding = NULL;
+  window->syntax_mode = LEX_SYNTAX_AUTO;
 
   window->cliptext = NULL;
   window->dispose_has_run = FALSE;
@@ -950,6 +970,13 @@ psppire_syntax_window_init (PsppireSyntaxWindow *window)
     g_action_map_add_action (G_ACTION_MAP (window), G_ACTION (run_to_end));
   }
 
+  {
+    GSimpleAction *act_syntax = g_simple_action_new_stateful ("syntax", G_VARIANT_TYPE_STRING,
+                                                                g_variant_new_string ("auto"));
+    g_signal_connect (act_syntax, "activate", G_CALLBACK (on_syntax), window);
+    g_action_map_add_action (G_ACTION_MAP (window), G_ACTION (act_syntax));
+  }
+
   gtk_menu_shell_append (GTK_MENU_SHELL (menubar),
                         create_windows_menu (GTK_WINDOW (window)));
 
index 43dd1b914b4391aaaa2489fa18b919e2cf40d22a..3d54681fb2b88862cecf8340d42a035ccf2d5212 100644 (file)
@@ -25,6 +25,8 @@
 
 #include <gtksourceview/gtksource.h>
 
+#include "language/lexer/lexer.h"
+
 G_BEGIN_DECLS
 
 #define PSPPIRE_SYNTAX_WINDOW_TYPE            (psppire_syntax_window_get_type ())
@@ -48,10 +50,10 @@ struct _PsppireSyntaxWindow
   /* <private> */
 
   GtkSourceBuffer *buffer;  /* The buffer which contains the text */
-  struct lexer *lexer;    /* Lexer to parse syntax */
   gchar *encoding;              /* File's encoding. */
   GtkWidget *sb;
   guint text_context;
+  enum lex_syntax_mode syntax_mode;
 
   GtkPrintSettings *print_settings;
   GtkSourcePrintCompositor *compositor;
index 7ed0420c155e67df6d890bddaccc29080d974224..49780048d1690f45cb438f709ca7763b93ee5901 100644 (file)
        <attribute name="action">win.run-to-end</attribute>
       </item>
     </section>
+    <section>
+      <item>
+       <attribute name="label" translatable="yes">A_uto Syntax</attribute>
+        <attribute name="target">auto</attribute>
+       <attribute name="action">win.syntax</attribute>
+      </item>
+      <item>
+       <attribute name="label" translatable="yes">_Interactive Syntax</attribute>
+        <attribute name="target">interactive</attribute>
+       <attribute name="action">win.syntax</attribute>
+      </item>
+      <item>
+       <attribute name="label" translatable="yes">_Batch Syntax</attribute>
+        <attribute name="target">batch</attribute>
+       <attribute name="action">win.syntax</attribute>
+      </item>
+    </section>
   </submenu>
 </menu>
 <object class="GtkScrolledWindow" id="scrolledwindow8">