Merge remote branch 'savannah/master' into sourceview
authorJohn Darrington <john@darrington.wattle.id.au>
Fri, 1 Jul 2011 12:54:36 +0000 (14:54 +0200)
committerJohn Darrington <john@darrington.wattle.id.au>
Fri, 1 Jul 2011 12:54:36 +0000 (14:54 +0200)
Conflicts:
src/ui/gui/automake.mk
src/ui/gui/psppire-data-window.c
src/ui/gui/psppire-syntax-window.c
src/ui/gui/psppire-syntax-window.h

1  2 
INSTALL
configure.ac
src/ui/gui/automake.mk
src/ui/gui/psppire-data-window.c
src/ui/gui/psppire-syntax-window.c
src/ui/gui/psppire-syntax-window.h
src/ui/gui/syntax-editor.ui

diff --cc INSTALL
Simple merge
diff --cc configure.ac
Simple merge
Simple merge
Simple merge
index c7251a1ab77206c9772df3f377b408708ef67ad3,b117825f752f8e7e074ac2f179651733533cd2c9..b5cf0d3345d27cc45474bcc24e3cbe53c6562c0c
  
  #include <config.h>
  
- #include "relocatable.h"
- #include <gtk/gtksignal.h>
- #include <gtk/gtkbox.h>
- #include "executor.h"
- #include "helper.h"
+ #include <gtk/gtk.h>
+ #include <stdlib.h>
  
- #include <libpspp/message.h>
- #include <stdlib.h>
- #include "psppire.h"
- #include "psppire-data-window.h"
- #include "psppire-window-register.h"
- #include "psppire.h"
- #include "help-menu.h"
- #include "psppire-syntax-window.h"
- #include "syntax-editor-source.h"
- #include <language/lexer/lexer.h>
 +#include <gtksourceview/gtksourcebuffer.h>
 +#include <gtksourceview/gtksourcelanguage.h>
 +#include <gtksourceview/gtksourcelanguagemanager.h>
 +#include <gtksourceview/gtksourceprintcompositor.h>
 +
- #include "xalloc.h"
 +
+ #include "language/lexer/lexer.h"
+ #include "libpspp/encoding-guesser.h"
+ #include "libpspp/i18n.h"
+ #include "libpspp/message.h"
+ #include "ui/gui/executor.h"
+ #include "ui/gui/help-menu.h"
+ #include "ui/gui/helper.h"
+ #include "ui/gui/psppire-data-window.h"
+ #include "ui/gui/psppire-encoding-selector.h"
+ #include "ui/gui/psppire-syntax-window.h"
+ #include "ui/gui/psppire-syntax-window.h"
+ #include "ui/gui/psppire-window-register.h"
+ #include "ui/gui/psppire.h"
+ #include "ui/gui/psppire.h"
+ #include "gl/localcharset.h"
+ #include "gl/xalloc.h"
+ #include "gl/xvasprintf.h"
  
  #include <gettext.h>
  #define _(msgid) gettext (msgid)
@@@ -135,33 -180,24 +186,47 @@@ psppire_syntax_window_dispose (GObject 
  static void
  psppire_syntax_window_class_init (PsppireSyntaxWindowClass *class)
  {
++  GParamSpec *encoding_spec;
    GObjectClass *gobject_class = G_OBJECT_CLASS (class);
  
 -  GParamSpec *encoding_spec =
 +  GtkSourceLanguageManager *lm = gtk_source_language_manager_get_default ();
 +
 +  const gchar * const *existing_paths =  gtk_source_language_manager_get_search_path (lm);
 +  gchar **new_paths = g_strdupv ((gchar **)existing_paths);
 +  int n = g_strv_length ((gchar **) existing_paths);
 +
 +  new_paths = g_realloc (new_paths, (n + 2) * sizeof (*new_paths));
 +  new_paths[n] = g_strdup (relocate (PKGDATADIR));
 +  new_paths[n+1] = NULL;
 +
 +  lm = gtk_source_language_manager_new ();
 +  gtk_source_language_manager_set_search_path (lm, new_paths);
 +
 +  class->lan = gtk_source_language_manager_get_language (lm, "pspp");
 +
 +  if (class->lan == NULL)
 +    g_warning ("pspp.lang file not found.  Syntax highlighting will not be available.");
 +
 +  parent_class = g_type_class_peek_parent (class);
 +
 +  g_strfreev (new_paths);
 +
++  encoding_spec =
+     null_if_empty_param ("encoding",
+                          "Character encoding",
+                          "IANA character encoding in this syntax file",
+                        NULL,
+                        G_PARAM_CONSTRUCT | G_PARAM_READWRITE);
    parent_class = g_type_class_peek_parent (class);
  
+   gobject_class->set_property = psppire_syntax_window_set_property;
+   gobject_class->get_property = psppire_syntax_window_get_property;
    gobject_class->dispose = psppire_syntax_window_dispose;
+   g_object_class_install_property (gobject_class,
+                                    PROP_ENCODING,
+                                    encoding_spec);
  }
  
  
@@@ -186,13 -223,18 +251,16 @@@ editor_execute_syntax (const PsppireSyn
                       GtkTextIter stop)
  {
    PsppireWindow *win = PSPPIRE_WINDOW (sw);
-   const gchar *name = psppire_window_get_filename (win);
-   execute_syntax (create_syntax_editor_source (GTK_TEXT_BUFFER (sw->buffer), start, stop, name));
- }
+   struct lex_reader *reader;
 -  gchar *text;
 -
 -  text = gtk_text_buffer_get_text (sw->buffer, &start, &stop, FALSE);
++  gchar *text = gtk_text_buffer_get_text (GTK_TEXT_BUFFER (sw->buffer), &start, &stop, FALSE);
+   reader = lex_reader_for_string (text);
+   g_free (text);
  
+   lex_reader_set_file_name (reader, psppire_window_get_filename (win));
  
+   execute_syntax (psppire_default_data_window (), reader);
+ }
  \f
  /* Delete the currently selected text */
  static void
  on_edit_delete (PsppireSyntaxWindow *sw)
