[gedit/zbrown/deteplification-src: 47/633] FileChooserDialogGtk: revert to previous implementation




commit eebf6c8cdc5c8ef64885af420db6bbf88b229021
Author: Sébastien Wilmet <swilmet gnome org>
Date:   Tue Nov 26 06:01:38 2019 +0100

    FileChooserDialogGtk: revert to previous implementation
    
    Revert "file chooser: use g_object_unref to free a native dialog"
    This reverts commit 967b27be72d6ede8db272f885b91124bd6d45194.
    
    Revert "gedit: convert "All Text Files" filter to use a fixed set of mime types"
    This reverts commit 7c5c36efc7943d3df51a904cf11fcb02ab03e751.
    
    Revert "gedit: don't assume file chooser is a GtkWindow"
    This reverts commit 9ce64b92ffd7c3c5d1a858c0eef20ab3203b97f5.
    
    Revert "gedit: port GeditFileChooserDialogGtk to GtkFileChooserNative"
    This reverts commit 34419a44bc9f7186278e540d335b7d1b17f54dae.
    
    GeditFileChooserDialogGtk was ported to GtkFileChooserNative in the hope
    that gedit could be more sandboxed with Flatpak and Snap. But access to
    the host file system is still needed for the integrated file browser in
    the side panel.
    
    Also, more importantly, when GeditFileChooserDialogGtk was ported to
    GtkFileChooserNative, an essential feature was removed: the ability to
    choose any character encoding. In the combobox to choose the character
    encoding when opening a file, there is now again the "Add or Remove..."
    to configure the list.
    
    There are plans in Tepl to avoid the need to have a combobox in the open
    file chooser dialog, and provide the choice for the character encoding
    elsewhere in the application. But this requires more work.

 gedit/gedit-commands-file.c           |   2 +-
 gedit/gedit-file-chooser-dialog-gtk.c | 471 ++++++++++++++++++++--------------
 gedit/gedit-file-chooser-dialog-gtk.h |   2 +-
 3 files changed, 285 insertions(+), 190 deletions(-)
