From: John Darrington Date: Fri, 1 Jul 2011 12:54:36 +0000 (+0200) Subject: Merge remote branch 'savannah/master' into sourceview X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?p=pspp;a=commitdiff_plain;h=fe8dc2171009e90d2335f159d05f7e6660e24780 Merge remote branch 'savannah/master' into sourceview 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 --- fe8dc2171009e90d2335f159d05f7e6660e24780 diff --cc src/ui/gui/psppire-syntax-window.c index c7251a1ab7,b117825f75..b5cf0d3345 --- a/src/ui/gui/psppire-syntax-window.c +++ b/src/ui/gui/psppire-syntax-window.c @@@ -16,32 -16,27 +16,33 @@@ #include - #include "relocatable.h" - - #include - #include - #include "executor.h" - #include "helper.h" + #include + #include +#include +#include +#include +#include + - #include - #include - - #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 + - #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 #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); + } - /* 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) @@@ -631,19 -673,6 +710,17 @@@ 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) { @@@ -661,30 -688,8 +738,31 @@@ 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; @@@ -693,7 -698,7 +771,7 @@@ 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) ) { @@@ -887,22 -877,24 +970,31 @@@ 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); diff --cc src/ui/gui/psppire-syntax-window.h index df16ed3ba6,31ceebb224..c4a6d2c07a --- a/src/ui/gui/psppire-syntax-window.h +++ b/src/ui/gui/psppire-syntax-window.h @@@ -20,16 -20,9 +20,14 @@@ #include #include - #include - #include - #include "psppire-window.h" #include + #include "psppire-window.h" +#include +#include +#include +#include + G_BEGIN_DECLS #define PSPPIRE_SYNTAX_WINDOW_TYPE (psppire_syntax_window_get_type ()) @@@ -52,8 -45,9 +50,9 @@@ struct _PsppireSyntaxWindo /* */ + GtkSourceBuffer *buffer; /* The buffer which contains the text */ + struct lexer *lexer; /* Lexer to parse syntax */ + gchar *encoding; /* File's encoding. */ - - GtkTextBuffer *buffer; /* The buffer which contains the text */ GtkWidget *sb; guint text_context; diff --cc src/ui/gui/syntax-editor.ui index 4f134c2e1c,91fdec4946..51e589ec73 --- a/src/ui/gui/syntax-editor.ui +++ b/src/ui/gui/syntax-editor.ui @@@ -56,14 -45,9 +45,15 @@@ gtk-save-as file_save_as + Save _As... + + + file_print + gtk-print + + gtk-quit