]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkfilechooserutils.c
Fixes #426246.
[~andy/gtk] / gtk / gtkfilechooserutils.c
index 9c0e51ced04ba7b6cb91de698ba6b00393ac41f0..a7220c19672f71f26c91d2d777c39ad6c794b5af 100644 (file)
  * Boston, MA 02111-1307, USA.
  */
 
+#include <config.h>
 #include "gtkfilechooserutils.h"
 #include "gtkfilechooser.h"
-#include "gtkfilechooserenums.h"
 #include "gtkfilesystem.h"
+#include "gtktypebuiltins.h"
+#include "gtkintl.h"
+#include "gtkalias.h"
 
-static void           delegate_set_current_folder     (GtkFileChooser    *chooser,
-                                                      const GtkFilePath *path);
+static gboolean       delegate_set_current_folder     (GtkFileChooser    *chooser,
+                                                      const GtkFilePath *path,
+                                                      GError           **error);
 static GtkFilePath *  delegate_get_current_folder     (GtkFileChooser    *chooser);
 static void           delegate_set_current_name       (GtkFileChooser    *chooser,
                                                       const gchar       *name);
-static void           delegate_select_path            (GtkFileChooser    *chooser,
-                                                      const GtkFilePath *path);
+static gboolean       delegate_select_path            (GtkFileChooser    *chooser,
+                                                      const GtkFilePath *path,
+                                                      GError           **error);
 static void           delegate_unselect_path          (GtkFileChooser    *chooser,
                                                       const GtkFilePath *path);
 static void           delegate_select_all             (GtkFileChooser    *chooser);
 static void           delegate_unselect_all           (GtkFileChooser    *chooser);
 static GSList *       delegate_get_paths              (GtkFileChooser    *chooser);
+static GtkFilePath *  delegate_get_preview_path       (GtkFileChooser    *chooser);
 static GtkFileSystem *delegate_get_file_system        (GtkFileChooser    *chooser);
+static void           delegate_add_filter             (GtkFileChooser    *chooser,
+                                                      GtkFileFilter     *filter);
+static void           delegate_remove_filter          (GtkFileChooser    *chooser,
+                                                      GtkFileFilter     *filter);
+static GSList *       delegate_list_filters           (GtkFileChooser    *chooser);
+static gboolean       delegate_add_shortcut_folder    (GtkFileChooser    *chooser,
+                                                      const GtkFilePath *path,
+                                                      GError           **error);
+static gboolean       delegate_remove_shortcut_folder (GtkFileChooser    *chooser,
+                                                      const GtkFilePath *path,
+                                                      GError           **error);
+static GSList *       delegate_list_shortcut_folders  (GtkFileChooser    *chooser);
+static void           delegate_notify                 (GObject           *object,
+                                                      GParamSpec        *pspec,
+                                                      gpointer           data);
 static void           delegate_current_folder_changed (GtkFileChooser    *chooser,
                                                       gpointer           data);
 static void           delegate_selection_changed      (GtkFileChooser    *chooser,
                                                       gpointer           data);