---
diff --git a/gedit/gedit-commands-file.c b/gedit/gedit-commands-file.c
index 4961d5a16..baad476d6 100644
--- a/gedit/gedit-commands-file.c
+++ b/gedit/gedit-commands-file.c
@@ -440,7 +440,7 @@ _gedit_cmd_file_open (GSimpleAction *action,
                {
                        g_return_if_fail (GEDIT_IS_FILE_CHOOSER_DIALOG (data));
 
-                       gedit_file_chooser_dialog_show (GEDIT_FILE_CHOOSER_DIALOG (data));
+                       gtk_window_present (GTK_WINDOW (data));
 
                        return;
                }
diff --git a/gedit/gedit-file-chooser-dialog-gtk.c b/gedit/gedit-file-chooser-dialog-gtk.c
index 530ee692e..a8439a306 100644
--- a/gedit/gedit-file-chooser-dialog-gtk.c
+++ b/gedit/gedit-file-chooser-dialog-gtk.c
@@ -30,35 +30,34 @@
 
 #include <glib/gi18n.h>
 
-#include "gedit-encoding-items.h"
+#include "gedit-encodings-combo-box.h"
 #include "gedit-debug.h"
 #include "gedit-enum-types.h"
 #include "gedit-settings.h"
 #include "gedit-utils.h"
 
-/* Choice IDs */
-#define ENCODING_CHOICE "encoding"
-#define NEWLINE_CHOICE  "newline"
-
 #define ALL_FILES              _("All Files")
 #define ALL_TEXT_FILES         _("All Text Files")
 
 struct _GeditFileChooserDialogGtk
 {
-       GObject parent_instance;
+       GtkFileChooserDialog parent_instance;
 
        GSettings *filter_settings;
 
-       GtkFileChooserNative *dialog;
-       GtkResponseType accept_response;
-       GtkResponseType cancel_response;
+       GtkWidget *option_menu;
+       GtkWidget *extra_widget;
+
+       GtkWidget *newline_label;
+       GtkWidget *newline_combo;
+       GtkListStore *newline_store;
 };
 
 static void gedit_file_chooser_dialog_gtk_chooser_init (gpointer g_iface, gpointer iface_data);
 
 G_DEFINE_TYPE_EXTENDED (GeditFileChooserDialogGtk,
                         gedit_file_chooser_dialog_gtk,
-                        G_TYPE_OBJECT,
+                        GTK_TYPE_FILE_CHOOSER_DIALOG,
                         0,
                         G_IMPLEMENT_INTERFACE (GEDIT_TYPE_FILE_CHOOSER_DIALOG,
                                                gedit_file_chooser_dialog_gtk_chooser_init))
@@ -70,9 +69,10 @@ chooser_set_encoding (GeditFileChooserDialog  *dialog,
 {
        GeditFileChooserDialogGtk *dialog_gtk = GEDIT_FILE_CHOOSER_DIALOG_GTK (dialog);
 
-       gtk_file_chooser_set_choice (GTK_FILE_CHOOSER (dialog_gtk->dialog),
-                                    ENCODING_CHOICE,
-                                    gtk_source_encoding_get_charset (encoding));
+       g_return_if_fail (GEDIT_IS_ENCODINGS_COMBO_BOX (dialog_gtk->option_menu));
+
+       gedit_encodings_combo_box_set_selected_encoding (GEDIT_ENCODINGS_COMBO_BOX (dialog_gtk->option_menu),
+                                                        encoding);
 }
 
 static const GtkSourceEncoding *
@@ -80,10 +80,40 @@ chooser_get_encoding (GeditFileChooserDialog *dialog)
 {
        GeditFileChooserDialogGtk *dialog_gtk = GEDIT_FILE_CHOOSER_DIALOG_GTK (dialog);
 
-       const char *charset = gtk_file_chooser_get_choice (GTK_FILE_CHOOSER (dialog_gtk->dialog), 
ENCODING_CHOICE);
+       g_return_val_if_fail (GEDIT_IS_ENCODINGS_COMBO_BOX (dialog_gtk->option_menu), NULL);
+       g_return_val_if_fail ((gtk_file_chooser_get_action (GTK_FILE_CHOOSER (dialog)) == 
GTK_FILE_CHOOSER_ACTION_OPEN ||
+                              gtk_file_chooser_get_action (GTK_FILE_CHOOSER (dialog)) == 
GTK_FILE_CHOOSER_ACTION_SAVE), NULL);
 
-       g_return_val_if_fail (charset != NULL, NULL);
-       return gtk_source_encoding_get_from_charset (charset);
+       return gedit_encodings_combo_box_get_selected_encoding (
+                               GEDIT_ENCODINGS_COMBO_BOX (dialog_gtk->option_menu));
+}
+
+static void
+set_enum_combo (GtkComboBox *combo,
+                gint         value)
+{
+       GtkTreeIter iter;
+       GtkTreeModel *model;
+
+       model = gtk_combo_box_get_model (combo);
+
+       if (!gtk_tree_model_get_iter_first (model, &iter))
+       {
+               return;
+       }
+
+       do
+       {
+               gint nt;
+
+               gtk_tree_model_get (model, &iter, 1, &nt, -1);
+
+               if (value == nt)
+               {
+                       gtk_combo_box_set_active_iter (combo, &iter);
+                       break;
+               }
+       } while (gtk_tree_model_iter_next (model, &iter));
 }
 
 static void
@@ -91,45 +121,31 @@ chooser_set_newline_type (GeditFileChooserDialog *dialog,
                           GtkSourceNewlineType    newline_type)
 {
        GeditFileChooserDialogGtk *dialog_gtk = GEDIT_FILE_CHOOSER_DIALOG_GTK (dialog);
-       GEnumClass *enum_class;
-       GEnumValue *enum_value;
-
-       g_return_if_fail (dialog_gtk->dialog != NULL);
-       g_return_if_fail (gtk_file_chooser_get_action (GTK_FILE_CHOOSER (dialog_gtk->dialog)) == 
GTK_FILE_CHOOSER_ACTION_SAVE);
 
-       enum_class = g_type_class_ref (GTK_SOURCE_TYPE_NEWLINE_TYPE);
-       enum_value = g_enum_get_value (enum_class, newline_type);
-       g_assert (enum_value != NULL);
+       g_return_if_fail (gtk_file_chooser_get_action (GTK_FILE_CHOOSER (dialog)) == 
GTK_FILE_CHOOSER_ACTION_SAVE);
 
-       gtk_file_chooser_set_choice (GTK_FILE_CHOOSER (dialog_gtk->dialog),
-                                    NEWLINE_CHOICE, enum_value->value_nick);
-
-       g_type_class_unref (enum_class);
+       set_enum_combo (GTK_COMBO_BOX (dialog_gtk->newline_combo), newline_type);
 }
 
 static GtkSourceNewlineType
 chooser_get_newline_type (GeditFileChooserDialog *dialog)
 {
        GeditFileChooserDialogGtk *dialog_gtk = GEDIT_FILE_CHOOSER_DIALOG_GTK (dialog);
-       const char *option_id;
-       GEnumClass *enum_class;
-       GEnumValue *enum_value;
+       GtkTreeIter iter;
        GtkSourceNewlineType newline_type;
 
-       g_return_val_if_fail (dialog_gtk->dialog != NULL, GTK_SOURCE_NEWLINE_TYPE_DEFAULT);
-       g_return_val_if_fail (gtk_file_chooser_get_action (GTK_FILE_CHOOSER (dialog_gtk->dialog)) == 
GTK_FILE_CHOOSER_ACTION_SAVE,
+       g_return_val_if_fail (gtk_file_chooser_get_action (GTK_FILE_CHOOSER (dialog)) == 
GTK_FILE_CHOOSER_ACTION_SAVE,
                              GTK_SOURCE_NEWLINE_TYPE_DEFAULT);
 
-       option_id = gtk_file_chooser_get_choice (GTK_FILE_CHOOSER (dialog_gtk->dialog), NEWLINE_CHOICE);
-       g_assert (option_id != NULL);
-
-       enum_class = g_type_class_ref (GTK_SOURCE_TYPE_NEWLINE_TYPE);
-       enum_value = g_enum_get_value_by_nick (enum_class, option_id);
-       g_assert (enum_value != NULL);
+       gtk_combo_box_get_active_iter (GTK_COMBO_BOX (dialog_gtk->newline_combo),
+                                      &iter);
 
-       newline_type = enum_value->value;
+       gtk_tree_model_get (GTK_TREE_MODEL (dialog_gtk->newline_store),
+                           &iter,
+                           1,
+                           &newline_type,
+                           -1);
 
-       g_type_class_unref (enum_class);
        return newline_type;
 }
 
@@ -137,7 +153,6 @@ static void
 chooser_set_current_folder (GeditFileChooserDialog *dialog,
                             GFile                  *folder)
 {
-       GeditFileChooserDialogGtk *dialog_gtk = GEDIT_FILE_CHOOSER_DIALOG_GTK (dialog);
        gchar *uri = NULL;
 
        if (folder != NULL)
@@ -145,7 +160,7 @@ chooser_set_current_folder (GeditFileChooserDialog *dialog,
                uri = g_file_get_uri (folder);
        }
 
-       gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (dialog_gtk->dialog), uri);
+       gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (dialog), uri);
        g_free (uri);
 }
 
@@ -153,75 +168,66 @@ static void
 chooser_set_current_name (GeditFileChooserDialog *dialog,
                           const gchar            *name)
 {
-       GeditFileChooserDialogGtk *dialog_gtk = GEDIT_FILE_CHOOSER_DIALOG_GTK (dialog);
-
-       gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dialog_gtk->dialog), name);
+       gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dialog), name);
 }
 
 static void
 chooser_set_file (GeditFileChooserDialog *dialog,
                   GFile                  *file)
 {
-       GeditFileChooserDialogGtk *dialog_gtk = GEDIT_FILE_CHOOSER_DIALOG_GTK (dialog);
-
-       gtk_file_chooser_set_file (GTK_FILE_CHOOSER (dialog_gtk->dialog), file, NULL);
+       gtk_file_chooser_set_file (GTK_FILE_CHOOSER (dialog), file, NULL);
 }
 
 static GFile *
 chooser_get_file (GeditFileChooserDialog *dialog)
 {
-       GeditFileChooserDialogGtk *dialog_gtk = GEDIT_FILE_CHOOSER_DIALOG_GTK (dialog);
-
-       return gtk_file_chooser_get_file (GTK_FILE_CHOOSER (dialog_gtk->dialog));
+       return gtk_file_chooser_get_file (GTK_FILE_CHOOSER (dialog));
 }
 
 
 static GSList *
 chooser_get_files (GeditFileChooserDialog *dialog)
 {
-       GeditFileChooserDialogGtk *dialog_gtk = GEDIT_FILE_CHOOSER_DIALOG_GTK (dialog);
-
-       return gtk_file_chooser_get_files (GTK_FILE_CHOOSER (dialog_gtk->dialog));
+       return gtk_file_chooser_get_files (GTK_FILE_CHOOSER (dialog));
 }
 
 static void
 chooser_set_do_overwrite_confirmation (GeditFileChooserDialog *dialog,
                                        gboolean                overwrite_confirmation)
 {
-       GeditFileChooserDialogGtk *dialog_gtk = GEDIT_FILE_CHOOSER_DIALOG_GTK (dialog);
-
-       gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (dialog_gtk->dialog), 
overwrite_confirmation);
+       gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (dialog), overwrite_confirmation);
 }
 
 static void
 chooser_show (GeditFileChooserDialog *dialog)
 {
-       GeditFileChooserDialogGtk *dialog_gtk = GEDIT_FILE_CHOOSER_DIALOG_GTK (dialog);
-
-       gtk_native_dialog_show (GTK_NATIVE_DIALOG (dialog_gtk->dialog));
+       gtk_window_present (GTK_WINDOW (dialog));
+       gtk_widget_grab_focus (GTK_WIDGET (dialog));
 }
 
 static void
 chooser_hide (GeditFileChooserDialog *dialog)
 {
-       GeditFileChooserDialogGtk *dialog_gtk = GEDIT_FILE_CHOOSER_DIALOG_GTK (dialog);
-
-       gtk_native_dialog_hide (GTK_NATIVE_DIALOG (dialog_gtk->dialog));
+       gtk_widget_hide (GTK_WIDGET (dialog));
 }
 
 static void
 chooser_destroy (GeditFileChooserDialog *dialog)
 {
-       g_object_unref (dialog);
+       gtk_widget_destroy (GTK_WIDGET (dialog));
 }
 
 static void
 chooser_set_modal (GeditFileChooserDialog *dialog,
                    gboolean is_modal)
 {
-       GeditFileChooserDialogGtk *dialog_gtk = GEDIT_FILE_CHOOSER_DIALOG_GTK (dialog);
+       gtk_window_set_modal (GTK_WINDOW (dialog), is_modal);
+}
 
