summaryrefslogtreecommitdiffstats
path: root/gedit/gedit-preferences-dialog.c
diff options
context:
space:
mode:
Diffstat (limited to 'gedit/gedit-preferences-dialog.c')
-rw-r--r--gedit/gedit-preferences-dialog.c841
1 files changed, 841 insertions, 0 deletions
diff --git a/gedit/gedit-preferences-dialog.c b/gedit/gedit-preferences-dialog.c
new file mode 100644
index 0000000..d857059
--- /dev/null
+++ b/gedit/gedit-preferences-dialog.c
@@ -0,0 +1,841 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * gedit-preferences-dialog.c
+ * This file is part of gedit
+ *
+ * Copyright (C) 2001-2005 Paolo Maggi
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include "gedit-preferences-dialog.h"
+
+#include <glib/gi18n.h>
+#include <glib/gstdio.h>
+#include <tepl/tepl.h>
+#include <libpeas-gtk/peas-gtk.h>
+
+#include "gedit-debug.h"
+#include "gedit-dirs.h"
+#include "gedit-settings.h"
+
+/*
+ * gedit-preferences dialog is a singleton since we don't
+ * want two dialogs showing an inconsistent state of the
+ * preferences.
+ * When gedit_show_preferences_dialog is called and there
+ * is already a prefs dialog dialog open, it is reparented
+ * and shown.
+ */
+
+static GtkWidget *preferences_dialog = NULL;
+
+#define GEDIT_SCHEME_ROW_ID_KEY "gedit-scheme-row-id"
+
+#define GEDIT_TYPE_PREFERENCES_DIALOG (gedit_preferences_dialog_get_type())
+
+G_DECLARE_FINAL_TYPE (GeditPreferencesDialog, gedit_preferences_dialog, GEDIT, PREFERENCES_DIALOG, GtkWindow)
+
+enum
+{
+ ID_COLUMN = 0,
+ NAME_COLUMN,
+ DESC_COLUMN,
+ NUM_COLUMNS
+};
+
+enum
+{
+ CLOSE,
+ LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL];
+
+struct _GeditPreferencesDialog
+{
+ GtkWindow parent_instance;
+
+ GSettings *editor;
+ GSettings *uisettings; /* unfortunately our settings are split for historical reasons */
+
+ GtkWidget *notebook;
+
+ /* Style Scheme */
+ GtkWidget *schemes_list;
+ GtkWidget *install_scheme_button;
+ GtkWidget *uninstall_scheme_button;
+ GtkWidget *schemes_toolbar;
+ GtkFileChooserNative *
+ install_scheme_file_chooser;
+
+ /* Tabs */
+ GtkWidget *tabs_width_spinbutton;
+ GtkWidget *insert_spaces_checkbutton;
+
+ /* Auto indentation */
+ GtkWidget *auto_indent_checkbutton;
+
+ /* Text Wrapping */
+ GtkWidget *wrap_text_checkbutton;
+ GtkWidget *split_checkbutton;
+
+ /* File Saving */
+ GtkWidget *backup_copy_checkbutton;
+ GtkWidget *auto_save_checkbutton;
+ GtkWidget *auto_save_spinbutton;
+
+ GtkWidget *display_line_numbers_checkbutton;
+ GtkWidget *display_statusbar_checkbutton;
+ GtkWidget *display_grid_checkbutton;
+
+ /* Right margin */
+ GtkWidget *right_margin_checkbutton;
+ GtkWidget *right_margin_position_grid;
+ GtkWidget *right_margin_position_spinbutton;
+
+ /* Highlighting */
+ GtkWidget *highlight_current_line_checkbutton;
+ GtkWidget *bracket_matching_checkbutton;
+
+ /* Plugin manager */
+ GtkWidget *plugin_manager;
+
+ /* Placeholders */
+ GtkGrid *font_component_placeholder;
+};
+
+G_DEFINE_TYPE (GeditPreferencesDialog, gedit_preferences_dialog, GTK_TYPE_WINDOW)
+
+static void
+gedit_preferences_dialog_dispose (GObject *object)
+{
+ GeditPreferencesDialog *dlg = GEDIT_PREFERENCES_DIALOG (object);
+
+ g_clear_object (&dlg->editor);
+ g_clear_object (&dlg->uisettings);
+
+ G_OBJECT_CLASS (gedit_preferences_dialog_parent_class)->dispose (object);
+}
+
+static void
+gedit_preferences_dialog_close (GeditPreferencesDialog *dialog)
+{
+ gtk_window_close (GTK_WINDOW (dialog));
+}
+
+static void
+gedit_preferences_dialog_class_init (GeditPreferencesDialogClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+ GtkBindingSet *binding_set;
+
+ /* Otherwise libpeas-gtk might not be linked */
+ g_type_ensure (PEAS_GTK_TYPE_PLUGIN_MANAGER);
+
+ object_class->dispose = gedit_preferences_dialog_dispose;
+
+ signals[CLOSE] =
+ g_signal_new_class_handler ("close",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+ G_CALLBACK (gedit_preferences_dialog_close),
+ NULL, NULL, NULL,
+ G_TYPE_NONE,
+ 0);
+
+ binding_set = gtk_binding_set_by_class (klass);
+ gtk_binding_entry_add_signal (binding_set, GDK_KEY_Escape, 0, "close", 0);
+
+ /* Bind class to template */
+ gtk_widget_class_set_template_from_resource (widget_class,
+ "/org/gnome/gedit/ui/gedit-preferences-dialog.ui");
+ gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, notebook);
+ gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, display_line_numbers_checkbutton);
+ gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, display_statusbar_checkbutton);
+ gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, display_grid_checkbutton);
+ gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, right_margin_checkbutton);
+ gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, right_margin_position_grid);
+ gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, right_margin_position_spinbutton);
+ gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, highlight_current_line_checkbutton);
+ gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, bracket_matching_checkbutton);
+ gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, wrap_text_checkbutton);
+ gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, split_checkbutton);
+ gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, tabs_width_spinbutton);
+ gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, insert_spaces_checkbutton);
+ gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, auto_indent_checkbutton);
+ gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, backup_copy_checkbutton);
+ gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, auto_save_checkbutton);
+ gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, auto_save_spinbutton);
+ gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, schemes_list);
+ gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, install_scheme_button);
+ gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, uninstall_scheme_button);
+ gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, schemes_toolbar);
+ gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, plugin_manager);
+ gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, font_component_placeholder);
+}
+
+static void
+setup_editor_page (GeditPreferencesDialog *dlg)
+{
+ gedit_debug (DEBUG_PREFS);
+
+ /* Connect signal */
+ g_settings_bind (dlg->editor,
+ GEDIT_SETTINGS_TABS_SIZE,
+ dlg->tabs_width_spinbutton,
+ "value",
+ G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
+ g_settings_bind (dlg->editor,
+ GEDIT_SETTINGS_INSERT_SPACES,
+ dlg->insert_spaces_checkbutton,
+ "active",
+ G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
+ g_settings_bind (dlg->editor,
+ GEDIT_SETTINGS_AUTO_INDENT,
+ dlg->auto_indent_checkbutton,
+ "active",
+ G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
+ g_settings_bind (dlg->editor,
+ GEDIT_SETTINGS_CREATE_BACKUP_COPY,
+ dlg->backup_copy_checkbutton,
+ "active",
+ G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
+ g_settings_bind (dlg->editor,
+ GEDIT_SETTINGS_BRACKET_MATCHING,
+ dlg->bracket_matching_checkbutton,
+ "active",
+ G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
+ g_settings_bind (dlg->editor,
+ GEDIT_SETTINGS_AUTO_SAVE_INTERVAL,
+ dlg->auto_save_spinbutton,
+ "value",
+ G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
+ g_settings_bind (dlg->editor,
+ GEDIT_SETTINGS_AUTO_SAVE,
+ dlg->auto_save_spinbutton,
+ "sensitive",
+ G_SETTINGS_BIND_GET);
+ g_settings_bind (dlg->editor,
+ GEDIT_SETTINGS_AUTO_SAVE,
+ dlg->auto_save_checkbutton,
+ "active",
+ G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
+}
+
+static void
+wrap_mode_checkbutton_toggled (GtkToggleButton *button,
+ GeditPreferencesDialog *dlg)
+{
+ GtkWrapMode mode;
+
+ if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dlg->wrap_text_checkbutton)))
+ {
+ mode = GTK_WRAP_NONE;
+
+ gtk_widget_set_sensitive (dlg->split_checkbutton,
+ FALSE);
+ gtk_toggle_button_set_inconsistent (
+ GTK_TOGGLE_BUTTON (dlg->split_checkbutton), TRUE);
+ }
+ else
+ {
+ gtk_widget_set_sensitive (dlg->split_checkbutton,
+ TRUE);
+
+ gtk_toggle_button_set_inconsistent (
+ GTK_TOGGLE_BUTTON (dlg->split_checkbutton), FALSE);
+
+
+ if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dlg->split_checkbutton)))
+ {
+ g_settings_set_enum (dlg->editor,
+ GEDIT_SETTINGS_WRAP_LAST_SPLIT_MODE,
+ GTK_WRAP_WORD);
+
+ mode = GTK_WRAP_WORD;
+ }
+ else
+ {
+ g_settings_set_enum (dlg->editor,
+ GEDIT_SETTINGS_WRAP_LAST_SPLIT_MODE,
+ GTK_WRAP_CHAR);
+
+ mode = GTK_WRAP_CHAR;
+ }
+ }
+
+ g_settings_set_enum (dlg->editor,
+ GEDIT_SETTINGS_WRAP_MODE,
+ mode);
+}
+
+static void
+grid_checkbutton_toggled (GtkToggleButton *button,
+ GeditPreferencesDialog *dlg)
+{
+ GtkSourceBackgroundPatternType background_type;
+
+ background_type = gtk_toggle_button_get_active (button) ?
+ GTK_SOURCE_BACKGROUND_PATTERN_TYPE_GRID :
+ GTK_SOURCE_BACKGROUND_PATTERN_TYPE_NONE;
+ g_settings_set_enum (dlg->editor,
+ GEDIT_SETTINGS_BACKGROUND_PATTERN,
+ background_type);
+}
+
+static void
+setup_view_page (GeditPreferencesDialog *dlg)
+{
+ GtkWrapMode wrap_mode;
+ GtkWrapMode last_split_mode;
+ GtkSourceBackgroundPatternType background_pattern;
+ gboolean display_right_margin;
+ guint right_margin_position;
+
+ gedit_debug (DEBUG_PREFS);
+
+ /* Get values */
+ display_right_margin = g_settings_get_boolean (dlg->editor,
+ GEDIT_SETTINGS_DISPLAY_RIGHT_MARGIN);
+ g_settings_get (dlg->editor, GEDIT_SETTINGS_RIGHT_MARGIN_POSITION,
+ "u", &right_margin_position);
+ background_pattern = g_settings_get_enum (dlg->editor,
+ GEDIT_SETTINGS_BACKGROUND_PATTERN);
+
+ wrap_mode = g_settings_get_enum (dlg->editor,
+ GEDIT_SETTINGS_WRAP_MODE);
+
+ /* Set initial state */
+ switch (wrap_mode)
+ {
+ case GTK_WRAP_WORD:
+ gtk_toggle_button_set_active (
+ GTK_TOGGLE_BUTTON (dlg->wrap_text_checkbutton), TRUE);
+ gtk_toggle_button_set_active (
+ GTK_TOGGLE_BUTTON (dlg->split_checkbutton), TRUE);
+
+ g_settings_set_enum (dlg->editor,
+ GEDIT_SETTINGS_WRAP_LAST_SPLIT_MODE,
+ GTK_WRAP_WORD);
+ break;
+ case GTK_WRAP_CHAR:
+ gtk_toggle_button_set_active (
+ GTK_TOGGLE_BUTTON (dlg->wrap_text_checkbutton), TRUE);
+ gtk_toggle_button_set_active (
+ GTK_TOGGLE_BUTTON (dlg->split_checkbutton), FALSE);
+
+ g_settings_set_enum (dlg->editor,
+ GEDIT_SETTINGS_WRAP_LAST_SPLIT_MODE,
+ GTK_WRAP_CHAR);
+ break;
+ default:
+ gtk_toggle_button_set_active (
+ GTK_TOGGLE_BUTTON (dlg->wrap_text_checkbutton), FALSE);
+
+ last_split_mode = g_settings_get_enum (dlg->editor,
+ GEDIT_SETTINGS_WRAP_LAST_SPLIT_MODE);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dlg->split_checkbutton),
+ last_split_mode == GTK_WRAP_WORD);
+
+ gtk_toggle_button_set_inconsistent (
+ GTK_TOGGLE_BUTTON (dlg->split_checkbutton), TRUE);
+ }
+
+ gtk_toggle_button_set_active (
+ GTK_TOGGLE_BUTTON (dlg->right_margin_checkbutton),
+ display_right_margin);
+ gtk_toggle_button_set_active (
+ GTK_TOGGLE_BUTTON (dlg->display_grid_checkbutton),
+ background_pattern == GTK_SOURCE_BACKGROUND_PATTERN_TYPE_GRID);
+
+ /* Set widgets sensitivity */
+ gtk_widget_set_sensitive (dlg->split_checkbutton,
+ (wrap_mode != GTK_WRAP_NONE));
+
+ g_settings_bind (dlg->editor,
+ GEDIT_SETTINGS_DISPLAY_LINE_NUMBERS,
+ dlg->display_line_numbers_checkbutton,
+ "active",
+ G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
+ g_settings_bind (dlg->editor,
+ GEDIT_SETTINGS_HIGHLIGHT_CURRENT_LINE,
+ dlg->highlight_current_line_checkbutton,
+ "active",
+ G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
+ g_settings_bind (dlg->uisettings,
+ GEDIT_SETTINGS_STATUSBAR_VISIBLE,
+ dlg->display_statusbar_checkbutton,
+ "active",
+ G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
+ g_settings_bind (dlg->editor,
+ GEDIT_SETTINGS_DISPLAY_RIGHT_MARGIN,
+ dlg->right_margin_checkbutton,
+ "active",
+ G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
+ g_settings_bind (dlg->editor,
+ GEDIT_SETTINGS_DISPLAY_RIGHT_MARGIN,
+ dlg->right_margin_position_grid,
+ "sensitive",
+ G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
+ g_settings_bind (dlg->editor,
+ GEDIT_SETTINGS_RIGHT_MARGIN_POSITION,
+ dlg->right_margin_position_spinbutton,
+ "value",
+ G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
+ g_settings_bind (dlg->editor,
+ GEDIT_SETTINGS_AUTO_SAVE_INTERVAL,
+ dlg->auto_save_spinbutton,
+ "value",
+ G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
+ g_signal_connect (dlg->wrap_text_checkbutton,
+ "toggled",
+ G_CALLBACK (wrap_mode_checkbutton_toggled),
+ dlg);
+ g_signal_connect (dlg->split_checkbutton,
+ "toggled",
+ G_CALLBACK (wrap_mode_checkbutton_toggled),
+ dlg);
+ g_signal_connect (dlg->display_grid_checkbutton,
+ "toggled",
+ G_CALLBACK (grid_checkbutton_toggled),
+ dlg);
+}
+
+static void
+setup_font_colors_page_font_section (GeditPreferencesDialog *dlg)
+{
+ GtkWidget *font_component;
+
+ font_component = tepl_prefs_create_font_component (dlg->editor,
+ GEDIT_SETTINGS_USE_DEFAULT_FONT,
+ GEDIT_SETTINGS_EDITOR_FONT);
+
+ gtk_container_add (GTK_CONTAINER (dlg->font_component_placeholder),
+ font_component);
+}
+
+static void
+update_style_scheme_buttons_sensisitivity (GeditPreferencesDialog *dlg)
+{
+ GtkSourceStyleScheme *selected_style_scheme;
+ gboolean editable = FALSE;
+
+ selected_style_scheme = gtk_source_style_scheme_chooser_get_style_scheme (GTK_SOURCE_STYLE_SCHEME_CHOOSER (dlg->schemes_list));
+
+ if (selected_style_scheme != NULL)
+ {
+ const gchar *filename;
+
+ filename = gtk_source_style_scheme_get_filename (selected_style_scheme);
+ if (filename != NULL)
+ {
+ editable = g_str_has_prefix (filename, gedit_dirs_get_user_styles_dir ());
+ }
+ }
+
+ gtk_widget_set_sensitive (dlg->uninstall_scheme_button, editable);
+}
+
+static void
+style_scheme_notify_cb (GtkSourceStyleSchemeChooser *chooser,
+ GParamSpec *pspec,
+ GeditPreferencesDialog *dlg)
+{
+ update_style_scheme_buttons_sensisitivity (dlg);
+}
+
+static GFile *
+get_user_style_scheme_destination_file (GFile *src_file)
+{
+ gchar *basename;
+ const gchar *styles_dir;
+ GFile *dest_file;
+
+ basename = g_file_get_basename (src_file);
+ g_return_val_if_fail (basename != NULL, NULL);
+
+ styles_dir = gedit_dirs_get_user_styles_dir ();
+ dest_file = g_file_new_build_filename (styles_dir, basename, NULL);
+
+ g_free (basename);
+ return dest_file;
+}
+
+/* Returns: whether @src_file has been correctly copied to @dest_file. */
+static gboolean
+copy_file (GFile *src_file,
+ GFile *dest_file,
+ GError **error)
+{
+ if (g_file_equal (src_file, dest_file))
+ {
+ return FALSE;
+ }
+
+ if (!tepl_utils_create_parent_directories (dest_file, NULL, error))
+ {
+ return FALSE;
+ }
+
+ return g_file_copy (src_file,
+ dest_file,
+ G_FILE_COPY_OVERWRITE | G_FILE_COPY_TARGET_DEFAULT_PERMS,
+ NULL, /* cancellable */
+ NULL, NULL, /* progress callback */
+ error);
+}
+
+/* Get the style scheme ID of @user_style_scheme_file if it has been correctly
+ * installed and @user_style_scheme_file is a valid style scheme file.
+ */
+static const gchar *
+get_style_scheme_id_after_installing_user_style_scheme (GFile *user_style_scheme_file)
+{
+ GtkSourceStyleSchemeManager *manager;
+ const gchar * const *scheme_ids;
+ gint i;
+
+ manager = gtk_source_style_scheme_manager_get_default ();
+ gtk_source_style_scheme_manager_force_rescan (manager);
+
+ scheme_ids = gtk_source_style_scheme_manager_get_scheme_ids (manager);
+
+ for (i = 0; scheme_ids != NULL && scheme_ids[i] != NULL; i++)
+ {
+ const gchar *cur_scheme_id = scheme_ids[i];
+ GtkSourceStyleScheme *scheme;
+ const gchar *filename;
+ GFile *scheme_file;
+
+ scheme = gtk_source_style_scheme_manager_get_scheme (manager, cur_scheme_id);
+ filename = gtk_source_style_scheme_get_filename (scheme);
+ if (filename == NULL)
+ {
+ continue;
+ }
+
+ scheme_file = g_file_new_for_path (filename);
+ if (g_file_equal (scheme_file, user_style_scheme_file))
+ {
+ g_object_unref (scheme_file);
+ return cur_scheme_id;
+ }
+
+ g_object_unref (scheme_file);
+ }
+
+ return NULL;
+}
+
+/* Returns: (nullable): the installed style scheme ID, or %NULL on failure. */
+static const gchar *
+install_style_scheme (GFile *src_file,
+ GError **error)
+{
+ GFile *dest_file;
+ gboolean copied;
+ const gchar *installed_style_scheme_id = NULL;
+ GError *my_error = NULL;
+
+ g_return_val_if_fail (G_IS_FILE (src_file), NULL);
+ g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+ dest_file = get_user_style_scheme_destination_file (src_file);
+ g_return_val_if_fail (dest_file != NULL, NULL);
+
+ copied = copy_file (src_file, dest_file, &my_error);
+ if (my_error != NULL)
+ {
+ g_propagate_error (error, my_error);
+ g_object_unref (dest_file);
+ return NULL;
+ }
+
+ installed_style_scheme_id = get_style_scheme_id_after_installing_user_style_scheme (dest_file);
+
+ if (installed_style_scheme_id == NULL && copied)
+ {
+ /* The style scheme has not been correctly installed. */
+ g_file_delete (dest_file, NULL, &my_error);
+ if (my_error != NULL)
+ {
+ gchar *dest_file_parse_name = g_file_get_parse_name (dest_file);
+
+ g_warning ("Failed to delete the file ā€œ%sā€: %s",
+ dest_file_parse_name,
+ my_error->message);
+
+ g_free (dest_file_parse_name);
+ g_clear_error (&my_error);
+ }
+ }
+
+ g_object_unref (dest_file);
+ return installed_style_scheme_id;
+}
+
+/*
+ * uninstall_style_scheme:
+ * @scheme: a #GtkSourceStyleScheme
+ *
+ * Uninstall a user scheme.
+ *
+ * Returns: %TRUE on success, %FALSE otherwise.
+ */
+static gboolean
+uninstall_style_scheme (GtkSourceStyleScheme *scheme)
+{
+ GtkSourceStyleSchemeManager *manager;
+ const gchar *filename;
+
+ g_return_val_if_fail (GTK_SOURCE_IS_STYLE_SCHEME (scheme), FALSE);
+
+ manager = gtk_source_style_scheme_manager_get_default ();
+
+ filename = gtk_source_style_scheme_get_filename (scheme);
+ if (filename == NULL)
+ return FALSE;
+
+ if (g_unlink (filename) == -1)
+ return FALSE;
+
+ /* Reload the available style schemes */
+ gtk_source_style_scheme_manager_force_rescan (manager);
+
+ return TRUE;
+}
+
+static void
+add_scheme_chooser_response_cb (GtkFileChooserNative *chooser,
+ gint response_id,
+ GeditPreferencesDialog *dialog)
+{
+ GFile *file;
+ const gchar *scheme_id;
+ GeditSettings *settings;
+ GSettings *editor_settings;
+ GError *error = NULL;
+
+ if (response_id != GTK_RESPONSE_ACCEPT)
+ {
+ return;
+ }
+
+ file = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (chooser));
+ if (file == NULL)
+ {
+ return;
+ }
+
+ scheme_id = install_style_scheme (file, &error);
+ g_object_unref (file);
+
+ if (scheme_id == NULL)
+ {
+ if (error != NULL)
+ {
+ tepl_utils_show_warning_dialog (GTK_WINDOW (dialog),
+ _("The selected color scheme cannot be installed: %s"),
+ error->message);
+ }
+ else
+ {
+ tepl_utils_show_warning_dialog (GTK_WINDOW (dialog),
+ _("The selected color scheme cannot be installed."));
+ }
+
+ g_clear_error (&error);
+ return;
+ }
+
+ settings = _gedit_settings_get_singleton ();
+ editor_settings = _gedit_settings_peek_editor_settings (settings);
+ g_settings_set_string (editor_settings, GEDIT_SETTINGS_SCHEME, scheme_id);
+}
+
+static void
+install_scheme_clicked (GtkButton *button,
+ GeditPreferencesDialog *dialog)
+{
+ GtkFileChooserNative *chooser;
+ GtkFileFilter *scheme_filter;
+ GtkFileFilter *all_filter;
+
+ if (dialog->install_scheme_file_chooser != NULL)
+ {
+ gtk_native_dialog_show (GTK_NATIVE_DIALOG (dialog->install_scheme_file_chooser));
+ return;
+ }
+
+ chooser = gtk_file_chooser_native_new (_("Add Color Scheme"),
+ GTK_WINDOW (dialog),
+ GTK_FILE_CHOOSER_ACTION_OPEN,
+ _("_Add Scheme"),
+ _("_Cancel"));
+
+ /* Filters */
+ scheme_filter = gtk_file_filter_new ();
+ gtk_file_filter_set_name (scheme_filter, _("Color Scheme Files"));
+ gtk_file_filter_add_pattern (scheme_filter, "*.xml");
+ gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), scheme_filter);
+
+ all_filter = gtk_file_filter_new ();
+ gtk_file_filter_set_name (all_filter, _("All Files"));
+ gtk_file_filter_add_pattern (all_filter, "*");
+ gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), all_filter);
+
+ gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (chooser), scheme_filter);
+
+ g_signal_connect (chooser,
+ "response",
+ G_CALLBACK (add_scheme_chooser_response_cb),
+ dialog);
+
+ g_set_weak_pointer (&dialog->install_scheme_file_chooser, chooser);
+
+ gtk_native_dialog_show (GTK_NATIVE_DIALOG (chooser));
+}
+
+static void
+uninstall_scheme_clicked (GtkButton *button,
+ GeditPreferencesDialog *dlg)
+{
+ GtkSourceStyleScheme *scheme;
+ GtkSourceStyleScheme *new_selected_scheme;
+
+ scheme = gtk_source_style_scheme_chooser_get_style_scheme (GTK_SOURCE_STYLE_SCHEME_CHOOSER (dlg->schemes_list));
+
+ if (scheme == NULL)
+ {
+ return;
+ }
+
+ if (!uninstall_style_scheme (scheme))
+ {
+ tepl_utils_show_warning_dialog (GTK_WINDOW (dlg),
+ _("Could not remove color scheme ā€œ%sā€."),
+ gtk_source_style_scheme_get_name (scheme));
+ return;
+ }
+
+ new_selected_scheme = gtk_source_style_scheme_chooser_get_style_scheme (GTK_SOURCE_STYLE_SCHEME_CHOOSER (dlg->schemes_list));
+ if (new_selected_scheme == NULL)
+ {
+ GeditSettings *settings;
+ GSettings *editor_settings;
+
+ settings = _gedit_settings_get_singleton ();
+ editor_settings = _gedit_settings_peek_editor_settings (settings);
+
+ g_settings_reset (editor_settings, GEDIT_SETTINGS_SCHEME);
+ }
+}
+
+static void
+setup_font_colors_page_style_scheme_section (GeditPreferencesDialog *dlg)
+{
+ GtkStyleContext *context;
+ GeditSettings *settings;
+ GSettings *editor_settings;
+
+ gedit_debug (DEBUG_PREFS);
+
+ /* junction between the schemes list and the toolbar */
+ context = gtk_widget_get_style_context (dlg->schemes_list);
+ gtk_style_context_set_junction_sides (context, GTK_JUNCTION_BOTTOM);
+ context = gtk_widget_get_style_context (dlg->schemes_toolbar);
+ gtk_style_context_set_junction_sides (context, GTK_JUNCTION_TOP);
+
+ /* Connect signals */
+ g_signal_connect (dlg->schemes_list,
+ "notify::style-scheme",
+ G_CALLBACK (style_scheme_notify_cb),
+ dlg);
+ g_signal_connect (dlg->install_scheme_button,
+ "clicked",
+ G_CALLBACK (install_scheme_clicked),
+ dlg);
+ g_signal_connect (dlg->uninstall_scheme_button,
+ "clicked",
+ G_CALLBACK (uninstall_scheme_clicked),
+ dlg);
+
+ settings = _gedit_settings_get_singleton ();
+ editor_settings = _gedit_settings_peek_editor_settings (settings);
+ g_settings_bind (editor_settings, GEDIT_SETTINGS_SCHEME,
+ dlg->schemes_list, "tepl-style-scheme-id",
+ G_SETTINGS_BIND_DEFAULT);
+
+ update_style_scheme_buttons_sensisitivity (dlg);
+}
+
+static void
+setup_font_colors_page (GeditPreferencesDialog *dlg)
+{
+ setup_font_colors_page_font_section (dlg);
+ setup_font_colors_page_style_scheme_section (dlg);
+}
+
+static void
+setup_plugins_page (GeditPreferencesDialog *dlg)
+{
+ gtk_widget_show_all (dlg->plugin_manager);
+}
+
+static void
+gedit_preferences_dialog_init (GeditPreferencesDialog *dlg)
+{
+ gedit_debug (DEBUG_PREFS);
+
+ dlg->editor = g_settings_new ("org.gnome.gedit.preferences.editor");
+ dlg->uisettings = g_settings_new ("org.gnome.gedit.preferences.ui");
+
+ gtk_widget_init_template (GTK_WIDGET (dlg));
+
+ setup_editor_page (dlg);
+ setup_view_page (dlg);
+ setup_font_colors_page (dlg);
+ setup_plugins_page (dlg);
+}
+
+void
+gedit_show_preferences_dialog (GeditWindow *parent)
+{
+ gedit_debug (DEBUG_PREFS);
+
+ if (preferences_dialog == NULL)
+ {
+ preferences_dialog = GTK_WIDGET (g_object_new (GEDIT_TYPE_PREFERENCES_DIALOG,
+ "application", g_application_get_default (),
+ NULL));
+ g_signal_connect (preferences_dialog,
+ "destroy",
+ G_CALLBACK (gtk_widget_destroyed),
+ &preferences_dialog);
+ }
+
+ if (GTK_WINDOW (parent) != gtk_window_get_transient_for (GTK_WINDOW (preferences_dialog)))
+ {
+ gtk_window_set_transient_for (GTK_WINDOW (preferences_dialog),
+ GTK_WINDOW (parent));
+ }
+
+ gtk_window_present (GTK_WINDOW (preferences_dialog));
+}
+
+/* ex:set ts=8 noet: */