+static void           delegate_update_preview         (GtkFileChooser    *chooser,
+                                                      gpointer           data);
+static void           delegate_file_activated         (GtkFileChooser    *chooser,
+                                                      gpointer           data);
+
+static GtkFileChooserConfirmation delegate_confirm_overwrite (GtkFileChooser    *chooser,
+                                                             gpointer           data);
 
 /**
  * _gtk_file_chooser_install_properties:
  * @klass: the class structure for a type deriving from #GObject
- * 
+ *
  * Installs the necessary properties for a class implementing
  * #GtkFileChooser. A #GtkParamSpecOverride property is installed
  * for each property, using the values from the #GtkFileChooserProp
@@ -56,52 +84,45 @@ static void           delegate_selection_changed      (GtkFileChooser    *choose
 void
 _gtk_file_chooser_install_properties (GObjectClass *klass)
 {
-  g_object_class_install_property (klass,
-                                  GTK_FILE_CHOOSER_PROP_ACTION,
-                                  g_param_spec_override ("action",
-                                                         GTK_TYPE_FILE_CHOOSER_ACTION,
-                                                         G_PARAM_READWRITE));
-  g_object_class_install_property (klass,
-                                  GTK_FILE_CHOOSER_PROP_FILE_SYSTEM,
-                                  g_param_spec_override ("file-system",
-                                                         GTK_TYPE_FILE_SYSTEM,
-                                                         G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
-  g_object_class_install_property (klass,
-                                  GTK_FILE_CHOOSER_PROP_FOLDER_MODE,
-                                  g_param_spec_override ("folder-mode",
-                                                         G_TYPE_BOOLEAN,
-                                                         G_PARAM_READWRITE));
-  g_object_class_install_property (klass,
-                                  GTK_FILE_CHOOSER_PROP_LOCAL_ONLY,
-                                  g_param_spec_override ("local-only",
-                                                         G_TYPE_BOOLEAN,
-                                                         G_PARAM_READWRITE));
-  g_object_class_install_property (klass,
-                                  GTK_FILE_CHOOSER_PROP_PREVIEW_WIDGET,
-                                  g_param_spec_override ("preview-widget",
-                                                         GTK_TYPE_WIDGET,
-                                                         G_PARAM_READWRITE));
-  g_object_class_install_property (klass,
-                                  GTK_FILE_CHOOSER_PROP_PREVIEW_WIDGET_ACTIVE,
-                                  g_param_spec_override ("preview-widget-active",
-                                                         G_TYPE_BOOLEAN,
-                                                         G_PARAM_READWRITE));
-  g_object_class_install_property (klass,
-                                  GTK_FILE_CHOOSER_PROP_SELECT_MULTIPLE,
-                                  g_param_spec_override ("select-multiple",
-                                                         G_TYPE_BOOLEAN,
-                                                         G_PARAM_READWRITE));
-  g_object_class_install_property (klass,
-                                  GTK_FILE_CHOOSER_PROP_SHOW_HIDDEN,
-                                  g_param_spec_override ("show-hidden",
-                                                         G_TYPE_BOOLEAN,
-                                                         G_PARAM_READWRITE));
+  g_object_class_override_property (klass,
+                                   GTK_FILE_CHOOSER_PROP_ACTION,
+                                   "action");
+  g_object_class_override_property (klass,
+                                   GTK_FILE_CHOOSER_PROP_EXTRA_WIDGET,
+                                   "extra-widget");
+  g_object_class_override_property (klass,
+                                   GTK_FILE_CHOOSER_PROP_FILE_SYSTEM_BACKEND,
+                                   "file-system-backend");
+  g_object_class_override_property (klass,
+                                   GTK_FILE_CHOOSER_PROP_FILTER,
+                                   "filter");
+  g_object_class_override_property (klass,
+                                   GTK_FILE_CHOOSER_PROP_LOCAL_ONLY,
+                                   "local-only");
+  g_object_class_override_property (klass,
+                                   GTK_FILE_CHOOSER_PROP_PREVIEW_WIDGET,
+                                   "preview-widget");
+  g_object_class_override_property (klass,
+                                   GTK_FILE_CHOOSER_PROP_PREVIEW_WIDGET_ACTIVE,
+                                   "preview-widget-active");
+  g_object_class_override_property (klass,
+                                   GTK_FILE_CHOOSER_PROP_USE_PREVIEW_LABEL,
+                                   "use-preview-label");
+  g_object_class_override_property (klass,
+                                   GTK_FILE_CHOOSER_PROP_SELECT_MULTIPLE,
+                                   "select-multiple");
+  g_object_class_override_property (klass,
+                                   GTK_FILE_CHOOSER_PROP_SHOW_HIDDEN,
+                                   "show-hidden");
+  g_object_class_override_property (klass,
+                                   GTK_FILE_CHOOSER_PROP_DO_OVERWRITE_CONFIRMATION,
+                                   "do-overwrite-confirmation");
 }
 
 /**
  * _gtk_file_chooser_delegate_iface_init:
  * @iface: a #GtkFileChoserIface structure
- * 
+ *
  * An interface-initialization function for use in cases where
  * an object is simply delegating the methods, signals of
  * the #GtkFileChooser interface to another object.
@@ -120,18 +141,25 @@ _gtk_file_chooser_delegate_iface_init (GtkFileChooserIface *iface)
   iface->select_all = delegate_select_all;
   iface->unselect_all = delegate_unselect_all;
   iface->get_paths = delegate_get_paths;
+  iface->get_preview_path = delegate_get_preview_path;
   iface->get_file_system = delegate_get_file_system;
+  iface->add_filter = delegate_add_filter;
+  iface->remove_filter = delegate_remove_filter;
+  iface->list_filters = delegate_list_filters;
+  iface->add_shortcut_folder = delegate_add_shortcut_folder;
+  iface->remove_shortcut_folder = delegate_remove_shortcut_folder;
+  iface->list_shortcut_folders = delegate_list_shortcut_folders;
 }
 
 /**
  * _gtk_file_chooser_set_delegate:
- * @receiver: a GOobject implementing #GtkFileChooser
- * @delegate: another GObject implementing #GtkFileChooser
+ * @receiver: a #GObject implementing #GtkFileChooser
+ * @delegate: another #GObject implementing #GtkFileChooser
  *
  * Establishes that calls on @receiver for #GtkFileChooser
  * methods should be delegated to @delegate, and that
  * #GtkFileChooser signals emitted on @delegate should be
- * forwarded to @receiver. Must be used in confunction with
+ * forwarded to @receiver. Must be used in conjunction with
  * _gtk_file_chooser_delegate_iface_init().
  **/
 void