-       gtk_native_dialog_set_modal (GTK_NATIVE_DIALOG (dialog_gtk->dialog), is_modal);
+static GtkWindow *
+chooser_get_window (GeditFileChooserDialog *dialog)
+{
+       return GTK_WINDOW (dialog);
 }
 
 static void
@@ -229,8 +235,6 @@ chooser_add_pattern_filter (GeditFileChooserDialog *dialog,
                             const gchar            *name,
                             const gchar            *pattern)
 {
-       GeditFileChooserDialogGtk *dialog_gtk = GEDIT_FILE_CHOOSER_DIALOG_GTK (dialog);
-       GtkFileChooser *chooser = GTK_FILE_CHOOSER (dialog_gtk->dialog);
        GtkFileFilter *filter;
 
        filter = gtk_file_filter_new ();
@@ -238,11 +242,11 @@ chooser_add_pattern_filter (GeditFileChooserDialog *dialog,
        gtk_file_filter_set_name (filter, name);
        gtk_file_filter_add_pattern (filter, pattern);
 
-       gtk_file_chooser_add_filter (chooser, filter);
+       gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
 
-       if (gtk_file_chooser_get_filter (chooser) == NULL)
+       if (gtk_file_chooser_get_filter (GTK_FILE_CHOOSER (dialog)) == NULL)
        {
-               gtk_file_chooser_set_filter (chooser, filter);
+               gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (dialog), filter);
        }
 }
 
