Added the ability to run syntax from the syntax editor.
[pspp-builds.git] / src / ui / gui / syntax-editor-source.c
diff --git a/src/ui/gui/syntax-editor-source.c b/src/ui/gui/syntax-editor-source.c
new file mode 100644 (file)
index 0000000..53478d2
--- /dev/null
@@ -0,0 +1,130 @@
+/*
+    PSPPIRE --- A Graphical User Interface for PSPP
+    Copyright (C) 2006  Free Software Foundation
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+    02110-1301, USA. */
+
+
+#include <libpspp/getl.h>
+#include <libpspp/alloc.h>
+#include <libpspp/compiler.h>
+#include <libpspp/str.h>
+
+#include <stdlib.h>
+
+#include <gtk/gtk.h>
+
+#include "syntax-editor-source.h"
+#include "syntax-editor.h"
+
+struct syntax_editor_source
+  {
+    struct getl_interface parent;
+    const struct syntax_editor *se;
+    GtkTextIter i;
+    GtkTextIter end;
+  };
+
+
+static bool
+always_false (const struct getl_interface *i UNUSED)
+{
+  return false;
+}
+
+/* Returns the name of the source */
+static const char *
+name (const struct getl_interface *i)
+{
+  const struct syntax_editor_source *ses =
+    (const struct syntax_editor_source *) i;
+
+  return ses->se->name;
+}
+
+
+/* Returns the location within the source */
+static int
+location (const struct getl_interface *i)
+{
+  const struct syntax_editor_source *ses = (const struct syntax_editor_source *) i;
+
+  return gtk_text_iter_get_line (&ses->i);
+}
+
+
+static bool
+read_line_from_buffer (struct getl_interface *i,
+                      struct string *line,
+                      enum getl_syntax *syntax_rules)
+{
+  gchar *text;
+  GtkTextIter next_line;
+
+  struct syntax_editor_source *ses = (struct syntax_editor_source *) i;
+
+  if ( gtk_text_iter_compare (&ses->i, &ses->end) >= 0)
+    return false;
+
+  gtk_text_buffer_get_iter_at_line ( ses->se->buffer,
+                                    &next_line,
+                                    1 + gtk_text_iter_get_line (&ses->i)
+                                    );
+
+  text = gtk_text_buffer_get_text (ses->se->buffer,
+                                  &ses->i, &next_line,
+                                  FALSE);
+  g_strchomp (text);
+
+  ds_assign_cstr (line, text);
+
+  g_free (text);
+
+  gtk_text_iter_forward_line (&ses->i);
+
+  return true;
+}
+
+
+static void
+close (struct getl_interface *i )
+{
+  free (i);
+}
+
+struct getl_interface *
+create_syntax_editor_source (const struct syntax_editor *se,
+                            GtkTextIter start,
+                            GtkTextIter stop
+                            )
+{
+  struct syntax_editor_source *ses = xzalloc (sizeof *ses);
+
+  ses->se = se;
+  ses->i = start;
+  ses->end = stop;
+
+
+  ses->parent.interactive = always_false;
+  ses->parent.read = read_line_from_buffer;
+  ses->parent.close = close;
+
+  ses->parent.name = name;
+  ses->parent.location = location;
+
+
+  return (struct getl_interface *) ses;
+}