@@ -140,26 +168,46 @@ _gtk_file_chooser_set_delegate (GtkFileChooser *receiver,
 {
   g_return_if_fail (GTK_IS_FILE_CHOOSER (receiver));
   g_return_if_fail (GTK_IS_FILE_CHOOSER (delegate));
-  
-  g_object_set_data (G_OBJECT (receiver), "gtk-file-chooser-delegate", delegate);
 
+  g_object_set_data (G_OBJECT (receiver), I_("gtk-file-chooser-delegate"), delegate);
+  g_signal_connect (delegate, "notify",
+                   G_CALLBACK (delegate_notify), receiver);
   g_signal_connect (delegate, "current-folder-changed",
                    G_CALLBACK (delegate_current_folder_changed), receiver);
   g_signal_connect (delegate, "selection-changed",
                    G_CALLBACK (delegate_selection_changed), receiver);
+  g_signal_connect (delegate, "update-preview",
+                   G_CALLBACK (delegate_update_preview), receiver);
+  g_signal_connect (delegate, "file-activated",
+                   G_CALLBACK (delegate_file_activated), receiver);
+  g_signal_connect (delegate, "confirm-overwrite",
+                   G_CALLBACK (delegate_confirm_overwrite), receiver);
+}
+
+GQuark
+_gtk_file_chooser_delegate_get_quark (void)
+{
+  static GQuark quark = 0;
+
+  if (G_UNLIKELY (quark == 0))
+    quark = g_quark_from_static_string ("gtk-file-chooser-delegate");
+  
+  return quark;
 }
 
 static GtkFileChooser *
 get_delegate (GtkFileChooser *receiver)
 {
-  return g_object_get_data (G_OBJECT (receiver), "gtk-file-chooser-delegate");
+  return g_object_get_qdata (G_OBJECT (receiver),
+                            GTK_FILE_CHOOSER_DELEGATE_QUARK);
 }
 
-static void
+static gboolean
 delegate_select_path (GtkFileChooser    *chooser,
-                     const GtkFilePath *path)
+                     const GtkFilePath *path,
+                     GError           **error)
 {
-  _gtk_file_chooser_select_path (get_delegate (chooser), path);
+  return _gtk_file_chooser_select_path (get_delegate (chooser), path, error);
 }
 
 static void