@@ -268,6 +272,7 @@ gedit_file_chooser_dialog_gtk_chooser_init (gpointer g_iface,
        iface->hide = chooser_hide;
        iface->destroy = chooser_destroy;
        iface->set_modal = chooser_set_modal;
+       iface->get_window = chooser_get_window;
        iface->add_pattern_filter = chooser_add_pattern_filter;
 }
 
@@ -276,7 +281,6 @@ gedit_file_chooser_dialog_gtk_dispose (GObject *object)
 {
        GeditFileChooserDialogGtk *dialog_gtk = GEDIT_FILE_CHOOSER_DIALOG_GTK (object);
 
-       g_clear_object (&dialog_gtk->dialog);
        g_clear_object (&dialog_gtk->filter_settings);
 
        G_OBJECT_CLASS (gedit_file_chooser_dialog_gtk_parent_class)->dispose (object);
@@ -291,74 +295,130 @@ gedit_file_chooser_dialog_gtk_class_init (GeditFileChooserDialogGtkClass *klass)
 }
 
 static void
-create_encoding_choice (GeditFileChooserDialogGtk *dialog)
+create_option_menu (GeditFileChooserDialogGtk *dialog,
+                    GeditFileChooserFlags      flags)
 {
-       GPtrArray *options, *option_labels;
-       GSList *encodings;
-       const GSList *l;
+       GtkWidget *label;
+       GtkWidget *menu;
+       gboolean save_mode;
 
-       options = g_ptr_array_new ();
-       option_labels = g_ptr_array_new ();
+       label = gtk_label_new_with_mnemonic (_("C_haracter Encoding:"));
+       gtk_widget_set_halign (label, GTK_ALIGN_START);
 
-       encodings = gedit_encoding_items_get ();
-       for (l = encodings; l != NULL; l = l->next)
-       {
-               GeditEncodingItem *item = l->data;
+       save_mode = (flags & GEDIT_FILE_CHOOSER_SAVE) != 0;
+       menu = gedit_encodings_combo_box_new (save_mode);
 
-               g_ptr_array_add (options, (gpointer)gtk_source_encoding_get_charset 
(gedit_encoding_item_get_encoding (item)));
-               g_ptr_array_add (option_labels, (gpointer)gedit_encoding_item_get_name (item));
-       }
-       g_ptr_array_add (options, NULL);
-       g_ptr_array_add (option_labels, NULL);
-
-       gtk_file_chooser_add_choice (GTK_FILE_CHOOSER (dialog->dialog),
-                                    ENCODING_CHOICE, _("Character Encoding:"),
-                                    (const char **)options->pdata,
-                                    (const char **)option_labels->pdata);
-       gtk_file_chooser_set_choice (GTK_FILE_CHOOSER (dialog->dialog),
-                                    ENCODING_CHOICE, g_ptr_array_index(options, 0));
-
-       g_ptr_array_free (options, TRUE);
-       g_ptr_array_free (option_labels, TRUE);
-       g_slist_free_full (encodings, (GDestroyNotify)gedit_encoding_item_free);
+       gtk_label_set_mnemonic_widget (GTK_LABEL (label), menu);
+
+       gtk_box_pack_start (GTK_BOX (dialog->extra_widget),
+                           label,
+                           FALSE,
+                           TRUE,
+                           0);
+
+       gtk_box_pack_start (GTK_BOX (dialog->extra_widget),
+                           menu,
+                           TRUE,
+                           TRUE,
+                           0);
+
+       gtk_widget_show (label);
+       gtk_widget_show (menu);
+
+       dialog->option_menu = menu;
 }
 
 static void
