-/* GtkFolder methods */
-static void
-gtk_folder_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- GtkFolderPrivate *priv;
-
- priv = GTK_FOLDER_GET_PRIVATE (object);
-
- switch (prop_id)
- {
- case PROP_FILE:
- priv->folder_file = g_value_dup_object (value);
- break;
- case PROP_ENUMERATOR:
- priv->enumerator = g_value_dup_object (value);
- break;
- case PROP_ATTRIBUTES:
- priv->attributes = g_value_dup_string (value);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-gtk_folder_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- GtkFolderPrivate *priv;
-
- priv = GTK_FOLDER_GET_PRIVATE (object);
-
- switch (prop_id)
- {
- case PROP_FILE:
- g_value_set_object (value, priv->folder_file);
- break;
- case PROP_ENUMERATOR:
- g_value_set_object (value, priv->enumerator);
- break;
- case PROP_ATTRIBUTES:
- g_value_set_string (value, priv->attributes);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-query_created_file_info_callback (GObject *source_object,
- GAsyncResult *result,
- gpointer user_data)
-{
- GFile *file = G_FILE (source_object);
- GError *error = NULL;
- GFileInfo *info;
- GtkFolder *folder;
- GSList *files;
-
- info = g_file_query_info_finish (file, result, &error);
-
- if (error)
- {
- g_error_free (error);
- return;
- }
-
- folder = GTK_FOLDER (user_data);
- gtk_folder_add_file (folder, file, info);
-
- files = g_slist_prepend (NULL, file);
- g_signal_emit (folder, folder_signals[FILES_ADDED], 0, files);
- g_slist_free (files);
-
- g_object_unref (info);
-}
-
-static void
-directory_monitor_changed (GFileMonitor *monitor,
- GFile *file,
- GFile *other_file,
- GFileMonitorEvent event,
- gpointer data)
-{
- GtkFolderPrivate *priv;
- GtkFolder *folder;
- GSList *files;
-
- folder = GTK_FOLDER (data);
- priv = GTK_FOLDER_GET_PRIVATE (folder);
- files = g_slist_prepend (NULL, file);
-
- gdk_threads_enter ();
-
- switch (event)
- {
- case G_FILE_MONITOR_EVENT_CREATED:
- g_file_query_info_async (file,
- priv->attributes,
- G_FILE_QUERY_INFO_NONE,
- G_PRIORITY_DEFAULT,
- priv->cancellable,
- query_created_file_info_callback,
- folder);
- break;
- case G_FILE_MONITOR_EVENT_DELETED:
- if (g_file_equal (file, priv->folder_file))
- g_signal_emit (folder, folder_signals[DELETED], 0);
- else
- g_signal_emit (folder, folder_signals[FILES_REMOVED], 0, files);
- break;
- default:
- break;
- }
-
- gdk_threads_leave ();
-
- g_slist_free (files);
-}
-
-static void
-enumerator_files_callback (GObject *source_object,
- GAsyncResult *result,
- gpointer user_data)
-{
- GFileEnumerator *enumerator;
- GtkFolderPrivate *priv;
- GtkFolder *folder;
- GError *error = NULL;
- GSList *files = NULL;
- GList *file_infos, *f;
-
- enumerator = G_FILE_ENUMERATOR (source_object);
- file_infos = g_file_enumerator_next_files_finish (enumerator, result, &error);
-
- if (error)
- {
- g_warning (error->message);
- g_error_free (error);
- return;
- }
-
- folder = GTK_FOLDER (user_data);
- priv = GTK_FOLDER_GET_PRIVATE (folder);
-
- if (!file_infos)
- {
- g_file_enumerator_close_async (enumerator,
- G_PRIORITY_DEFAULT,
- NULL, NULL, NULL);
-
- gtk_folder_set_finished_loading (folder, TRUE);
- return;
- }
-
- g_file_enumerator_next_files_async (enumerator, FILES_PER_QUERY,
- G_PRIORITY_DEFAULT,
- priv->cancellable,
- enumerator_files_callback,
- folder);
-
- for (f = file_infos; f; f = f->next)
- {
- GFileInfo *info;
- GFile *child_file;
-
- info = f->data;
- child_file = g_file_get_child (priv->folder_file, g_file_info_get_name (info));
- gtk_folder_add_file (folder, child_file, info);
- files = g_slist_prepend (files, child_file);
- }
-
- gdk_threads_enter ();
- g_signal_emit (folder, folder_signals[FILES_ADDED], 0, files);
- gdk_threads_leave ();
-
- g_list_foreach (file_infos, (GFunc) g_object_unref, NULL);
- g_list_free (file_infos);
-
- g_slist_foreach (files, (GFunc) g_object_unref, NULL);
- g_slist_free (files);
-}
-
-static void
-gtk_folder_constructed (GObject *object)
-{
- GtkFolderPrivate *priv;
- GError *error = NULL;
-
- priv = GTK_FOLDER_GET_PRIVATE (object);
- priv->directory_monitor = g_file_monitor_directory (priv->folder_file, G_FILE_MONITOR_NONE, NULL, &error);
-
- if (error)
- g_warning (error->message);
- else
- g_signal_connect (priv->directory_monitor, "changed",
- G_CALLBACK (directory_monitor_changed), object);
-
- g_file_enumerator_next_files_async (priv->enumerator,
- FILES_PER_QUERY,
- G_PRIORITY_DEFAULT,
- priv->cancellable,
- enumerator_files_callback,
- object);
- /* This isn't needed anymore */
- g_object_unref (priv->enumerator);
- priv->enumerator = NULL;
-}
-
-static void
-gtk_folder_finalize (GObject *object)
-{
- GtkFolderPrivate *priv;
-
- priv = GTK_FOLDER_GET_PRIVATE (object);
-
- g_hash_table_unref (priv->children);
-
- if (priv->folder_file)
- g_object_unref (priv->folder_file);
-
- if (priv->directory_monitor)
- g_object_unref (priv->directory_monitor);
-
- g_cancellable_cancel (priv->cancellable);
- g_object_unref (priv->cancellable);
- g_free (priv->attributes);
-
- G_OBJECT_CLASS (_gtk_folder_parent_class)->finalize (object);
-}
-
-static void
-_gtk_folder_class_init (GtkFolderClass *class)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (class);
-
- object_class->set_property = gtk_folder_set_property;
- object_class->get_property = gtk_folder_get_property;
- object_class->constructed = gtk_folder_constructed;
- object_class->finalize = gtk_folder_finalize;
-
- g_object_class_install_property (object_class,
- PROP_FILE,
- g_param_spec_object ("file",
- "File",
- "GFile for the folder",
- G_TYPE_FILE,
- GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
- g_object_class_install_property (object_class,
- PROP_ENUMERATOR,
- g_param_spec_object ("enumerator",
- "Enumerator",
- "GFileEnumerator to list files",
- G_TYPE_FILE_ENUMERATOR,
- GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
- g_object_class_install_property (object_class,
- PROP_ATTRIBUTES,
- g_param_spec_string ("attributes",
- "Attributes",
- "Attributes to query for",
- NULL,
- GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
- folder_signals[FILES_ADDED] =
- g_signal_new ("files-added",
- G_TYPE_FROM_CLASS (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (GtkFolderClass, files_added),
- NULL, NULL,
- g_cclosure_marshal_VOID__POINTER,
- G_TYPE_NONE, 1, G_TYPE_POINTER);
- folder_signals[FILES_REMOVED] =
- g_signal_new ("files-removed",
- G_TYPE_FROM_CLASS (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (GtkFolderClass, files_removed),
- NULL, NULL,
- g_cclosure_marshal_VOID__POINTER,
- G_TYPE_NONE, 1, G_TYPE_POINTER);
- folder_signals[FILES_CHANGED] =
- g_signal_new ("files-changed",
- G_TYPE_FROM_CLASS (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (GtkFolderClass, files_changed),
- NULL, NULL,
- g_cclosure_marshal_VOID__POINTER,
- G_TYPE_NONE, 1, G_TYPE_POINTER);
- folder_signals[FINISHED_LOADING] =
- g_signal_new ("finished-loading",
- G_TYPE_FROM_CLASS (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (GtkFolderClass, finished_loading),
- NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
- folder_signals[DELETED] =
- g_signal_new ("deleted",
- G_TYPE_FROM_CLASS (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (GtkFolderClass, deleted),
- NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
-
- g_type_class_add_private (object_class, sizeof (GtkFolderPrivate));
-}
-
-static void
-_gtk_folder_init (GtkFolder *folder)
-{
- GtkFolderPrivate *priv;
-
- priv = GTK_FOLDER_GET_PRIVATE (folder);
-
- priv->children = g_hash_table_new_full (g_file_hash,
- (GEqualFunc) g_file_equal,
- (GDestroyNotify) g_object_unref,
- (GDestroyNotify) g_object_unref);
- priv->cancellable = g_cancellable_new ();
-}
-
-static void
-gtk_folder_set_finished_loading (GtkFolder *folder,
- gboolean finished_loading)
-{
- GtkFolderPrivate *priv;
-
- priv = GTK_FOLDER_GET_PRIVATE (folder);
- priv->finished_loading = (finished_loading == TRUE);
-
- gdk_threads_enter ();
- g_signal_emit (folder, folder_signals[FINISHED_LOADING], 0);
- gdk_threads_leave ();
-}
-
-static void
-gtk_folder_add_file (GtkFolder *folder,
- GFile *file,
- GFileInfo *info)
-{
- GtkFolderPrivate *priv;
-
- priv = GTK_FOLDER_GET_PRIVATE (folder);
-
- g_hash_table_insert (priv->children,
- g_object_ref (file),
- g_object_ref (info));
-}
-
-GSList *
-_gtk_folder_list_children (GtkFolder *folder)
-{
- GtkFolderPrivate *priv;
- GList *files, *elem;
- GSList *children = NULL;
-
- priv = GTK_FOLDER_GET_PRIVATE (folder);
- files = g_hash_table_get_keys (priv->children);
- children = NULL;
-
- for (elem = files; elem; elem = elem->next)
- children = g_slist_prepend (children, g_object_ref (elem->data));
-
- g_list_free (files);
-
- return children;
-}
-
-GFileInfo *
-_gtk_folder_get_info (GtkFolder *folder,
- GFile *file)
-{
- GtkFolderPrivate *priv;
- GFileInfo *info;
-
- priv = GTK_FOLDER_GET_PRIVATE (folder);
- info = g_hash_table_lookup (priv->children, file);
-
- if (!info)
- return NULL;
-
- return g_object_ref (info);
-}
-
-gboolean
-_gtk_folder_is_finished_loading (GtkFolder *folder)
-{
- GtkFolderPrivate *priv;
-
- priv = GTK_FOLDER_GET_PRIVATE (folder);
-
- return priv->finished_loading;
-}
-