@@ -187,6 +235,12 @@ delegate_get_paths (GtkFileChooser *chooser)
   return _gtk_file_chooser_get_paths (get_delegate (chooser));
 }
 
+static GtkFilePath *
+delegate_get_preview_path (GtkFileChooser *chooser)
+{
+  return _gtk_file_chooser_get_preview_path (get_delegate (chooser));
+}
+
 static GtkFileSystem *
 delegate_get_file_system (GtkFileChooser *chooser)
 {
@@ -194,10 +248,53 @@ delegate_get_file_system (GtkFileChooser *chooser)
 }
 
 static void
+delegate_add_filter (GtkFileChooser *chooser,
+                    GtkFileFilter  *filter)
+{
+  gtk_file_chooser_add_filter (get_delegate (chooser), filter);
+}
+
+static void
+delegate_remove_filter (GtkFileChooser *chooser,
+                       GtkFileFilter  *filter)
+{
+  gtk_file_chooser_remove_filter (get_delegate (chooser), filter);
+}
+
+static GSList *
+delegate_list_filters (GtkFileChooser *chooser)
+{
+  return gtk_file_chooser_list_filters (get_delegate (chooser));
+}
+
+static gboolean
+delegate_add_shortcut_folder (GtkFileChooser    *chooser,
+                             const GtkFilePath *path,
+                             GError           **error)
+{
+  return _gtk_file_chooser_add_shortcut_folder (get_delegate (chooser), path, error);
+}
+
+static gboolean
+delegate_remove_shortcut_folder (GtkFileChooser    *chooser,
+                                const GtkFilePath *path,
+                                GError           **error)
+{
+  return _gtk_file_chooser_remove_shortcut_folder (get_delegate (chooser), path, error);
+}
+
+static GSList *
+delegate_list_shortcut_folders (GtkFileChooser *chooser)
+{
+  return gtk_file_chooser_list_shortcut_folders (get_delegate (chooser));
+}
+
+static gboolean
 delegate_set_current_folder (GtkFileChooser    *chooser,
-                            const GtkFilePath *path)
+                            const GtkFilePath *path,
+                            GError           **error)
 {
-  _gtk_file_chooser_set_current_folder_path (chooser, path);
+  return _gtk_file_chooser_set_current_folder_path (get_delegate (chooser), path, error);
 }
 
 static GtkFilePath *
@@ -213,16 +310,53 @@ delegate_set_current_name (GtkFileChooser *chooser,
   gtk_file_chooser_set_current_name (get_delegate (chooser), name);
 }
 
+static void
+delegate_notify (GObject    *object,
+                GParamSpec *pspec,
+                gpointer    data)
+{
+  gpointer iface;
+
+  iface = g_type_interface_peek (g_type_class_peek (G_OBJECT_TYPE (object)),
+                                gtk_file_chooser_get_type ());
+  if (g_object_interface_find_property (iface, pspec->name))
+    g_object_notify (data, pspec->name);
+}
+
 static void
 delegate_selection_changed (GtkFileChooser *chooser,
                            gpointer        data)
 {
-  g_signal_emit_by_name (data, "selection-changed", 0);
+  g_signal_emit_by_name (data, "selection-changed");
 }
 
 static void
 delegate_current_folder_changed (GtkFileChooser *chooser,
                                 gpointer        data)
 {
-  g_signal_emit_by_name (data, "current-folder-changed", 0);
+  g_signal_emit_by_name (data, "current-folder-changed");
+}
+
+static void
+delegate_update_preview (GtkFileChooser    *chooser,
+                        gpointer           data)
+{
+  g_signal_emit_by_name (data, "update-preview");
+}
+
+static void
+delegate_file_activated (GtkFileChooser    *chooser,
+                        gpointer           data)
+{
+  g_signal_emit_by_name (data, "file-activated");
+}
+
+static GtkFileChooserConfirmation
+delegate_confirm_overwrite (GtkFileChooser    *chooser,
+                           gpointer           data)
+{
+  GtkFileChooserConfirmation conf;
+
+  g_signal_emit_by_name (data, "confirm-overwrite", &conf);
+  return conf;
 }