-create_newline_choice (GeditFileChooserDialogGtk *dialog)
+update_newline_visibility (GeditFileChooserDialogGtk *dialog)
 {
-       GEnumClass *enum_class;
-       GPtrArray *options, *option_labels;
-       int i;
+       gboolean visible = gtk_file_chooser_get_action (GTK_FILE_CHOOSER (dialog)) == 
GTK_FILE_CHOOSER_ACTION_SAVE;
 
-       enum_class = g_type_class_ref (GTK_SOURCE_TYPE_NEWLINE_TYPE);
+       gtk_widget_set_visible (dialog->newline_label, visible);
+       gtk_widget_set_visible (dialog->newline_combo, visible);
+}
 
-       options = g_ptr_array_new ();
-       option_labels = g_ptr_array_new ();
+static void
+newline_combo_append (GtkComboBox          *combo,
+                     GtkListStore         *store,
+                     GtkTreeIter          *iter,
+                     const gchar          *label,
+                     GtkSourceNewlineType  newline_type)
+{
+       gtk_list_store_append (store, iter);
+       gtk_list_store_set (store, iter, 0, label, 1, newline_type, -1);
 
-       for (i = 0; i < enum_class->n_values; i++)
+       if (newline_type == GTK_SOURCE_NEWLINE_TYPE_DEFAULT)
        {
-               const GEnumValue *v = &enum_class->values[i];
-               g_ptr_array_add (options, (gpointer)v->value_nick);
-               g_ptr_array_add (option_labels, (gpointer)gedit_utils_newline_type_to_string(v->value));
+               gtk_combo_box_set_active_iter (combo, iter);
        }
-       g_ptr_array_add (options, NULL);
-       g_ptr_array_add (option_labels, NULL);
-
-       gtk_file_chooser_add_choice (GTK_FILE_CHOOSER (dialog->dialog),
-                                    NEWLINE_CHOICE, _("Line Ending:"),
-                                    (const char **)options->pdata,
-                                    (const char **)option_labels->pdata);
-
-       g_ptr_array_free (options, TRUE);
-       g_ptr_array_free (option_labels, TRUE);
-       g_type_class_unref (enum_class);
+}
 