@@@ -476,7 -518,8 +544,8 @@@ save_editor_to_file (PsppireSyntaxWindo
                     const gchar *filename,
                     GError **err)
  {
 -  GtkTextBuffer *buffer = se->buffer;
 +  GtkTextBuffer *buffer = GTK_TEXT_BUFFER (se->buffer);
+   struct substring text_locale;
    gboolean result ;
    GtkTextIter start, stop;
    gchar *text;
@@@ -612,17 -650,21 +691,17 @@@ create_syntax_window (void
  }
  
  void
- open_new_syntax_window (const char *file_name)
+ open_syntax_window (const char *file_name, const gchar *encoding)
  {
-   GtkWidget *se = psppire_syntax_window_new ();
+   GtkWidget *se = psppire_syntax_window_new (encoding);
  
 -  if ( psppire_window_load (PSPPIRE_WINDOW (se), file_name) )
 -    gtk_widget_show (se);
 -  else
 -    gtk_widget_destroy (se);
 +  if ( file_name)
 +    load_and_show_syntax_window (se, file_name);
  }
  
 -static void
 -on_text_changed (GtkTextBuffer *buffer, PsppireSyntaxWindow *window)
 -{
 -  gtk_statusbar_pop (GTK_STATUSBAR (window->sb), window->text_context);
 -}
 +
 +
 +static void psppire_syntax_window_print (PsppireSyntaxWindow *window);
  
  static void
  on_modified_changed (GtkTextBuffer *buffer, PsppireWindow *window)
      psppire_window_set_unsaved (window);
  }
  
- extern struct source_stream *the_source_stream ;
 +static void undo_redo_update (PsppireSyntaxWindow *window);
 +static void undo_last_edit (PsppireSyntaxWindow *window);
 +static void redo_last_edit (PsppireSyntaxWindow *window);
 +
 +static void
 +on_text_changed (GtkTextBuffer *buffer, PsppireSyntaxWindow *window)
 +{
 +  gtk_statusbar_pop (GTK_STATUSBAR (window->sb), window->text_context);
 +  undo_redo_update (window);
 +}
 +
  static void
  psppire_syntax_window_init (PsppireSyntaxWindow *window)
  {
    GtkClipboard *clip_selection = gtk_widget_get_clipboard (GTK_WIDGET (window), GDK_SELECTION_CLIPBOARD);
    GtkClipboard *clip_primary =   gtk_widget_get_clipboard (GTK_WIDGET (window), GDK_SELECTION_PRIMARY);
  
 +  window->print_settings = NULL;
 +  window->undo_menuitem = get_action_assert (xml, "edit_undo");
 +  window->redo_menuitem = get_action_assert (xml, "edit_redo");
 +
 +  if (class->lan)
 +    window->buffer = gtk_source_buffer_new_with_language (class->lan);
 +  else
 +    window->buffer = gtk_source_buffer_new (NULL);
 +
 +  gtk_text_view_set_buffer (GTK_TEXT_VIEW (text_view), GTK_TEXT_BUFFER (window->buffer));
 +
 +  g_object_set (window->buffer,
 +              "highlight-matching-brackets", TRUE,
 +              NULL);
 +
 +  g_object_set (text_view,
 +              "show-line-numbers", TRUE,
 +              "show-line-marks", TRUE,
 +              "auto-indent", TRUE,
 +              "indent-width", 4,
 +              "highlight-current-line", TRUE,
 +              NULL);
 +
+   window->encoding = NULL;
    window->cliptext = NULL;
    window->dispose_has_run = FALSE;
  
    window->edit_cut = get_action_assert (xml, "edit_cut");
    window->edit_paste = get_action_assert (xml, "edit_paste");
  
-   window->lexer = lex_create (the_source_stream);
 -  window->buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text_view));