-       chooser_set_newline_type (GEDIT_FILE_CHOOSER_DIALOG (dialog), GTK_SOURCE_NEWLINE_TYPE_DEFAULT);
+static void
+create_newline_combo (GeditFileChooserDialogGtk *dialog)
+{
+       GtkWidget *label, *combo;
+       GtkListStore *store;
+       GtkCellRenderer *renderer;
+       GtkTreeIter iter;
+
+       label = gtk_label_new_with_mnemonic (_("L_ine Ending:"));
+       gtk_widget_set_halign (label, GTK_ALIGN_START);
+
+       store = gtk_list_store_new (2, G_TYPE_STRING, GTK_SOURCE_TYPE_NEWLINE_TYPE);
+       combo = gtk_combo_box_new_with_model (GTK_TREE_MODEL (store));
+       renderer = gtk_cell_renderer_text_new ();
+
+       gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo),
+                                   renderer,
+                                   TRUE);
+
+       gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (combo),
+                                      renderer,
+                                      "text",
+                                      0);
+
+       newline_combo_append (GTK_COMBO_BOX (combo),
+                             store,
+                             &iter,
+                             gedit_utils_newline_type_to_string (GTK_SOURCE_NEWLINE_TYPE_LF),
+                             GTK_SOURCE_NEWLINE_TYPE_LF);
+
+       newline_combo_append (GTK_COMBO_BOX (combo),
+                             store,
+                             &iter,
+                             gedit_utils_newline_type_to_string (GTK_SOURCE_NEWLINE_TYPE_CR),
+                             GTK_SOURCE_NEWLINE_TYPE_CR);
+
+       newline_combo_append (GTK_COMBO_BOX (combo),
+                             store,
+                             &iter,
+                             gedit_utils_newline_type_to_string (GTK_SOURCE_NEWLINE_TYPE_CR_LF),
+                             GTK_SOURCE_NEWLINE_TYPE_CR_LF);
+
+       gtk_label_set_mnemonic_widget (GTK_LABEL (label), combo);
+
+       gtk_box_pack_start (GTK_BOX (dialog->extra_widget),
+                           label,
+                           FALSE,
+                           TRUE,
+                           0);
+
+       gtk_box_pack_start (GTK_BOX (dialog->extra_widget),
+                           combo,
+                           TRUE,
+                           TRUE,
+                           0);
+
+       dialog->newline_combo = combo;
+       dialog->newline_label = label;
+       dialog->newline_store = store;
+
+       update_newline_visibility (dialog);
 }
 
 static void
-create_choices (GeditFileChooserDialogGtk *dialog,
-               GeditFileChooserFlags      flags)
+create_extra_widget (GeditFileChooserDialogGtk *dialog,
+                     GeditFileChooserFlags      flags)
 {
        gboolean needs_encoding;
        gboolean needs_line_ending;
@@ -366,15 +426,56 @@ create_choices (GeditFileChooserDialogGtk *dialog,
        needs_encoding = (flags & GEDIT_FILE_CHOOSER_ENABLE_ENCODING) != 0;
        needs_line_ending = (flags & GEDIT_FILE_CHOOSER_ENABLE_LINE_ENDING) != 0;
 
+       if (!needs_encoding && !needs_line_ending)
+       {
+               return;
+       }
+
+       dialog->extra_widget = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
+
+       gtk_widget_show (dialog->extra_widget);
+
        if (needs_encoding)
        {
-               create_encoding_choice (dialog);
+               create_option_menu (dialog, flags);
        }
 
        if (needs_line_ending)
        {
-               create_newline_choice (dialog);
+               create_newline_combo (dialog);
        }
+
+       gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER (dialog), dialog->extra_widget);
+}
+
+static void
+action_changed (GeditFileChooserDialogGtk *dialog,
+               GParamSpec                *pspec,
+               gpointer                   data)
+{
+       GtkFileChooserAction action;
+
+       action = gtk_file_chooser_get_action (GTK_FILE_CHOOSER (dialog));
+
+       switch (action)
+       {
+               case GTK_FILE_CHOOSER_ACTION_OPEN:
+                       g_object_set (dialog->option_menu,
+                                     "save_mode", FALSE,
+                                     NULL);
+                       gtk_widget_show (dialog->option_menu);
+                       break;
+               case GTK_FILE_CHOOSER_ACTION_SAVE:
+                       g_object_set (dialog->option_menu,
+                                     "save_mode", TRUE,
+                                     NULL);
+                       gtk_widget_show (dialog->option_menu);
+                       break;
+               default:
+                       gtk_widget_hide (dialog->option_menu);
+       }
+
+       update_newline_visibility (dialog);
 }
 
 static void
@@ -403,35 +504,18 @@ filter_changed (GeditFileChooserDialogGtk *dialog,
        }
 }
 
-static void
-dialog_response_cb (GtkNativeDialog           *dialog,
-                   gint                       response_id,
-                   GeditFileChooserDialogGtk *dialog_gtk)
-{
-       switch (response_id) {
-       case GTK_RESPONSE_ACCEPT:
-               response_id = dialog_gtk->accept_response;
-               break;
-       case GTK_RESPONSE_CANCEL:
-               response_id = dialog_gtk->cancel_response;
-               break;
-       }
-       g_signal_emit_by_name (dialog_gtk, "response", response_id);
-}
-
 /* FIXME: use globs too - Paolo (Aug. 27, 2007) */
-static void
-add_all_text_files (GtkFileFilter *filter)
+static gboolean
+all_text_files_filter (const GtkFileFilterInfo *filter_info,
+                      gpointer                 data)
 {
        static GSList *known_mime_types = NULL;
-       const GSList *mime_types;
+       GSList *mime_types;
 
        if (known_mime_types == NULL)
        {
                GtkSourceLanguageManager *lm;
                const gchar * const *languages;
-               GList *content_types;
-               const GList *l;
 
                lm = gtk_source_language_manager_get_default ();
                languages = gtk_source_language_manager_get_language_ids (lm);
@@ -443,7 +527,7 @@ add_all_text_files (GtkFileFilter *filter)
                        GtkSourceLanguage *lang;
 
                        lang = gtk_source_language_manager_get_language (lm, *languages);
-                       g_return_if_fail (GTK_SOURCE_IS_LANGUAGE (lang));
+                       g_return_val_if_fail (GTK_SOURCE_IS_LANGUAGE (lang), FALSE);
                        ++languages;
 
                        mime_types = gtk_source_language_get_mime_types (lang);
@@ -466,40 +550,36 @@ add_all_text_files (GtkFileFilter *filter)
                        g_strfreev (mime_types);
                }
 
-               // Add "text/*" mime types that don't subclass "text/plain"
-               content_types = g_content_types_get_registered ();
-               for (l = content_types; l != NULL; l = l->next)
-               {
-                       const char *mime_type = l->data;
-                       if (strncmp (mime_type, "text/", 5) != 0)
-                               continue;
-                       if (!g_content_type_is_a (mime_type, "text/plain"))
-                       {
-                               gedit_debug_message (DEBUG_COMMANDS,
-                                                    "Mime-type %s is not related to text/plain",
-                                                    mime_type);
-
-                               known_mime_types = g_slist_prepend (known_mime_types,
-                                                                   g_strdup (mime_type));
-                       }
-               }
-               g_list_free_full (content_types, g_free);
-
                /* known_mime_types always has "text/plain" as first item" */
                known_mime_types = g_slist_prepend (known_mime_types, g_strdup ("text/plain"));
        }
 
+       /* known mime_types contains "text/plain" and then the list of mime-types unrelated to "text/plain"
+        * that gedit recognizes */
+
+       if (filter_info->mime_type == NULL)
+               return FALSE;
+
        /*
         * The filter is matching:
         * - the mime-types beginning with "text/"
         * - the mime-types inheriting from a known mime-type (note the text/plain is
         *   the first known mime-type)
         */
-       for (mime_types = known_mime_types; mime_types != NULL; mime_types = mime_types->next)
+
+       if (strncmp (filter_info->mime_type, "text/", 5) == 0)
+               return TRUE;
+
+       mime_types = known_mime_types;
+       while (mime_types != NULL)
        {
-               const char *mime_type = mime_types->data;
-               gtk_file_filter_add_mime_type (filter, mime_type);
+               if (g_content_type_is_a (filter_info->mime_type, (const gchar*)mime_types->data))
+                       return TRUE;
+
+               mime_types = g_slist_next (mime_types);
        }
+
+       return FALSE;
 }
 
 static void
@@ -535,21 +615,24 @@ gedit_file_chooser_dialog_gtk_create (const gchar             *title,
                select_multiple = TRUE;
        }
 