++  window->buffer = GTK_SOURCE_BUFFER (gtk_text_view_get_buffer (GTK_TEXT_VIEW (text_view)));
  
    window->sb = get_widget_assert (xml, "statusbar2");
    window->text_context = gtk_statusbar_get_context_id (GTK_STATUSBAR (window->sb), "Text Context");
@@@ -878,7 -866,9 +958,10 @@@ syntax_load (PsppireWindow *window, con
    gsize len_utf8 = -1;
    GtkTextIter iter;
    PsppireSyntaxWindow *sw = PSPPIRE_SYNTAX_WINDOW (window);
 +  GtkTextBuffer *buffer = GTK_TEXT_BUFFER (sw->buffer);
+   gchar *encoding;
+   char *mime_type;
    /* FIXME: What if it's a very big file ? */
    if ( ! g_file_get_contents (filename, &text_locale, &len_locale, &err) )
      {
        return FALSE;
      }
  
-   text_utf8 = g_locale_to_utf8 (text_locale, len_locale, NULL, &len_utf8, &err);
+   /* Determine the file's encoding and update sw->encoding.  (The ordering is
+      important here because encoding_guess_whole_file() often returns its
+      argument instead of a copy of it.) */
+   encoding = g_strdup (encoding_guess_whole_file (sw->encoding, text_locale,
+                                                   len_locale));
+   g_free (sw->encoding);
+   sw->encoding = encoding;
+   text_utf8 = recode_substring_pool ("UTF-8", encoding,
+                                      ss_buffer (text_locale, len_locale),
+                                      NULL).string;
    free (text_locale);
  
 -  gtk_text_buffer_get_iter_at_line (sw->buffer, &iter, 0);
 +  if ( text_utf8 == NULL )
 +    {
 +      error_dialog (GTK_WINDOW (window), filename, err);
 +      g_clear_error (&err);
 +      return FALSE;
 +    }
  
 -  gtk_text_buffer_insert (sw->buffer, &iter, text_utf8, len_utf8);
 +  gtk_text_buffer_get_iter_at_line (buffer, &iter, 0);
  
 -  gtk_text_buffer_set_modified (sw->buffer, FALSE);
 +  gtk_text_buffer_insert (buffer, &iter, text_utf8, len_utf8);
 +
 +  gtk_text_buffer_set_modified (buffer, FALSE);
  
    free (text_utf8);
  
index df16ed3ba62fd650552c8897c01f1b3d48f925f5,31ceebb224185b9c4224bafcad19bd3414af2c7f..c4a6d2c07a5d56c8816460107efc668ce65a6bb4
  
  #include <glib.h>
  #include <glib-object.h>
- #include <gtk/gtkaction.h>
- #include <gtk/gtktextbuffer.h>
- #include "psppire-window.h"
  #include <gtk/gtk.h>
+ #include "psppire-window.h"
  
 +#include <gtksourceview/gtksourcelanguage.h>
 +#include <gtksourceview/gtksourcelanguagemanager.h>
 +#include <gtksourceview/gtksourcebuffer.h>
 +#include <gtksourceview/gtksourceprintcompositor.h>
 +
  G_BEGIN_DECLS
  
  #define PSPPIRE_SYNTAX_WINDOW_TYPE            (psppire_syntax_window_get_type ())
@@@ -52,8 -45,9 +50,9 @@@ struct _PsppireSyntaxWindo
  
    /* <private> */
  
 -
 -  GtkTextBuffer *buffer;  /* The buffer which contains the text */
 +  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;
  
index 4f134c2e1cb51b966674a5c0dc764941b7a5b93e,91fdec4946b7049b398b4a35bfe4e8a49c0591c0..51e589ec730c048cbd2a72799fc8c4800dff0f1c
            <object class="GtkAction" id="file_save_as">
              <property name="stock-id">gtk-save-as</property>
              <property name="name">file_save_as</property>
+             <property name="label" translatable="yes">Save _As...</property>
            </object>
          </child>
 +        <child>
 +          <object class="GtkAction" id="file_print">
 +            <property name="name">file_print</property>
 +            <property name="stock-id">gtk-print</property>
 +          </object>
 +        </child>
          <child>
            <object class="GtkAction" id="file_quit">
              <property name="stock-id">gtk-quit</property>