-       result = g_object_new (GEDIT_TYPE_FILE_CHOOSER_DIALOG_GTK, NULL);
-       result->cancel_response = cancel_response;
-       result->accept_response = accept_response;
-       result->dialog = gtk_file_chooser_native_new (
-               title, parent, action, accept_label, cancel_label);
-       g_object_set (result->dialog,
-                     "local-only", FALSE,
-                     "select-multiple", select_multiple,
-                     NULL);
+       result = g_object_new (GEDIT_TYPE_FILE_CHOOSER_DIALOG_GTK,
+                              "title", title,
+                              "local-only", FALSE,
+                              "action", action,
+                              "select-multiple", select_multiple,
+                              NULL);
+
+       create_extra_widget (result, flags);
 
-       create_choices (result, flags);
+       g_signal_connect (result,
+                         "notify::action",
+                         G_CALLBACK (action_changed),
+                         NULL);
 
        if (encoding != NULL)
        {
-               chooser_set_encoding (GEDIT_FILE_CHOOSER_DIALOG (result), encoding);
+               gedit_encodings_combo_box_set_selected_encoding (GEDIT_ENCODINGS_COMBO_BOX 
(result->option_menu),
+                                                                encoding);
        }
 
        active_filter = g_settings_get_int (result->filter_settings, GEDIT_SETTINGS_ACTIVE_FILE_FILTER);
@@ -562,32 +645,44 @@ gedit_file_chooser_dialog_gtk_create (const gchar             *title,
 
                gtk_file_filter_set_name (filter, ALL_FILES);
                gtk_file_filter_add_pattern (filter, "*");
-               gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (result->dialog), filter);
+               gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (result), filter);
 
                if (active_filter != 1)
                {
                        /* Make this filter the default */
-                       gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (result->dialog), filter);
+                       gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (result), filter);
                }
 
                filter = gtk_file_filter_new ();
                gtk_file_filter_set_name (filter, ALL_TEXT_FILES);
-               add_all_text_files (filter);
-               gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (result->dialog), filter);
+               gtk_file_filter_add_custom (filter,
+                                           GTK_FILE_FILTER_MIME_TYPE,
+                                           all_text_files_filter,
+                                           NULL,
+                                           NULL);
+               gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (result), filter);
 
                if (active_filter == 1)
                {
                        /* Make this filter the default */
-                       gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (result->dialog), filter);
+                       gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (result), filter);
                }
 
-               g_signal_connect (result->dialog,
+               g_signal_connect (result,
                                  "notify::filter",
                                  G_CALLBACK (filter_changed),
                                  NULL);
        }
 
-       g_signal_connect (result->dialog, "response", G_CALLBACK (dialog_response_cb), result);
+       if (parent != NULL)
+       {
+               gtk_window_set_transient_for (GTK_WINDOW (result), parent);
+               gtk_window_set_destroy_with_parent (GTK_WINDOW (result), TRUE);
+       }
+
+       gtk_dialog_add_button (GTK_DIALOG (result), cancel_label, cancel_response);
+       gtk_dialog_add_button (GTK_DIALOG (result), accept_label, accept_response);
+       gtk_dialog_set_default_response (GTK_DIALOG (result), accept_response);
 
        return GEDIT_FILE_CHOOSER_DIALOG (result);
 }
diff --git a/gedit/gedit-file-chooser-dialog-gtk.h b/gedit/gedit-file-chooser-dialog-gtk.h
index daa97c1a2..39dfca982 100644
--- a/gedit/gedit-file-chooser-dialog-gtk.h
+++ b/gedit/gedit-file-chooser-dialog-gtk.h
@@ -29,7 +29,7 @@ G_BEGIN_DECLS
 
 #define GEDIT_TYPE_FILE_CHOOSER_DIALOG_GTK (gedit_file_chooser_dialog_gtk_get_type ())
 
-G_DECLARE_FINAL_TYPE (GeditFileChooserDialogGtk, gedit_file_chooser_dialog_gtk, GEDIT, 
FILE_CHOOSER_DIALOG_GTK, GObject)
+G_DECLARE_FINAL_TYPE (GeditFileChooserDialogGtk, gedit_file_chooser_dialog_gtk, GEDIT, 
FILE_CHOOSER_DIALOG_GTK, GtkFileChooserDialog)
 
 GeditFileChooserDialog *gedit_file_chooser_dialog_gtk_create           (const gchar             *title,
                                                                         GtkWindow               *parent,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]