Initial revision

This commit is contained in:
Owen Taylor 2003-03-21 20:34:02 +00:00
parent 250fd7cc43
commit e3849905a9
17 changed files with 4344 additions and 0 deletions

419
gtk/gtkfilechooser.c Normal file
View File

@ -0,0 +1,419 @@
/* GTK - The GIMP Toolkit
* gtkfilechooser.c: Abstract interface for file selector GUIs
* Copyright (C) 2003, Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include "gtkfilechooser.h"
#include "gtkfilechooserenums.h"
#define _(str) (str)
static void gtk_file_chooser_base_init (gpointer g_class);
GType
gtk_file_chooser_get_type (void)
{
static GType file_chooser_type = 0;
if (!file_chooser_type)
{
static const GTypeInfo file_chooser_info =
{
sizeof (GtkFileChooserIface), /* class_size */
gtk_file_chooser_base_init, /* base_init */
NULL, /* base_finalize */
};
file_chooser_type = g_type_register_static (G_TYPE_INTERFACE,
"GtkFileChooser",
&file_chooser_info, 0);
}
return file_chooser_type;
}
static void
gtk_file_chooser_base_init (gpointer g_class)
{
static gboolean initialized = FALSE;
if (!initialized)
{
GType iface_type = G_TYPE_FROM_INTERFACE (g_class);
g_signal_new ("current_folder_changed",
iface_type,
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GtkFileChooserIface, current_folder_changed),
NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0);
g_signal_new ("selection_changed",
iface_type,
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GtkFileChooserIface, selection_changed),
NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0);
g_object_interface_install_property (iface_type,
g_param_spec_enum ("action",
_("Action"),
_("The type of action that the file selector is performing"),
GTK_TYPE_FILE_CHOOSER_ACTION,
GTK_FILE_CHOOSER_ACTION_OPEN,
G_PARAM_READWRITE));
g_object_interface_install_property (iface_type,
g_param_spec_boolean ("folder_mode",
_("Folder Mode"),
_("Whether to select folders rather than files"),
FALSE,
G_PARAM_READWRITE));
g_object_interface_install_property (iface_type,
g_param_spec_boolean ("local_only",
_("Local Only"),
_("Whether the selected file(s) should be limited to local file: URLs"),
TRUE,
G_PARAM_READWRITE));
g_object_interface_install_property (iface_type,
g_param_spec_object ("preview_widget",
_("Preview widget"),
_("Application supplied widget for custom previews."),
GTK_TYPE_WIDGET,
G_PARAM_READWRITE));
g_object_interface_install_property (iface_type,
g_param_spec_boolean ("preview_widget_active",
_("Preview Widget Active"),
_("Whther the application supplied widget for custom previews should be shown."),
TRUE,
G_PARAM_READWRITE));
g_object_interface_install_property (iface_type,
g_param_spec_boolean ("select_multiple",
_("Select Multiple"),
_("Whether to allow multiple files to be selected"),
FALSE,
G_PARAM_READWRITE));
g_object_interface_install_property (iface_type,
g_param_spec_boolean ("show_hidden",
_("Show Hidden"),
_("Whether the hidden files and folders should be displayed"),
FALSE,
G_PARAM_READWRITE));
initialized = TRUE;
}
}
void
gtk_file_chooser_set_action (GtkFileChooser *chooser,
GtkFileChooserAction action)
{
g_return_if_fail (GTK_IS_FILE_CHOOSER (chooser));
g_object_set (chooser, "action", action, NULL);
}
GtkFileChooserAction
gtk_file_chooser_get_action (GtkFileChooser *chooser)
{
GtkFileChooserAction action;
g_return_val_if_fail (GTK_IS_FILE_CHOOSER (chooser), FALSE);
g_object_get (chooser, "action", &action, NULL);
return action;
}
void
gtk_file_chooser_set_directory_mode (GtkFileChooser *chooser,
gboolean directory_mode)
{
g_return_if_fail (GTK_IS_FILE_CHOOSER (chooser));
g_object_set (chooser, "directory_mode", directory_mode, NULL);
}
gboolean
gtk_file_chooser_get_directory_mode (GtkFileChooser *chooser)
{
gboolean directory_mode;
g_return_val_if_fail (GTK_IS_FILE_CHOOSER (chooser), FALSE);
g_object_get (chooser, "directory_mode", &directory_mode, NULL);
return directory_mode;
}
void
gtk_file_chooser_set_local_only (GtkFileChooser *chooser,
gboolean local_only)
{
g_return_if_fail (GTK_IS_FILE_CHOOSER (chooser));
g_object_set (chooser, "local_only", local_only, NULL);
}
gboolean
gtk_file_chooser_get_local_only (GtkFileChooser *chooser)
{
gboolean local_only;
g_return_val_if_fail (GTK_IS_FILE_CHOOSER (chooser), FALSE);
g_object_get (chooser, "local_only", &local_only, NULL);
return local_only;
}
void
gtk_file_chooser_set_select_multiple (GtkFileChooser *chooser,
gboolean select_multiple)
{
g_return_if_fail (GTK_IS_FILE_CHOOSER (chooser));
g_object_set (chooser, "select_multiple", select_multiple, NULL);
}
gboolean
gtk_file_chooser_get_select_multiple (GtkFileChooser *chooser)
{
gboolean select_multiple;
g_return_val_if_fail (GTK_IS_FILE_CHOOSER (chooser), FALSE);
g_object_get (chooser, "select_multiple", &select_multiple, NULL);
return select_multiple;
}
char *
gtk_file_chooser_get_filename (GtkFileChooser *chooser)
{
GSList *list;
gchar *result = NULL;
g_return_val_if_fail (GTK_IS_FILE_CHOOSER (chooser), NULL);
list = gtk_file_chooser_get_filenames (chooser);
if (list)
{
result = list->data;
list = g_slist_delete_link (list, list);
g_slist_foreach (list, (GFunc)g_free, NULL);
g_slist_free (list);
}
return result;
}
void
gtk_file_chooser_set_filename (GtkFileChooser *chooser,
const char *filename)
{
g_return_if_fail (GTK_IS_FILE_CHOOSER (chooser));
}
void
gtk_file_chooser_select_filename (GtkFileChooser *chooser,
const char *filename)
{
g_return_if_fail (GTK_IS_FILE_CHOOSER (chooser));
}
void
gtk_file_chooser_unselect_filename (GtkFileChooser *chooser,
const char *filename)
{
g_return_if_fail (GTK_IS_FILE_CHOOSER (chooser));
g_return_if_fail (filename != NULL);
}
GSList *
gtk_file_chooser_get_filenames (GtkFileChooser *chooser)
{
g_return_val_if_fail (GTK_IS_FILE_CHOOSER (chooser), NULL);
return NULL;
}
void
gtk_file_chooser_set_current_folder (GtkFileChooser *chooser,
const gchar *filename)
{
g_return_if_fail (GTK_IS_FILE_CHOOSER (chooser));
g_return_if_fail (filename != NULL);
}
gchar *
gtk_file_chooser_get_current_folder (GtkFileChooser *chooser)
{
g_return_val_if_fail (GTK_IS_FILE_CHOOSER (chooser), NULL);
return NULL;
}
gchar *
gtk_file_chooser_get_uri (GtkFileChooser *chooser)
{
GSList *list;
gchar *result = NULL;
g_return_val_if_fail (GTK_IS_FILE_CHOOSER (chooser), NULL);
list = gtk_file_chooser_get_uris (chooser);
if (list)
{
result = list->data;
list = g_slist_delete_link (list, list);
g_slist_foreach (list, (GFunc)g_free, NULL);
g_slist_free (list);
}
return result;
}
void
gtk_file_chooser_set_uri (GtkFileChooser *chooser,
const char *uri)
{
g_return_if_fail (GTK_IS_FILE_CHOOSER (chooser));
}
void
gtk_file_chooser_select_uri (GtkFileChooser *chooser,
const char *uri)
{
g_return_if_fail (GTK_IS_FILE_CHOOSER (chooser));
GTK_FILE_CHOOSER_GET_IFACE (chooser)->unselect_uri (chooser, uri);
}
void
gtk_file_chooser_unselect_uri (GtkFileChooser *chooser,
const char *uri)
{
g_return_if_fail (GTK_IS_FILE_CHOOSER (chooser));
GTK_FILE_CHOOSER_GET_IFACE (chooser)->unselect_uri (chooser, uri);
}
void
gtk_file_chooser_select_all (GtkFileChooser *chooser)
{
g_return_if_fail (GTK_IS_FILE_CHOOSER (chooser));
GTK_FILE_CHOOSER_GET_IFACE (chooser)->select_all (chooser);
}
void
gtk_file_chooser_unselect_all (GtkFileChooser *chooser)
{
g_return_if_fail (GTK_IS_FILE_CHOOSER (chooser));
GTK_FILE_CHOOSER_GET_IFACE (chooser)->unselect_all (chooser);
}
GSList *
gtk_file_chooser_get_uris (GtkFileChooser *chooser)
{
g_return_val_if_fail (GTK_IS_FILE_CHOOSER (chooser), NULL);
return GTK_FILE_CHOOSER_GET_IFACE (chooser)->get_uris (chooser);
}
void
gtk_file_chooser_set_current_folder_uri (GtkFileChooser *chooser,
const gchar *uri)
{
g_return_if_fail (GTK_IS_FILE_CHOOSER (chooser));
g_return_if_fail (uri != NULL);
return GTK_FILE_CHOOSER_GET_IFACE (chooser)->set_current_folder (chooser, uri);
}
gchar *
gtk_file_chooser_get_current_folder_uri (GtkFileChooser *chooser)
{
g_return_val_if_fail (GTK_IS_FILE_CHOOSER (chooser), NULL);
return GTK_FILE_CHOOSER_GET_IFACE (chooser)->get_current_folder (chooser);
}
/* Preview widget
*/
void
gtk_file_chooser_set_preview_widget (GtkFileChooser *chooser,
GtkWidget *preview_widget)
{
g_return_if_fail (GTK_IS_FILE_CHOOSER (chooser));
g_object_set (chooser, "preview_widget", preview_widget, NULL);
}
GtkWidget *
gtk_file_chooser_get_preview_widget (GtkFileChooser *chooser)
{
GtkWidget *preview_widget;
g_return_val_if_fail (GTK_IS_FILE_CHOOSER (chooser), NULL);
g_object_get (chooser, "preview_widget", &preview_widget, NULL);
return preview_widget;
}
void
gtk_file_chooser_set_preview_widget_active (GtkFileChooser *chooser,
gboolean active)
{
g_return_if_fail (GTK_IS_FILE_CHOOSER (chooser));
g_object_set (chooser, "preview_widget_active", active, NULL);
}
gboolean
gtk_file_chooser_get_preview_widget_active (GtkFileChooser *chooser)
{
gboolean active;
g_return_val_if_fail (GTK_IS_FILE_CHOOSER (chooser), FALSE);
g_object_get (chooser, "preview_widget_active", &active, NULL);
return active;
}
const char *
gtk_file_chooser_get_preview_filename (GtkFileChooser *chooser)
{
g_return_val_if_fail (GTK_IS_FILE_CHOOSER (chooser), NULL);
return NULL;
}
const char *
gtk_file_chooser_get_preview_uri (GtkFileChooser *chooser)
{
g_return_val_if_fail (GTK_IS_FILE_CHOOSER (chooser), NULL);
return NULL;
}

167
gtk/gtkfilechooser.h Normal file
View File

@ -0,0 +1,167 @@
/* GTK - The GIMP Toolkit
* gtkfilechooser.h: Abstract interface for file selector GUIs
* Copyright (C) 2003, Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef __GTK_FILE_CHOOSER_H__
#define __GTK_FILE_CHOOSER_H__
#include <gtk/gtkwidget.h>
G_BEGIN_DECLS
#define GTK_TYPE_FILE_CHOOSER (gtk_file_chooser_get_type ())
#define GTK_FILE_CHOOSER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_FILE_CHOOSER, GtkFileChooser))
#define GTK_IS_FILE_CHOOSER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_FILE_CHOOSER))
#define GTK_FILE_CHOOSER_GET_IFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GTK_TYPE_FILE_CHOOSER, GtkFileChooserIface))
typedef struct _GtkFileChooser GtkFileChooser;
typedef struct _GtkFileChooserIface GtkFileChooserIface;
typedef enum
{
GTK_FILE_CHOOSER_ACTION_OPEN,
GTK_FILE_CHOOSER_ACTION_SAVE
} GtkFileChooserAction;
struct _GtkFileChooserIface
{
GTypeInterface base_iface;
/* GtkFileChooser interface has the following properties:
*
* action: GtkFileChooserAction
* folder_mode: boolean
* select_multiple: boolean
* show_hidden: boolean
* local_only: boolean
*
* preview_widget: GtkWidget
* preview_widget_active: boolean
*/
/* Methods
*/
void (*set_current_folder) (GtkFileChooser *chooser,
const char *uri);
char * (*get_current_folder) (GtkFileChooser *chooser);
void (*select_uri) (GtkFileChooser *chooser,
const char *uri);
void (*unselect_uri) (GtkFileChooser *chooser,
const char *uri);
void (*select_all) (GtkFileChooser *chooser);
void (*unselect_all) (GtkFileChooser *chooser);
GSList *(*get_uris) (GtkFileChooser *chooser);
/* Signals
*/
void (*current_folder_changed) (GtkFileChooser *chooser);
void (*selection_changed) (GtkFileChooser *chooser);
void (*update_preview) (GtkFileChooser *chooser,
const char *uri);
};
GType gtk_file_chooser_get_type (void);
/* Configuration
*/
void gtk_file_chooser_set_action (GtkFileChooser *chooser,
GtkFileChooserAction action);
GtkFileChooserAction gtk_file_chooser_get_action (GtkFileChooser *chooser);
void gtk_file_chooser_set_directory_mode (GtkFileChooser *chooser,
gboolean directory_mode);
gboolean gtk_file_chooser_get_directory_mode (GtkFileChooser *chooser);
void gtk_file_chooser_set_local_only (GtkFileChooser *chooser,
gboolean files_only);
gboolean gtk_file_chooser_get_local_only (GtkFileChooser *chooser);
void gtk_file_chooser_set_select_multiple (GtkFileChooser *chooser,
gboolean select_multiple);
gboolean gtk_file_chooser_get_select_multiple (GtkFileChooser *chooser);
/* Filename manipulation
*/
gchar * gtk_file_chooser_get_filename (GtkFileChooser *chooser);
void gtk_file_chooser_set_filename (GtkFileChooser *chooser,
const char *filename);
void gtk_file_chooser_select_filename (GtkFileChooser *chooser,
const char *filename);
void gtk_file_chooser_unselect_filename (GtkFileChooser *chooser,
const char *filename);
void gtk_file_chooser_select_all (GtkFileChooser *chooser);
void gtk_file_chooser_unselect_all (GtkFileChooser *chooser);
GSList *gtk_file_chooser_get_filenames (GtkFileChooser *chooser);
void gtk_file_chooser_set_current_folder (GtkFileChooser *chooser,
const gchar *filename);
gchar *gtk_file_chooser_get_current_folder (GtkFileChooser *chooser);
/* URI manipulation
*/
gchar * gtk_file_chooser_get_uri (GtkFileChooser *chooser);
void gtk_file_chooser_set_uri (GtkFileChooser *chooser,
const char *uri);
void gtk_file_chooser_select_uri (GtkFileChooser *chooser,
const char *uri);
void gtk_file_chooser_unselect_uri (GtkFileChooser *chooser,
const char *uri);
GSList *gtk_file_chooser_get_uris (GtkFileChooser *chooser);
void gtk_file_chooser_set_current_folder_uri (GtkFileChooser *chooser,
const gchar *uri);
gchar *gtk_file_chooser_get_current_folder_uri (GtkFileChooser *chooser);
/* Preview widget
*/
void gtk_file_chooser_set_preview_widget (GtkFileChooser *chooser,
GtkWidget *preview_widget);
GtkWidget *gtk_file_chooser_get_preview_widget (GtkFileChooser *chooser);
void gtk_file_chooser_set_preview_widget_active (GtkFileChooser *chooser,
gboolean active);
gboolean gtk_file_chooser_get_preview_widget_active (GtkFileChooser *chooser);
const char *gtk_file_chooser_get_preview_filename (GtkFileChooser *file_chooser);
const char *gtk_file_chooser_get_preview_uri (GtkFileChooser *file_chooser);
#if 0
/* Filters
*/
void gtk_file_chooser_add_filter (GtkFileChooser *chooser,
GtkFileFilter *filter);
void gtk_file_chooser_remove_filter (GtkFileChooser *chooser,
GtkFileFilter *filter);
GList *gtk_file_chooser_get_filters (GtkFileChooser *chooser);
/************************************************/
static gboolean (*GtkFileFilterFunc) (const char *uri,
const char *filename,
gpointer data);
GtkFileFilter *gtk_file_filter_new_pattern (const char *pattern);
GtkFileFilter *gtk_file_filter_new_mime_type (const char *mime_type);
GtkFileFilter *gtk_file_filter_new_callback (GtkFileFilterFunction *func,
gpointer data,
GDestroyNotify notify);
#endif
G_END_DECLS
#endif /* __GTK_FILE_CHOOSER_H__ */

561
gtk/gtkfilechooserdefault.c Normal file
View File

@ -0,0 +1,561 @@
/* GTK - The GIMP Toolkit
* gtkfilechooserwidget.c: Embeddable file selector widget
* Copyright (C) 2003, Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include "gtkfilechooserimpldefault.h"
#include "gtkfilechooserenums.h"
#include "gtkfilechooserutils.h"
#include "gtkfilechooser.h"
#include "gtkfilesystemmodel.h"
#include <gtk/gtkcellrenderertext.h>
#include <gtk/gtkhpaned.h>
#include <gtk/gtklabel.h>
#include <gtk/gtkscrolledwindow.h>
#include <gtk/gtktreeview.h>
#include <gtk/gtktreeselection.h>
#include <gtk/gtkvbox.h>
typedef struct _GtkFileChooserImplDefaultClass GtkFileChooserImplDefaultClass;
#define GTK_FILE_CHOOSER_IMPL_DEFAULT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_FILE_CHOOSER_IMPL_DEFAULT, GtkFileChooserImplDefaultClass))
#define GTK_IS_FILE_CHOOSER_IMPL_DEFAULT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_FILE_CHOOSER_IMPL_DEFAULT))
#define GTK_FILE_CHOOSER_IMPL_DEFAULT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_FILE_CHOOSER_IMPL_DEFAULT, GtkFileChooserImplDefaultClass))
struct _GtkFileChooserImplDefaultClass
{
GtkVBoxClass parent_class;
};
struct _GtkFileChooserImplDefault
{
GtkVBox parent_instance;
GtkFileSystem *file_system;
GtkFileSystemModel *tree_model;
GtkFileSystemModel *list_model;
GtkFileChooserAction action;
guint folder_mode : 1;
guint local_only : 1;
guint preview_widget_active : 1;
guint select_multiple : 1;
guint show_hidden : 1;
GtkWidget *tree_scrollwin;
GtkWidget *tree;
GtkWidget *list_scrollwin;
GtkWidget *list;
GtkWidget *preview_widget;
};
static void gtk_file_chooser_impl_default_class_init (GtkFileChooserImplDefaultClass *class);
static void gtk_file_chooser_impl_default_iface_init (GtkFileChooserIface *iface);
static void gtk_file_chooser_impl_default_init (GtkFileChooserImplDefault *impl);
static void gtk_file_chooser_impl_default_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec);
static void gtk_file_chooser_impl_default_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec);
static void gtk_file_chooser_impl_default_set_current_folder (GtkFileChooser *chooser,
const char *uri);
static char * gtk_file_chooser_impl_default_get_current_folder (GtkFileChooser *chooser);
static void gtk_file_chooser_impl_default_select_uri (GtkFileChooser *chooser,
const char *uri);
static void gtk_file_chooser_impl_default_unselect_uri (GtkFileChooser *chooser,
const char *uri);
static void gtk_file_chooser_impl_default_select_all (GtkFileChooser *chooser);
static void gtk_file_chooser_impl_default_unselect_all (GtkFileChooser *chooser);
static GSList *gtk_file_chooser_impl_default_get_uris (GtkFileChooser *chooser);
static void tree_selection_changed (GtkTreeSelection *tree_selection,
GtkFileChooserImplDefault *impl);
static void list_selection_changed (GtkTreeSelection *tree_selection,
GtkFileChooserImplDefault *impl);
GType
_gtk_file_chooser_impl_default_get_type (void)
{
static GType file_chooser_impl_default_type = 0;
if (!file_chooser_impl_default_type)
{
static const GTypeInfo file_chooser_impl_default_info =
{
sizeof (GtkFileChooserImplDefaultClass),
NULL, /* base_init */
NULL, /* base_finalize */
(GClassInitFunc) gtk_file_chooser_impl_default_class_init,
NULL, /* class_finalize */
NULL, /* class_data */
sizeof (GtkFileChooserImplDefault),
0, /* n_preallocs */
(GInstanceInitFunc) gtk_file_chooser_impl_default_init,
};
static const GInterfaceInfo file_chooser_info =
{
(GInterfaceInitFunc) gtk_file_chooser_impl_default_iface_init, /* interface_init */
NULL, /* interface_finalize */
NULL /* interface_data */
};
file_chooser_impl_default_type = g_type_register_static (GTK_TYPE_VBOX, "GtkFileChooserImplDefault",
&file_chooser_impl_default_info, 0);
g_type_add_interface_static (file_chooser_impl_default_type,
GTK_TYPE_FILE_CHOOSER,
&file_chooser_info);
}
return file_chooser_impl_default_type;
}
static void
gtk_file_chooser_impl_default_class_init (GtkFileChooserImplDefaultClass *class)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (class);
gobject_class->set_property = gtk_file_chooser_impl_default_set_property;
gobject_class->get_property = gtk_file_chooser_impl_default_get_property;
_gtk_file_chooser_install_properties (gobject_class);
}
static void
gtk_file_chooser_impl_default_iface_init (GtkFileChooserIface *iface)
{
iface->select_uri = gtk_file_chooser_impl_default_select_uri;
iface->unselect_uri = gtk_file_chooser_impl_default_unselect_uri;
iface->select_all = gtk_file_chooser_impl_default_select_all;
iface->unselect_all = gtk_file_chooser_impl_default_unselect_all;
iface->get_uris = gtk_file_chooser_impl_default_get_uris;
iface->set_current_folder = gtk_file_chooser_impl_default_set_current_folder;
iface->get_current_folder = gtk_file_chooser_impl_default_get_current_folder;
}
static void
gtk_file_chooser_impl_default_init (GtkFileChooserImplDefault *impl)
{
GtkWidget *hpaned;
GtkTreeSelection *selection;
impl->folder_mode = FALSE;
impl->local_only = TRUE;
impl->preview_widget_active = TRUE;
impl->select_multiple = FALSE;
impl->show_hidden = FALSE;
gtk_widget_push_composite_child ();
hpaned = gtk_hpaned_new ();
gtk_box_pack_start (GTK_BOX (impl), hpaned, TRUE, TRUE, 0);
gtk_widget_show (hpaned);
impl->tree_scrollwin = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (impl->tree_scrollwin),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_paned_add1 (GTK_PANED (hpaned), impl->tree_scrollwin);
gtk_widget_show (impl->tree_scrollwin);
impl->tree = gtk_tree_view_new ();
gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (impl->tree), FALSE);
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (impl->tree));
g_signal_connect (selection, "changed",
G_CALLBACK (tree_selection_changed), impl);
gtk_paned_set_position (GTK_PANED (hpaned), 200);
gtk_container_add (GTK_CONTAINER (impl->tree_scrollwin), impl->tree);
gtk_widget_show (impl->tree);
impl->list_scrollwin = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (impl->list_scrollwin),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_paned_add2 (GTK_PANED (hpaned), impl->list_scrollwin);
gtk_widget_show (impl->list_scrollwin);
impl->list = gtk_tree_view_new ();
gtk_container_add (GTK_CONTAINER (impl->list_scrollwin), impl->list);
gtk_widget_show (impl->list);
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (impl->list));
g_signal_connect (selection, "changed",
G_CALLBACK (list_selection_changed), impl);
gtk_widget_pop_composite_child ();
}
static void
set_preview_widget (GtkFileChooserImplDefault *impl,
GtkWidget *preview_widget)
{
if (preview_widget == impl->preview_widget)
return;
if (impl->preview_widget)
{
g_object_unref (impl->preview_widget);
impl->preview_widget = NULL;
}
impl->preview_widget = preview_widget;
if (impl->preview_widget)
{
g_object_ref (impl->preview_widget);
gtk_object_sink (GTK_OBJECT (impl->preview_widget));
}
}
static void
gtk_file_chooser_impl_default_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
GtkFileChooserImplDefault *impl = GTK_FILE_CHOOSER_IMPL_DEFAULT (object);
switch (prop_id)
{
case GTK_FILE_CHOOSER_PROP_ACTION:
impl->action = g_value_get_enum (value);
break;
case GTK_FILE_CHOOSER_PROP_FOLDER_MODE:
{
gboolean folder_mode = g_value_get_boolean (value);
if (folder_mode != impl->folder_mode)
{
impl->folder_mode = folder_mode;
if (impl->folder_mode)
gtk_widget_hide (impl->list_scrollwin);
else
gtk_widget_show (impl->list_scrollwin);
}
}
break;
case GTK_FILE_CHOOSER_PROP_LOCAL_ONLY:
impl->local_only = g_value_get_boolean (value);
break;
case GTK_FILE_CHOOSER_PROP_PREVIEW_WIDGET:
set_preview_widget (impl, g_value_get_object (value));
break;
case GTK_FILE_CHOOSER_PROP_PREVIEW_WIDGET_ACTIVE:
impl->preview_widget_active = g_value_get_boolean (value);
break;
case GTK_FILE_CHOOSER_PROP_SELECT_MULTIPLE:
{
gboolean select_multiple = g_value_get_boolean (value);
if (select_multiple != impl->select_multiple)
{
GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (impl->list));
impl->select_multiple = select_multiple;
gtk_tree_selection_set_mode (selection,
(select_multiple ?
GTK_SELECTION_MULTIPLE : GTK_SELECTION_BROWSE));
}
}
break;
case GTK_FILE_CHOOSER_PROP_SHOW_HIDDEN:
{
gboolean show_hidden = g_value_get_boolean (value);
if (show_hidden != impl->show_hidden)
{
impl->show_hidden = show_hidden;
_gtk_file_system_model_set_show_hidden (impl->tree_model, show_hidden);
_gtk_file_system_model_set_show_hidden (impl->list_model, show_hidden);
}
}
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
gtk_file_chooser_impl_default_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
GtkFileChooserImplDefault *impl = GTK_FILE_CHOOSER_IMPL_DEFAULT (object);
switch (prop_id)
{
case GTK_FILE_CHOOSER_PROP_ACTION:
g_value_set_enum (value, impl->action);
break;
case GTK_FILE_CHOOSER_PROP_FOLDER_MODE:
g_value_set_boolean (value, impl->folder_mode);
break;
case GTK_FILE_CHOOSER_PROP_LOCAL_ONLY:
g_value_set_boolean (value, impl->local_only);
break;
case GTK_FILE_CHOOSER_PROP_PREVIEW_WIDGET:
g_value_set_object (value, impl->preview_widget);
break;
case GTK_FILE_CHOOSER_PROP_PREVIEW_WIDGET_ACTIVE:
g_value_set_boolean (value, impl->preview_widget_active);
break;
case GTK_FILE_CHOOSER_PROP_SELECT_MULTIPLE:
g_value_set_boolean (value, impl->select_multiple);
break;
case GTK_FILE_CHOOSER_PROP_SHOW_HIDDEN:
g_value_set_boolean (value, impl->show_hidden);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
expand_and_select_func (GtkFileSystemModel *model,
GtkTreePath *path,
GtkTreeIter *iter,
gpointer user_data)
{
GtkFileChooserImplDefault *impl = user_data;
GtkTreeView *tree_view;
if (model == impl->tree_model)
tree_view = GTK_TREE_VIEW (impl->tree);
else
tree_view = GTK_TREE_VIEW (impl->list);
gtk_tree_view_expand_to_path (tree_view, path);
gtk_tree_view_expand_row (tree_view, path, FALSE);
gtk_tree_view_set_cursor (tree_view, path, NULL, FALSE);
gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (impl->tree), path, NULL, TRUE, 0.3, 0.0);
}
static void
gtk_file_chooser_impl_default_set_current_folder (GtkFileChooser *chooser,
const char *uri)
{
GtkFileChooserImplDefault *impl = GTK_FILE_CHOOSER_IMPL_DEFAULT (chooser);
_gtk_file_system_model_uri_do (impl->tree_model, uri,
expand_and_select_func, impl);
}
static char *
gtk_file_chooser_impl_default_get_current_folder (GtkFileChooser *chooser)
{
GtkFileChooserImplDefault *impl = GTK_FILE_CHOOSER_IMPL_DEFAULT (chooser);
GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (impl->tree));
GtkTreeIter iter;
if (gtk_tree_selection_get_selected (selection, NULL, &iter))
{
const gchar *uri = _gtk_file_system_model_get_uri (impl->tree_model, &iter);
return g_strdup (uri);
}
else
return NULL;
}
static void
gtk_file_chooser_impl_default_select_uri (GtkFileChooser *chooser,
const char *uri)
{
GtkFileChooserImplDefault *impl = GTK_FILE_CHOOSER_IMPL_DEFAULT (chooser);
gchar *parent_uri;
if (!gtk_file_system_get_parent (impl->file_system, uri, &parent_uri, NULL)) /* NULL-GError */
return;
if (!parent_uri)
{
gtk_file_chooser_set_current_folder_uri (chooser, uri);
}
else
{
gtk_file_chooser_set_current_folder_uri (chooser, parent_uri);
g_free (parent_uri);
_gtk_file_system_model_uri_do (impl->list_model, uri,
expand_and_select_func, impl);
}
}
static void
unselect_func (GtkFileSystemModel *model,
GtkTreePath *path,
GtkTreeIter *iter,
gpointer user_data)
{
GtkFileChooserImplDefault *impl = user_data;
GtkTreeView *tree_view = GTK_TREE_VIEW (impl->list);
gtk_tree_selection_unselect_path (gtk_tree_view_get_selection (tree_view),
path);
}
static void
gtk_file_chooser_impl_default_unselect_uri (GtkFileChooser *chooser,
const char *uri)
{
GtkFileChooserImplDefault *impl = GTK_FILE_CHOOSER_IMPL_DEFAULT (chooser);
_gtk_file_system_model_uri_do (impl->list_model, uri,
unselect_func, impl);
}
static void
gtk_file_chooser_impl_default_select_all (GtkFileChooser *chooser)
{
GtkFileChooserImplDefault *impl = GTK_FILE_CHOOSER_IMPL_DEFAULT (chooser);
if (impl->select_multiple)
{
GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (impl->list));
gtk_tree_selection_select_all (selection);
}
}
static void
gtk_file_chooser_impl_default_unselect_all (GtkFileChooser *chooser)
{
GtkFileChooserImplDefault *impl = GTK_FILE_CHOOSER_IMPL_DEFAULT (chooser);
GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (impl->list));
gtk_tree_selection_unselect_all (selection);
}
static void
get_uris_foreach (GtkTreeModel *model,
GtkTreePath *path,
GtkTreeIter *iter,
gpointer data)
{
struct {
GSList *result;
GtkFileChooserImplDefault *impl;
} *info = data;
const gchar *uri = _gtk_file_system_model_get_uri (info->impl->tree_model, iter);
info->result = g_slist_prepend (info->result, g_strdup (uri));
}
static GSList *
gtk_file_chooser_impl_default_get_uris (GtkFileChooser *chooser)
{
GtkFileChooserImplDefault *impl = GTK_FILE_CHOOSER_IMPL_DEFAULT (chooser);
GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (impl->list));
struct {
GSList *result;
GtkFileChooserImplDefault *impl;
} info = { NULL, };
info.impl = impl;
gtk_tree_selection_selected_foreach (selection,
get_uris_foreach, &info);
return g_slist_reverse (info.result);
}
static void
tree_selection_changed (GtkTreeSelection *selection,
GtkFileChooserImplDefault *impl)
{
GtkTreeIter iter;
if (impl->list_model)
{
g_object_unref (impl->list_model);
impl->list_model = NULL;
}
if (gtk_tree_selection_get_selected (selection, NULL, &iter))
{
const gchar *uri = _gtk_file_system_model_get_uri (impl->tree_model, &iter);
impl->list_model = _gtk_file_system_model_new (impl->file_system,
uri, 0,
GTK_FILE_INFO_DISPLAY_NAME);
_gtk_file_system_model_set_show_folders (impl->list_model, FALSE);
}
gtk_tree_view_set_model (GTK_TREE_VIEW (impl->list),
GTK_TREE_MODEL (impl->list_model));
g_signal_emit_by_name (impl, "current_folder_changed", 0);
g_signal_emit_by_name (impl, "selection_changed", 0);
}
static void
list_selection_changed (GtkTreeSelection *selection,
GtkFileChooserImplDefault *impl)
{
g_signal_emit_by_name (impl, "selection_changed", 0);
}
void
name_data_func (GtkTreeViewColumn *tree_column,
GtkCellRenderer *cell,
GtkTreeModel *tree_model,
GtkTreeIter *iter,
gpointer data)
{
GtkFileChooserImplDefault *impl = data;
const GtkFileInfo *info = _gtk_file_system_model_get_info (impl->tree_model, iter);
if (info)
{
g_object_set (cell,
"text", gtk_file_info_get_display_name (info),
NULL);
}
}
GtkWidget *
_gtk_file_chooser_impl_default_new (GtkFileSystem *file_system)
{
GtkWidget *result = g_object_new (GTK_TYPE_FILE_CHOOSER_IMPL_DEFAULT, NULL);
GtkFileChooserImplDefault *impl = GTK_FILE_CHOOSER_IMPL_DEFAULT (result);
impl->file_system = file_system;
impl->tree_model = _gtk_file_system_model_new (file_system, NULL, -1, GTK_FILE_INFO_DISPLAY_NAME);
_gtk_file_system_model_set_show_files (impl->tree_model, FALSE);
gtk_tree_view_set_model (GTK_TREE_VIEW (impl->tree),
GTK_TREE_MODEL (impl->tree_model));
gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (impl->tree), 0,
"Name",
gtk_cell_renderer_text_new (),
name_data_func, impl, NULL);
gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (impl->list), 0,
"Name",
gtk_cell_renderer_text_new (),
name_data_func, impl, NULL);
return result;
}

View File

@ -0,0 +1,40 @@
/* GTK - The GIMP Toolkit
* gtkfilechooserwidget.h: Embeddable file selector widget
* Copyright (C) 2003, Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef __GTK_FILE_CHOOSER_IMPL_DEFAULT_H__
#define __GTK_FILE_CHOOSER_IMPL_DEFAULT_H__
#include "gtkfilesystem.h"
#include <gtk/gtkwidget.h>
G_BEGIN_DECLS
#define GTK_TYPE_FILE_CHOOSER_IMPL_DEFAULT (_gtk_file_chooser_impl_default_get_type ())
#define GTK_FILE_CHOOSER_IMPL_DEFAULT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_FILE_CHOOSER_IMPL_DEFAULT, GtkFileChooserImplDefault))
#define GTK_IS_FILE_CHOOSER_IMPL_DEFAULT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_FILE_CHOOSER_IMPL_DEFAULT))
typedef struct _GtkFileChooserImplDefault GtkFileChooserImplDefault;
GType _gtk_file_chooser_impl_default_get_type (void);
GtkWidget *_gtk_file_chooser_impl_default_new (GtkFileSystem *file_system);
G_END_DECLS
#endif /* __GTK_FILE_CHOOSER_IMPL_DEFAULT_H__ */

172
gtk/gtkfilechooserdialog.c Normal file
View File

@ -0,0 +1,172 @@
/* GTK - The GIMP Toolkit
* gtkfilechooserdialog.c: File selector dialog
* Copyright (C) 2003, Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include "gtkfilechooserdialog.h"
#include "gtkfilechooserwidget.h"
#include "gtkfilechooserenums.h"
#include "gtkfilechooserutils.h"
#include <stdarg.h>
struct _GtkFileChooserDialogPrivate
{
GtkWidget *widget;
};
#define GTK_FILE_CHOOSER_DIALOG_GET_PRIVATE(o) (GTK_FILE_CHOOSER_DIALOG (o)->priv)
static void gtk_file_chooser_dialog_class_init (GtkFileChooserDialogClass *class);
static void gtk_file_chooser_dialog_init (GtkFileChooserDialog *dialog);
static void gtk_file_chooser_dialog_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec);
static void gtk_file_chooser_dialog_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec);
GType
gtk_file_chooser_dialog_get_type (void)
{
static GType file_chooser_dialog_type = 0;
if (!file_chooser_dialog_type)
{
static const GTypeInfo file_chooser_dialog_info =
{
sizeof (GtkFileChooserDialogClass),
NULL, /* base_init */
NULL, /* base_finalize */
(GClassInitFunc) gtk_file_chooser_dialog_class_init,
NULL, /* class_finalize */
NULL, /* class_data */
sizeof (GtkFileChooserDialog),
0, /* n_preallocs */
(GInstanceInitFunc) gtk_file_chooser_dialog_init,
};
static const GInterfaceInfo file_chooser_info =
{
(GInterfaceInitFunc) _gtk_file_chooser_delegate_iface_init, /* interface_init */
NULL, /* interface_finalize */
NULL /* interface_data */
};
file_chooser_dialog_type = g_type_register_static (GTK_TYPE_DIALOG, "GtkFileChooserDialog",
&file_chooser_dialog_info, 0);
g_type_add_interface_static (file_chooser_dialog_type,
GTK_TYPE_FILE_CHOOSER,
&file_chooser_info);
}
return file_chooser_dialog_type;
}
static void
gtk_file_chooser_dialog_class_init (GtkFileChooserDialogClass *class)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (class);
gobject_class->set_property = gtk_file_chooser_dialog_set_property;
gobject_class->get_property = gtk_file_chooser_dialog_get_property;
_gtk_file_chooser_install_properties (gobject_class);
g_type_class_add_private (class, sizeof (GtkFileChooserDialogPrivate));
}
static void
gtk_file_chooser_dialog_init (GtkFileChooserDialog *dialog)
{
GtkFileChooserDialogPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE (dialog,
GTK_TYPE_FILE_CHOOSER_DIALOG,
GtkFileChooserDialogPrivate);
dialog->priv = priv;
gtk_widget_push_composite_child ();
priv->widget = g_object_new (GTK_TYPE_FILE_CHOOSER_WIDGET, NULL);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), priv->widget, TRUE, TRUE, 0);
gtk_widget_show (priv->widget);
_gtk_file_chooser_set_delegate (GTK_FILE_CHOOSER (dialog),
GTK_FILE_CHOOSER (priv->widget));
gtk_widget_pop_composite_child ();
}
static void
gtk_file_chooser_dialog_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
GtkFileChooserDialogPrivate *priv = GTK_FILE_CHOOSER_DIALOG_GET_PRIVATE (object);
g_object_set_property (G_OBJECT (priv->widget), pspec->name, value);
}
static void
gtk_file_chooser_dialog_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
GtkFileChooserDialogPrivate *priv = GTK_FILE_CHOOSER_DIALOG_GET_PRIVATE (object);
g_object_get_property (G_OBJECT (priv->widget), pspec->name, value);
}
GtkWidget *
gtk_file_chooser_dialog_new (const gchar *title,
GtkWindow *parent,
GtkFileChooserAction action,
const gchar *first_button_text,
...)
{
GtkWidget *result;
va_list varargs;
const char *button_text = first_button_text;
gint response_id;
result = g_object_new (GTK_TYPE_FILE_CHOOSER_DIALOG,
"title", title,
"action", action,
NULL);
if (parent)
gtk_window_set_transient_for (GTK_WINDOW (result), parent);
va_start (varargs, first_button_text);
while (button_text)
{
response_id = va_arg (varargs, gint);
gtk_dialog_add_button (GTK_DIALOG (result), button_text, response_id);
button_text = va_arg (varargs, const gchar *);
}
va_end (varargs);
return result;
}

View File

@ -0,0 +1,62 @@
/* GTK - The GIMP Toolkit
* gtkfilechooserdialog.h: File selector dialog
* Copyright (C) 2003, Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef __GTK_FILE_CHOOSER_DIALOG_H__
#define __GTK_FILE_CHOOSER_DIALOG_H__
#include <gtk/gtkdialog.h>
#include "gtkfilechooser.h"
G_BEGIN_DECLS
#define GTK_TYPE_FILE_CHOOSER_DIALOG (gtk_file_chooser_dialog_get_type ())
#define GTK_FILE_CHOOSER_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_FILE_CHOOSER_DIALOG, GtkFileChooserDialog))
#define GTK_FILE_CHOOSER_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_FILE_CHOOSER_DIALOG, GtkFileChooserDialogClass))
#define GTK_IS_FILE_CHOOSER_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_FILE_CHOOSER_DIALOG))
#define GTK_IS_FILE_CHOOSER_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_FILE_CHOOSER_DIALOG))
#define GTK_FILE_CHOOSER_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_FILE_CHOOSER_DIALOG, GtkFileChooserDialogClass))
typedef struct _GtkFileChooserDialog GtkFileChooserDialog;
typedef struct _GtkFileChooserDialogClass GtkFileChooserDialogClass;
typedef struct _GtkFileChooserDialogPrivate GtkFileChooserDialogPrivate;
struct _GtkFileChooserDialogClass
{
GtkDialogClass parent_class;
};
struct _GtkFileChooserDialog
{
GtkDialog parent_instance;
GtkFileChooserDialogPrivate *priv;
};
GType gtk_file_chooser_dialog_get_type (void);
GtkWidget *gtk_file_chooser_dialog_new (const gchar *title,
GtkWindow *parent,
GtkFileChooserAction action,
const gchar *first_button_text,
...);
G_END_DECLS
#endif /* __GTK_FILE_CHOOSER_DIALOG_H__ */

172
gtk/gtkfilechooserutils.c Normal file
View File

@ -0,0 +1,172 @@
/* GTK - The GIMP Toolkit
* gtkfilechooserutils.c: Private utility functions useful for
* implementing a GtkFileChooser interface
* Copyright (C) 2003, Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include "gtkfilechooserutils.h"
#include "gtkfilechooser.h"
#include "gtkfilechooserenums.h"
static void delegate_set_current_folder (GtkFileChooser *chooser,
const char *uri);
static char * delegate_get_current_folder (GtkFileChooser *chooser);
static void delegate_select_uri (GtkFileChooser *chooser,
const char *uri);
static void delegate_unselect_uri (GtkFileChooser *chooser,
const char *uri);
static void delegate_select_all (GtkFileChooser *chooser);
static void delegate_unselect_all (GtkFileChooser *chooser);
static GSList *delegate_get_uris (GtkFileChooser *chooser);
static void delegate_current_folder_changed (GtkFileChooser *chooser,
gpointer data);
static void delegate_selection_changed (GtkFileChooser *chooser,
gpointer data);
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_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));
}
void
_gtk_file_chooser_delegate_iface_init (GtkFileChooserIface *iface)
{
iface->set_current_folder = delegate_set_current_folder;
iface->get_current_folder = delegate_get_current_folder;
iface->select_uri = delegate_select_uri;
iface->unselect_uri = delegate_unselect_uri;
iface->select_all = delegate_select_all;
iface->unselect_all = delegate_unselect_all;
iface->get_uris = delegate_get_uris;
}
void
_gtk_file_chooser_set_delegate (GtkFileChooser *receiver,
GtkFileChooser *delegate)
{
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_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);
}
GtkFileChooser *
get_delegate (GtkFileChooser *receiver)
{
return g_object_get_data (G_OBJECT (receiver), "gtk-file-chooser-delegate");
}
static void
delegate_select_uri (GtkFileChooser *chooser,
const char *uri)
{
gtk_file_chooser_select_uri (get_delegate (chooser), uri);
}
static void
delegate_unselect_uri (GtkFileChooser *chooser,
const char *uri)
{
gtk_file_chooser_unselect_uri (get_delegate (chooser), uri);
}
static void
delegate_select_all (GtkFileChooser *chooser)
{
gtk_file_chooser_select_all (get_delegate (chooser));
}
static void
delegate_unselect_all (GtkFileChooser *chooser)
{
gtk_file_chooser_unselect_all (get_delegate (chooser));
}
static GSList *
delegate_get_uris (GtkFileChooser *chooser)
{
return gtk_file_chooser_get_uris (get_delegate (chooser));
}
static void
delegate_set_current_folder (GtkFileChooser *chooser,
const char *uri)
{
gtk_file_chooser_set_current_folder_uri (chooser, uri);
}
static char *
delegate_get_current_folder (GtkFileChooser *chooser)
{
return gtk_file_chooser_get_current_folder_uri (get_delegate (chooser));
}
static void
delegate_selection_changed (GtkFileChooser *chooser,
gpointer data)
{
g_signal_emit_by_name (data, "selection_changed", 0);
}
static void
delegate_current_folder_changed (GtkFileChooser *chooser,
gpointer data)
{
g_signal_emit_by_name (data, "current_folder_changed", 0);
}

47
gtk/gtkfilechooserutils.h Normal file
View File

@ -0,0 +1,47 @@
/* GTK - The GIMP Toolkit
* gtkfilechooserutils.h: Private utility functions useful for
* implementing a GtkFileChooser interface
* Copyright (C) 2003, Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef __GTK_FILE_CHOOSER_UTILS_H__
#define __GTK_FILE_CHOOSER_UTILS_H__
#include "gtkfilechooser.h"
G_BEGIN_DECLS
typedef enum {
GTK_FILE_CHOOSER_PROP_ACTION = 0x1000,
GTK_FILE_CHOOSER_PROP_FOLDER_MODE,
GTK_FILE_CHOOSER_PROP_LOCAL_ONLY,
GTK_FILE_CHOOSER_PROP_PREVIEW_WIDGET,
GTK_FILE_CHOOSER_PROP_PREVIEW_WIDGET_ACTIVE,
GTK_FILE_CHOOSER_PROP_SELECT_MULTIPLE,
GTK_FILE_CHOOSER_PROP_SHOW_HIDDEN
} GtkFileChooserProp;
void _gtk_file_chooser_install_properties (GObjectClass *klass);
void _gtk_file_chooser_delegate_iface_init (GtkFileChooserIface *iface);
void _gtk_file_chooser_set_delegate (GtkFileChooser *receiver,
GtkFileChooser *delegate);
G_END_DECLS
#endif /* __GTK_FILE_CHOOSER_UTILS_H__ */

155
gtk/gtkfilechooserwidget.c Normal file
View File

@ -0,0 +1,155 @@
/* GTK - The GIMP Toolkit
* gtkfilechooserwidget.c: Embeddable file selector widget
* Copyright (C) 2003, Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include "gtkfilechooserwidget.h"
#include "gtkfilechooserimpldefault.h"
#include "gtkfilechooserenums.h"
#include "gtkfilechooserutils.h"
#include "gtkfilesystemunix.h"
struct _GtkFileChooserWidgetPrivate
{
GtkWidget *impl;
};
#define GTK_FILE_CHOOSER_WIDGET_GET_PRIVATE(o) (GTK_FILE_CHOOSER_WIDGET (o)->priv)
static void gtk_file_chooser_widget_class_init (GtkFileChooserWidgetClass *class);
static void gtk_file_chooser_widget_init (GtkFileChooserWidget *chooser_widget);
static void gtk_file_chooser_widget_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec);
static void gtk_file_chooser_widget_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec);
GType
gtk_file_chooser_widget_get_type (void)
{
static GType file_chooser_widget_type = 0;
if (!file_chooser_widget_type)
{
static const GTypeInfo file_chooser_widget_info =
{
sizeof (GtkFileChooserWidgetClass),
NULL, /* base_init */
NULL, /* base_finalize */
(GClassInitFunc) gtk_file_chooser_widget_class_init,
NULL, /* class_finalize */
NULL, /* class_data */
sizeof (GtkFileChooserWidget),
0, /* n_preallocs */
(GInstanceInitFunc) gtk_file_chooser_widget_init,
};
static const GInterfaceInfo file_chooser_info =
{
(GInterfaceInitFunc) _gtk_file_chooser_delegate_iface_init, /* interface_init */
NULL, /* interface_finalize */
NULL /* interface_data */
};
file_chooser_widget_type = g_type_register_static (GTK_TYPE_VBOX, "GtkFileChooserWidget",
&file_chooser_widget_info, 0);
g_type_add_interface_static (file_chooser_widget_type,
GTK_TYPE_FILE_CHOOSER,
&file_chooser_info);
}
return file_chooser_widget_type;
}
static void
gtk_file_chooser_widget_class_init (GtkFileChooserWidgetClass *class)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (class);
gobject_class->set_property = gtk_file_chooser_widget_set_property;
gobject_class->get_property = gtk_file_chooser_widget_get_property;
_gtk_file_chooser_install_properties (gobject_class);
g_type_class_add_private (class, sizeof (GtkFileChooserWidgetPrivate));
}
static void
gtk_file_chooser_widget_init (GtkFileChooserWidget *chooser_widget)
{
GtkFileChooserWidgetPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE (chooser_widget,
GTK_TYPE_FILE_CHOOSER_WIDGET,
GtkFileChooserWidgetPrivate);
gchar *current_folder;
gchar *current_folder_uri;
chooser_widget->priv = priv;
gtk_widget_push_composite_child ();
priv->impl = _gtk_file_chooser_impl_default_new (g_object_new (GTK_TYPE_FILE_SYSTEM_UNIX, NULL));
gtk_box_pack_start (GTK_BOX (chooser_widget), priv->impl, TRUE, TRUE, 0);
gtk_widget_show (priv->impl);
current_folder = g_get_current_dir ();
current_folder_uri = g_filename_to_uri (current_folder, NULL, NULL);
if (current_folder_uri)
{
gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (priv->impl), current_folder_uri);
g_free (current_folder_uri);
}
g_free (current_folder);
_gtk_file_chooser_set_delegate (GTK_FILE_CHOOSER (chooser_widget),
GTK_FILE_CHOOSER (priv->impl));
gtk_widget_pop_composite_child ();
}
static void
gtk_file_chooser_widget_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
GtkFileChooserWidgetPrivate *priv = GTK_FILE_CHOOSER_WIDGET_GET_PRIVATE (object);
g_object_set_property (G_OBJECT (priv->impl), pspec->name, value);
}
static void
gtk_file_chooser_widget_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
GtkFileChooserWidgetPrivate *priv = GTK_FILE_CHOOSER_WIDGET_GET_PRIVATE (object);
g_object_get_property (G_OBJECT (priv->impl), pspec->name, value);
}
GtkWidget *
gtk_file_chooser_widget_new (GtkFileChooserAction action)
{
return g_object_new (GTK_TYPE_FILE_CHOOSER_WIDGET,
"action", action,
NULL);
}

View File

@ -0,0 +1,58 @@
/* GTK - The GIMP Toolkit
* gtkfilechooserwidget.h: Embeddable file selector widget
* Copyright (C) 2003, Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef __GTK_FILE_CHOOSER_WIDGET_H__
#define __GTK_FILE_CHOOSER_WIDGET_H__
#include "gtkfilechooser.h"
#include <gtk/gtkvbox.h>
G_BEGIN_DECLS
#define GTK_TYPE_FILE_CHOOSER_WIDGET (gtk_file_chooser_widget_get_type ())
#define GTK_FILE_CHOOSER_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_FILE_CHOOSER_WIDGET, GtkFileChooserWidget))
#define GTK_FILE_CHOOSER_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_FILE_CHOOSER_WIDGET, GtkFileChooserWidgetClass))
#define GTK_IS_FILE_CHOOSER_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_FILE_CHOOSER_WIDGET))
#define GTK_IS_FILE_CHOOSER_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_FILE_CHOOSER_WIDGET))
#define GTK_FILE_CHOOSER_WIDGET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_FILE_CHOOSER_WIDGET, GtkFileChooserWidgetClass))
typedef struct _GtkFileChooserWidget GtkFileChooserWidget;
typedef struct _GtkFileChooserWidgetClass GtkFileChooserWidgetClass;
typedef struct _GtkFileChooserWidgetPrivate GtkFileChooserWidgetPrivate;
struct _GtkFileChooserWidgetClass
{
GtkVBoxClass parent_class;
};
struct _GtkFileChooserWidget
{
GtkVBox parent_instance;
GtkFileChooserWidgetPrivate *priv;
};
GType gtk_file_chooser_widget_get_type (void);
GtkWidget *gtk_file_chooser_widget_new (GtkFileChooserAction action);
G_END_DECLS
#endif /* __GTK_FILE_CHOOSER_WIDGET_H__ */

465
gtk/gtkfilesystem.c Normal file
View File

@ -0,0 +1,465 @@
/* GTK - The GIMP Toolkit
* gtkfilesystem.c: Abstract file system interfaces
* Copyright (C) 2003, Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include "gtkfilesystem.h"
struct _GtkFileInfo
{
GtkFileTime modification_time;
gint64 size;
gchar *display_name;
gchar *mime_type;
GdkPixbuf *icon;
guint is_folder : 1;
guint is_hidden : 1;
};
static void gtk_file_system_base_init (gpointer g_class);
static void gtk_file_folder_base_init (gpointer g_class);
GQuark
gtk_file_system_error_quark (void)
{
static GQuark quark = 0;
if (quark == 0)
quark = g_quark_from_static_string ("gtk-file-system-error-quark");
return quark;
}
/*****************************************
* GtkFileInfo *
*****************************************/
GType
gtk_file_info_get_type (void)
{
static GType our_type = 0;
if (our_type == 0)
our_type = g_boxed_type_register_static ("GtkFileInfo",
(GBoxedCopyFunc) gtk_file_info_copy,
(GBoxedFreeFunc) gtk_file_info_free);
return our_type;
}
GtkFileInfo *
gtk_file_info_new (void)
{
GtkFileInfo *info;
info = g_new0 (GtkFileInfo, 1);
return info;
}
GtkFileInfo *
gtk_file_info_copy (GtkFileInfo *info)
{
GtkFileInfo *new_info;
g_return_val_if_fail (info != NULL, NULL);
new_info = g_memdup (info, sizeof (GtkFileInfo));
if (new_info->display_name)
new_info->display_name = g_strdup (new_info->display_name);
if (new_info->mime_type)
new_info->mime_type = g_strdup (new_info->mime_type);
if (new_info->icon)
g_object_ref (new_info->icon);
return new_info;
}
void
gtk_file_info_free (GtkFileInfo *info)
{
g_return_if_fail (info != NULL);
if (info->display_name)
g_free (info->display_name);
if (info->mime_type)
g_free (info->mime_type);
if (info->icon)
g_object_unref (info->icon);
}
G_CONST_RETURN gchar *
gtk_file_info_get_display_name (const GtkFileInfo *info)
{
g_return_val_if_fail (info != NULL, NULL);
return info->display_name;
}
void
gtk_file_info_set_display_name (GtkFileInfo *info,
const gchar *display_name)
{
g_return_if_fail (info != NULL);
if (info->display_name)
g_free (info->display_name);
info->display_name = g_strdup (display_name);
}
gboolean
gtk_file_info_get_is_folder (const GtkFileInfo *info)
{
g_return_val_if_fail (info != NULL, FALSE);
return info->is_folder;
}
void
gtk_file_info_set_is_folder (GtkFileInfo *info,
gboolean is_folder)
{
g_return_if_fail (info != NULL);
info->is_folder = is_folder != FALSE;
}
gboolean
gtk_file_info_get_is_hidden (const GtkFileInfo *info)
{
g_return_val_if_fail (info != NULL, FALSE);
return info->is_hidden;
}
void
gtk_file_info_set_is_hidden (GtkFileInfo *info,
gboolean is_hidden)
{
g_return_if_fail (info != NULL);
info->is_hidden = is_hidden != FALSE;
}
G_CONST_RETURN gchar *
gtk_file_info_get_mime_type (const GtkFileInfo *info)
{
g_return_val_if_fail (info != NULL, NULL);
return info->mime_type;
}
void
gtk_file_info_set_mime_type (GtkFileInfo *info,
const gchar *mime_type)
{
g_return_if_fail (info != NULL);
if (info->mime_type)
g_free (info->mime_type);
info->mime_type = g_strdup (mime_type);
}
GtkFileTime
gtk_file_info_get_modification_time (const GtkFileInfo *info)
{
g_return_val_if_fail (info != NULL, 0);
return info->modification_time;
}
void
gtk_file_info_set_modification_time (GtkFileInfo *info,
GtkFileTime modification_time)
{
g_return_if_fail (info != NULL);
info->modification_time = modification_time;
}
gint64
gtk_file_info_get_size (const GtkFileInfo *info)
{
g_return_val_if_fail (info != NULL, 0);
return info->size;
}
void
gtk_file_info_set_size (GtkFileInfo *info,
gint64 size)
{
g_return_if_fail (info != NULL);
g_return_if_fail (size < 0);
info->size = size;
}
GdkPixbuf *
gtk_file_info_get_icon (const GtkFileInfo *info)
{
g_return_val_if_fail (info != NULL, NULL);
return info->icon;
}
void
gtk_file_info_set_icon (GtkFileInfo *info,
GdkPixbuf *icon)
{
g_return_if_fail (info != NULL);
g_return_if_fail (icon == NULL || GDK_IS_PIXBUF (icon));
if (icon != info->icon)
{
if (info->icon)
g_object_unref (info->icon);
info->icon = icon;
if (info->icon)
g_object_ref (info->icon);
}
}
/*****************************************
* GtkFileSystem *
*****************************************/
GType
gtk_file_system_get_type (void)
{
static GType file_system_type = 0;
if (!file_system_type)
{
static const GTypeInfo file_system_info =
{
sizeof (GtkFileSystemIface), /* class_size */
gtk_file_system_base_init, /* base_init */
NULL, /* base_finalize */
};
file_system_type = g_type_register_static (G_TYPE_INTERFACE,
"GtkFileSystem",
&file_system_info, 0);
}
return file_system_type;
}
static void
gtk_file_system_base_init (gpointer g_class)
{
static gboolean initialized = FALSE;
if (!initialized)
{
GType iface_type = G_TYPE_FROM_INTERFACE (g_class);
g_signal_new ("roots_changed",
iface_type,
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GtkFileSystemIface, roots_changed),
NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0);
initialized = TRUE;
}
}
GSList *
gtk_file_system_list_roots (GtkFileSystem *file_system)
{
g_return_val_if_fail (GTK_IS_FILE_SYSTEM (file_system), NULL);
return GTK_FILE_SYSTEM_GET_IFACE (file_system)->list_roots (file_system);
}
GtkFileInfo *
gtk_file_system_get_root_info (GtkFileSystem *file_system,
const gchar *uri,
GtkFileInfoType types,
GError **error)
{
g_return_val_if_fail (GTK_IS_FILE_SYSTEM (file_system), NULL);
g_return_val_if_fail (uri != NULL, NULL);
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
return GTK_FILE_SYSTEM_GET_IFACE (file_system)->get_root_info (file_system, uri, types, error);
}
GtkFileFolder *
gtk_file_system_get_folder (GtkFileSystem *file_system,
const gchar *uri,
GtkFileInfoType types,
GError **error)
{
g_return_val_if_fail (GTK_IS_FILE_SYSTEM (file_system), NULL);
g_return_val_if_fail (uri != NULL, NULL);
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
return GTK_FILE_SYSTEM_GET_IFACE (file_system)->get_folder (file_system, uri, types, error);
}
gboolean
gtk_file_system_create_folder(GtkFileSystem *file_system,
const gchar *uri,
GError **error)
{
g_return_val_if_fail (GTK_IS_FILE_SYSTEM (file_system), FALSE);
g_return_val_if_fail (uri != NULL, FALSE);
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
return GTK_FILE_SYSTEM_GET_IFACE (file_system)->create_folder (file_system, uri, error);
}
gboolean
gtk_file_system_get_parent (GtkFileSystem *file_system,
const gchar *uri,
gchar **parent,
GError **error)
{
gchar *tmp_parent = NULL;
gboolean result;
g_return_val_if_fail (GTK_IS_FILE_SYSTEM (file_system), FALSE);
g_return_val_if_fail (uri != NULL, FALSE);
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
result = GTK_FILE_SYSTEM_GET_IFACE (file_system)->get_parent (file_system, uri, &tmp_parent, error);
g_assert (result || tmp_parent == NULL);
if (parent)
*parent = tmp_parent;
return result;
}
gchar *
gtk_file_system_make_uri (GtkFileSystem *file_system,
const gchar *base_uri,
const gchar *display_name,
GError **error)
{
g_return_val_if_fail (GTK_IS_FILE_SYSTEM (file_system), NULL);
g_return_val_if_fail (base_uri != NULL, NULL);
g_return_val_if_fail (display_name != NULL, NULL);
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
return GTK_FILE_SYSTEM_GET_IFACE (file_system)->make_uri (file_system, base_uri, display_name, error);
}
/*****************************************
* GtkFileFolder *
*****************************************/
GType
gtk_file_folder_get_type (void)
{
static GType file_folder_type = 0;
if (!file_folder_type)
{
static const GTypeInfo file_folder_info =
{
sizeof (GtkFileFolderIface), /* class_size */
gtk_file_folder_base_init, /* base_init */
NULL, /* base_finalize */
};
file_folder_type = g_type_register_static (G_TYPE_INTERFACE,
"GtkFileFolder",
&file_folder_info, 0);
}
return file_folder_type;
}
static void
gtk_file_folder_base_init (gpointer g_class)
{
static gboolean initialized = FALSE;
if (!initialized)
{
GType iface_type = G_TYPE_FROM_INTERFACE (g_class);
g_signal_new ("deleted",
iface_type,
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GtkFileFolderIface, deleted),
NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0);
g_signal_new ("file_added",
iface_type,
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GtkFileFolderIface, file_added),
NULL, NULL,
g_cclosure_marshal_VOID__STRING,
G_TYPE_NONE, 0);
g_signal_new ("file_changed",
iface_type,
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GtkFileFolderIface, file_changed),
NULL, NULL,
g_cclosure_marshal_VOID__STRING,
G_TYPE_NONE, 0);
g_signal_new ("file_removed",
iface_type,
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GtkFileFolderIface, file_removed),
NULL, NULL,
g_cclosure_marshal_VOID__STRING,
G_TYPE_NONE, 0);
initialized = TRUE;
}
}
gboolean
gtk_file_folder_list_children (GtkFileFolder *folder,
GSList **children,
GError **error)
{
gboolean result;
GSList *tmp_children = NULL;
g_return_val_if_fail (GTK_IS_FILE_FOLDER (folder), FALSE);
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
result = GTK_FILE_FOLDER_GET_IFACE (folder)->list_children (folder, &tmp_children, error);
g_assert (result || tmp_children == NULL);
if (children)
*children = tmp_children;
return result;
}
GtkFileInfo *
gtk_file_folder_get_info (GtkFileFolder *folder,
const gchar *uri,
GError **error)
{
g_return_val_if_fail (GTK_IS_FILE_FOLDER (folder), NULL);
g_return_val_if_fail (uri != NULL, NULL);
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
return GTK_FILE_FOLDER_GET_IFACE (folder)->get_info (folder, uri, error);
}

209
gtk/gtkfilesystem.h Normal file
View File

@ -0,0 +1,209 @@
/* GTK - The GIMP Toolkit
* gtkfilesystem.h: Abstract file system interfaces
* Copyright (C) 2003, Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef __GTK_FILE_SYSTEM_H__
#define __GTK_FILE_SYSTEM_H__
#include <glib-object.h>
#include <gdk-pixbuf/gdk-pixbuf.h>
G_BEGIN_DECLS
typedef gint64 GtkFileTime;
typedef struct _GtkFileFolder GtkFileFolder;
typedef struct _GtkFileFolderIface GtkFileFolderIface;
typedef struct _GtkFileInfo GtkFileInfo;
typedef struct _GtkFileSystem GtkFileSystem;
typedef struct _GtkFileSystemIface GtkFileSystemIface;
/* Mask of information about a file, for monitoring and
* gtk_file_system_get_info()
*/
typedef enum {
GTK_FILE_INFO_DISPLAY_NAME = 1 << 0,
GTK_FILE_INFO_IS_FOLDER = 1 << 1,
GTK_FILE_INFO_IS_HIDDEN = 1 << 2,
GTK_FILE_INFO_MIME_TYPE = 1 << 3,
GTK_FILE_INFO_MODIFICATION_TIME = 1 << 4,
GTK_FILE_INFO_SIZE = 1 << 5,
GTK_FILE_INFO_ICON = 1 << 6
} GtkFileInfoType;
/* GError enumeration for GtkFileSystem
*/
#define GTK_FILE_SYSTEM_ERROR (gtk_file_system_error_quark ())
typedef enum
{
GTK_FILE_SYSTEM_ERROR_NONEXISTANT,
GTK_FILE_SYSTEM_ERROR_NOT_FOLDER,
GTK_FILE_SYSTEM_ERROR_INVALID_URI,
GTK_FILE_SYSTEM_ERROR_BAD_FILENAME,
GTK_FILE_SYSTEM_ERROR_FAILED,
} GtkFileSystemError;
GQuark gtk_file_system_error_quark (void);
/* Boxed-type for gtk_file_folder_get_info() results
*/
#define GTK_TYPE_FILE_INFO (gtk_file_info_get_type ())
GType gtk_file_info_get_type (void);
GtkFileInfo *gtk_file_info_new (void);
GtkFileInfo *gtk_file_info_copy (GtkFileInfo *info);
void gtk_file_info_free (GtkFileInfo *info);
G_CONST_RETURN gchar *gtk_file_info_get_display_name (const GtkFileInfo *info);
void gtk_file_info_set_display_name (GtkFileInfo *info,
const gchar *display_name);
gboolean gtk_file_info_get_is_folder (const GtkFileInfo *info);
void gtk_file_info_set_is_folder (GtkFileInfo *info,
gboolean is_folder);
gboolean gtk_file_info_get_is_hidden (const GtkFileInfo *info);
void gtk_file_info_set_is_hidden (GtkFileInfo *info,
gboolean is_hidden);
G_CONST_RETURN gchar *gtk_file_info_get_mime_type (const GtkFileInfo *info);
void gtk_file_info_set_mime_type (GtkFileInfo *info,
const gchar *mime_type);
GtkFileTime gtk_file_info_get_modification_time (const GtkFileInfo *info);
void gtk_file_info_set_modification_time (GtkFileInfo *info,
GtkFileTime modification_time);
gint64 gtk_file_info_get_size (const GtkFileInfo *info);
void gtk_file_info_set_size (GtkFileInfo *info,
gint64 size);
GdkPixbuf * gtk_file_info_get_icon (const GtkFileInfo *info);
void gtk_file_info_set_icon (GtkFileInfo *info,
GdkPixbuf *icon);
/* The base GtkFileSystem interface
*/
#define GTK_TYPE_FILE_SYSTEM (gtk_file_system_get_type ())
#define GTK_FILE_SYSTEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_FILE_SYSTEM, GtkFileSystem))
#define GTK_IS_FILE_SYSTEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_FILE_SYSTEM))
#define GTK_FILE_SYSTEM_GET_IFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GTK_TYPE_FILE_SYSTEM, GtkFileSystemIface))
struct _GtkFileSystemIface
{
GTypeInterface base_iface;
/* Methods
*/
GSList * (*list_roots) (GtkFileSystem *file_system);
GtkFileInfo * (*get_root_info) (GtkFileSystem *file_system,
const gchar *uri,
GtkFileInfoType types,
GError **error);
GtkFileFolder * (*get_folder) (GtkFileSystem *file_system,
const gchar *uri,
GtkFileInfoType types,
GError **error);
gboolean (*create_folder) (GtkFileSystem *file_system,
const gchar *uri,
GError **error);
/* URI Manipulation
*/
gboolean (*get_parent) (GtkFileSystem *file_system,
const gchar *uri,
gchar **parent,
GError **error);
gchar * (*make_uri) (GtkFileSystem *file_system,
const gchar *base_uri,
const gchar *display_name,
GError **error);
/* Signals
*/
void (*roots_changed) (GtkFileSystem *file_system);
};
GType gtk_file_system_get_type (void);
GSList * gtk_file_system_list_roots (GtkFileSystem *file_system);
GtkFileInfo * gtk_file_system_get_root_info (GtkFileSystem *file_system,
const gchar *uri,
GtkFileInfoType types,
GError **error);
gboolean gtk_file_system_get_parent (GtkFileSystem *file_system,
const gchar *uri,
gchar **parent,
GError **error);
GtkFileFolder *gtk_file_system_get_folder (GtkFileSystem *file_system,
const gchar *uri,
GtkFileInfoType types,
GError **error);
gboolean gtk_file_system_create_folder (GtkFileSystem *file_system,
const gchar *uri,
GError **error);
gchar * gtk_file_system_make_uri (GtkFileSystem *file_system,
const gchar *base_uri,
const gchar *display_name,
GError **error);
/*
* Detailed information about a particular folder
*/
#define GTK_TYPE_FILE_FOLDER (gtk_file_folder_get_type ())
#define GTK_FILE_FOLDER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_FILE_FOLDER, GtkFileFolder))
#define GTK_IS_FILE_FOLDER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_FILE_FOLDER))
#define GTK_FILE_FOLDER_GET_IFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GTK_TYPE_FILE_FOLDER, GtkFileFolderIface))
struct _GtkFileFolderIface
{
GTypeInterface base_iface;
/* Methods
*/
GtkFileInfo * (*get_info) (GtkFileFolder *folder,
const gchar *uri,
GError **error);
gboolean (*list_children) (GtkFileFolder *folder,
GSList **children,
GError **error);
/* ??? refresh() ??? */
/* Signals
*/
void (*deleted) (GtkFileFolder *monitor);
void (*file_added) (GtkFileFolder *monitor,
const gchar *uri);
void (*file_changed) (GtkFileFolder *monitor,
const gchar *uri);
void (*file_removed) (GtkFileFolder *monitor,
const gchar *uri);
};
GType gtk_file_folder_get_type (void);
gboolean gtk_file_folder_list_children (GtkFileFolder *folder,
GSList **children,
GError **error);
GtkFileInfo *gtk_file_folder_get_info (GtkFileFolder *folder,
const gchar *uri,
GError **error);
G_END_DECLS
#endif /* __GTK_FILE_SYSTEM_H__ */

1040
gtk/gtkfilesystemmodel.c Normal file

File diff suppressed because it is too large Load Diff

72
gtk/gtkfilesystemmodel.h Normal file
View File

@ -0,0 +1,72 @@
/* GTK - The GIMP Toolkit
* gtkfilesystemmodel.h: GtkTreeModel wrapping a GtkFileSystem
* Copyright (C) 2003, Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef __GTK_FILE_SYSTEM_MODEL_H__
#define __GTK_FILE_SYSTEM_MODEL_H__
#include <glib-object.h>
#include "gtkfilesystem.h"
#include <gtk/gtktreemodel.h>
G_BEGIN_DECLS
#define GTK_TYPE_FILE_SYSTEM_MODEL (_gtk_file_system_model_get_type ())
#define GTK_FILE_SYSTEM_MODEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_FILE_SYSTEM_MODEL, GtkFileSystemModel))
#define GTK_IS_FILE_SYSTEM_MODEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_FILE_SYSTEM_MODEL))
typedef struct _GtkFileSystemModel GtkFileSystemModel;
GType _gtk_file_system_model_get_type (void);
enum {
GTK_FILE_SYSTEM_MODEL_URI,
GTK_FILE_SYSTEM_MODEL_INFO,
GTK_FILE_SYSTEM_MODEL_N_COLUMNS
} GtkFileSystemModelColumns;
GtkFileSystemModel *_gtk_file_system_model_new (GtkFileSystem *file_system,
const gchar *root_uri,
gint max_depth,
GtkFileInfoType types);
const GtkFileInfo * _gtk_file_system_model_get_info (GtkFileSystemModel *model,
GtkTreeIter *iter);
const gchar * _gtk_file_system_model_get_uri (GtkFileSystemModel *model,
GtkTreeIter *iter);
void _gtk_file_system_model_set_show_hidden (GtkFileSystemModel *model,
gboolean show_hidden);
void _gtk_file_system_model_set_show_folders (GtkFileSystemModel *model,
gboolean show_folders);
void _gtk_file_system_model_set_show_files (GtkFileSystemModel *model,
gboolean show_files);
typedef void (*GtkFileSystemModelURIFunc) (GtkFileSystemModel *model,
GtkTreePath *path,
GtkTreeIter *iter,
gpointer user_data);
gboolean _gtk_file_system_model_uri_do (GtkFileSystemModel *model,
const gchar *uri,
GtkFileSystemModelURIFunc func,
gpointer user_data);
G_END_DECLS
#endif /* __GTK_FILE_SYSTEM_MODEL_H__ */

588
gtk/gtkfilesystemunix.c Normal file
View File

@ -0,0 +1,588 @@
/* GTK - The GIMP Toolkit
* gtkfilesystemunix.c: Default implementation of GtkFileSystem for UNIX-like systems
* Copyright (C) 2003, Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include "gtkfilesystem.h"
#include "gtkfilesystemunix.h"
#include <errno.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
typedef struct _GtkFileSystemUnixClass GtkFileSystemUnixClass;
#define GTK_FILE_SYSTEM_UNIX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_FILE_SYSTEM_UNIX, GtkFileSystemUnixClass))
#define GTK_IS_FILE_SYSTEM_UNIX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_FILE_SYSTEM_UNIX))
#define GTK_FILE_SYSTEM_UNIX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_FILE_SYSTEM_UNIX, GtkFileSystemUnixClass))
struct _GtkFileSystemUnixClass
{
GObjectClass parent_class;
};
struct _GtkFileSystemUnix
{
GObject parent_instance;
};
#define GTK_TYPE_FILE_FOLDER_UNIX (gtk_file_folder_unix_get_type ())
#define GTK_FILE_FOLDER_UNIX(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_FILE_FOLDER_UNIX, GtkFileFolderUnix))
#define GTK_IS_FILE_FOLDER_UNIX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_FILE_FOLDER_UNIX))
#define GTK_FILE_FOLDER_UNIX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_FILE_FOLDER_UNIX, GtkFileFolderUnixClass))
#define GTK_IS_FILE_FOLDER_UNIX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_FILE_FOLDER_UNIX))
#define GTK_FILE_FOLDER_UNIX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_FILE_FOLDER_UNIX, GtkFileFolderUnixClass))
typedef struct _GtkFileFolderUnix GtkFileFolderUnix;
typedef struct _GtkFileFolderUnixClass GtkFileFolderUnixClass;
struct _GtkFileFolderUnixClass
{
GObjectClass parent_class;
};
struct _GtkFileFolderUnix
{
GObject parent_instance;
GtkFileInfoType types;
gchar *filename;
};
static void gtk_file_system_unix_class_init (GtkFileSystemUnixClass *class);
static void gtk_file_system_unix_iface_init (GtkFileSystemIface *iface);
static void gtk_file_system_unix_init (GtkFileSystemUnix *impl);
static void gtk_file_system_unix_finalize (GObject *object);
static GSList * gtk_file_system_unix_list_roots (GtkFileSystem *file_system);
static GtkFileInfo * gtk_file_system_unix_get_root_info (GtkFileSystem *file_system,
const gchar *uri,
GtkFileInfoType types,
GError **error);
static GtkFileFolder *gtk_file_system_unix_get_folder (GtkFileSystem *file_system,
const gchar *uri,
GtkFileInfoType types,
GError **error);
static gboolean gtk_file_system_unix_create_folder (GtkFileSystem *file_system,
const gchar *uri,
GError **error);
static gboolean gtk_file_system_unix_get_parent (GtkFileSystem *file_system,
const gchar *uri,
gchar **parent,
GError **error);
static gchar * gtk_file_system_unix_make_uri (GtkFileSystem *file_system,
const gchar *base_uri,
const gchar *display_name,
GError **error);
static GType gtk_file_folder_unix_get_type (void);
static void gtk_file_folder_unix_class_init (GtkFileFolderUnixClass *class);
static void gtk_file_folder_unix_iface_init (GtkFileFolderIface *iface);
static void gtk_file_folder_unix_init (GtkFileFolderUnix *impl);
static void gtk_file_folder_unix_finalize (GObject *object);
static GtkFileInfo *gtk_file_folder_unix_get_info (GtkFileFolder *folder,
const gchar *uri,
GError **error);
static gboolean gtk_file_folder_unix_list_children (GtkFileFolder *folder,
GSList **children,
GError **error);
static gchar * filename_from_uri (const gchar *filename,
GError **error);
static gchar * filename_to_uri (const gchar *filename);
static gboolean filename_is_root (const char *filename);
static GtkFileInfo *filename_get_info (const gchar *filename,
GtkFileInfoType types,
GError **error);
/*
* GtkFileSystemUnix
*/
GType
_gtk_file_system_unix_get_type (void)
{
static GType file_system_unix_type = 0;
if (!file_system_unix_type)
{
static const GTypeInfo file_system_unix_info =
{
sizeof (GtkFileSystemUnixClass),
NULL, /* base_init */
NULL, /* base_finalize */
(GClassInitFunc) gtk_file_system_unix_class_init,
NULL, /* class_finalize */
NULL, /* class_data */
sizeof (GtkFileSystemUnix),
0, /* n_preallocs */
(GInstanceInitFunc) gtk_file_system_unix_init,
};
static const GInterfaceInfo file_system_info =
{
(GInterfaceInitFunc) gtk_file_system_unix_iface_init, /* interface_init */
NULL, /* interface_finalize */
NULL /* interface_data */
};
file_system_unix_type = g_type_register_static (G_TYPE_OBJECT,
"GtkFileSystemUnix",
&file_system_unix_info, 0);
g_type_add_interface_static (file_system_unix_type,
GTK_TYPE_FILE_SYSTEM,
&file_system_info);
}
return file_system_unix_type;
}
static void
gtk_file_system_unix_class_init (GtkFileSystemUnixClass *class)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (class);
gobject_class->finalize = gtk_file_system_unix_finalize;
}
static void
gtk_file_system_unix_iface_init (GtkFileSystemIface *iface)
{
iface->list_roots = gtk_file_system_unix_list_roots;
iface->get_folder = gtk_file_system_unix_get_folder;
iface->get_root_info = gtk_file_system_unix_get_root_info;
iface->create_folder = gtk_file_system_unix_create_folder;
iface->get_parent = gtk_file_system_unix_get_parent;
iface->make_uri = gtk_file_system_unix_make_uri;
}
static void
gtk_file_system_unix_init (GtkFileSystemUnix *system_unix)
{
}
static void
gtk_file_system_unix_finalize (GObject *object)
{
}
static GSList *
gtk_file_system_unix_list_roots (GtkFileSystem *file_system)
{
return g_slist_append (NULL, g_strdup ("file:///"));
}
static GtkFileInfo *
gtk_file_system_unix_get_root_info (GtkFileSystem *file_system,
const gchar *uri,
GtkFileInfoType types,
GError **error)
{
g_return_val_if_fail (strcmp (uri, "file:///") == 0, NULL);
return filename_get_info ("/", types, error);
}
static GtkFileFolder *
gtk_file_system_unix_get_folder (GtkFileSystem *file_system,
const gchar *uri,
GtkFileInfoType types,
GError **error)
{
GtkFileFolderUnix *folder_unix;
gchar *filename;
filename = filename_from_uri (uri, error);
if (!filename)
return NULL;
folder_unix = g_object_new (GTK_TYPE_FILE_FOLDER_UNIX, NULL);
folder_unix->filename = filename;
folder_unix->types = types;
return GTK_FILE_FOLDER (folder_unix);
}
static gboolean
gtk_file_system_unix_create_folder (GtkFileSystem *file_system,
const gchar *uri,
GError **error)
{
gchar *filename;
gboolean result;
filename = filename_from_uri (uri, error);
if (!filename)
return FALSE;
result = mkdir (filename, 0777) != 0;
if (!result)
{
gchar *filename_utf8 = g_filename_to_utf8 (filename, -1, NULL, NULL, NULL);
g_set_error (error,
GTK_FILE_SYSTEM_ERROR,
GTK_FILE_SYSTEM_ERROR_NONEXISTANT,
"error creating directory '%s': %s",
filename_utf8 ? filename_utf8 : "???",
g_strerror (errno));
g_free (filename_utf8);
}
g_free (filename);
return result;
}
static gboolean
gtk_file_system_unix_get_parent (GtkFileSystem *file_system,
const gchar *uri,
gchar **parent,
GError **error)
{
gchar *filename = filename_from_uri (uri, error);
if (!filename)
return FALSE;
if (filename_is_root (filename))
{
*parent = NULL;
}
else
{
gchar *parent_filename = g_path_get_dirname (filename);
*parent = filename_to_uri (parent_filename);
g_free (parent_filename);
}
g_free (filename);
return TRUE;
}
static gchar *
gtk_file_system_unix_make_uri (GtkFileSystem *file_system,
const gchar *base_uri,
const gchar *display_name,
GError **error)
{
gchar *base_filename;
gchar *filename;
gchar *full_filename;
GError *tmp_error = NULL;
gchar *result;
base_filename = filename_from_uri (base_uri, error);
if (!base_filename)
return FALSE;
filename = g_filename_from_utf8 (display_name, -1, NULL, NULL, &tmp_error);
if (!filename)
{
g_set_error (error,
GTK_FILE_SYSTEM_ERROR,
GTK_FILE_SYSTEM_ERROR_BAD_FILENAME,
"%s",
tmp_error->message);
g_error_free (tmp_error);
g_free (base_filename);
return FALSE;
}
full_filename = g_build_filename (base_filename, filename, NULL);
result = filename_to_uri (full_filename);
g_free (base_filename);
g_free (filename);
g_free (full_filename);
return result;
}
/*
* GtkFileFolderUnix
*/
static GType
gtk_file_folder_unix_get_type (void)
{
static GType file_folder_unix_type = 0;
if (!file_folder_unix_type)
{
static const GTypeInfo file_folder_unix_info =
{
sizeof (GtkFileFolderUnixClass),
NULL, /* base_init */
NULL, /* base_finalize */
(GClassInitFunc) gtk_file_folder_unix_class_init,
NULL, /* class_finalize */
NULL, /* class_data */
sizeof (GtkFileFolderUnix),
0, /* n_preallocs */
(GInstanceInitFunc) gtk_file_folder_unix_init,
};
static const GInterfaceInfo file_folder_info =
{
(GInterfaceInitFunc) gtk_file_folder_unix_iface_init, /* interface_init */
NULL, /* interface_finalize */
NULL /* interface_data */
};
file_folder_unix_type = g_type_register_static (G_TYPE_OBJECT,
"GtkFileFolderUnix",
&file_folder_unix_info, 0);
g_type_add_interface_static (file_folder_unix_type,
GTK_TYPE_FILE_FOLDER,
&file_folder_info);
}
return file_folder_unix_type;
}
static void
gtk_file_folder_unix_class_init (GtkFileFolderUnixClass *class)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (class);
gobject_class->finalize = gtk_file_folder_unix_finalize;
}
static void
gtk_file_folder_unix_iface_init (GtkFileFolderIface *iface)
{
iface->get_info = gtk_file_folder_unix_get_info;
iface->list_children = gtk_file_folder_unix_list_children;
}
static void
gtk_file_folder_unix_init (GtkFileFolderUnix *impl)
{
}
static void
gtk_file_folder_unix_finalize (GObject *object)
{
GtkFileFolderUnix *folder_unix = GTK_FILE_FOLDER_UNIX (object);
g_free (folder_unix->filename);
}
static GtkFileInfo *
gtk_file_folder_unix_get_info (GtkFileFolder *folder,
const gchar *uri,
GError **error)
{
GtkFileFolderUnix *folder_unix = GTK_FILE_FOLDER_UNIX (folder);
GtkFileInfo *info;
gchar *dirname;
gchar *filename;
filename = filename_from_uri (uri, error);
if (!filename)
return NULL;
dirname = g_path_get_dirname (filename);
g_return_val_if_fail (strcmp (dirname, folder_unix->filename) == 0, NULL);
g_free (dirname);
info = filename_get_info (filename, folder_unix->types, error);
g_free (filename);
return info;
}
static gboolean
gtk_file_folder_unix_list_children (GtkFileFolder *folder,
GSList **children,
GError **error)
{
GtkFileFolderUnix *folder_unix = GTK_FILE_FOLDER_UNIX (folder);
GError *tmp_error = NULL;
GDir *dir;
*children = NULL;
dir = g_dir_open (folder_unix->filename, 0, &tmp_error);
if (!dir)
{
g_set_error (error,
GTK_FILE_SYSTEM_ERROR,
GTK_FILE_SYSTEM_ERROR_NONEXISTANT,
"%s",
tmp_error->message);
g_error_free (tmp_error);
return FALSE;
}
while (TRUE)
{
const gchar *filename = g_dir_read_name (dir);
gchar *fullname;
if (!filename)
break;
fullname = g_build_filename (folder_unix->filename, filename, NULL);
*children = g_slist_prepend (*children, filename_to_uri (fullname));
g_free (fullname);
}
g_dir_close (dir);
*children = g_slist_reverse (*children);
return TRUE;
}
static GtkFileInfo *
filename_get_info (const gchar *filename,
GtkFileInfoType types,
GError **error)
{
GtkFileInfo *info;
struct stat statbuf;
/* If stat fails, try to fall back to lstat to catch broken links
*/
if (stat (filename, &statbuf) != 0 &&
lstat (filename, &statbuf) != 0)
{
gchar *filename_utf8 = g_filename_to_utf8 (filename, -1, NULL, NULL, NULL);
g_set_error (error,
GTK_FILE_SYSTEM_ERROR,
GTK_FILE_SYSTEM_ERROR_NONEXISTANT,
"error getting information for '%s': %s",
filename_utf8 ? filename_utf8 : "???",
g_strerror (errno));
g_free (filename_utf8);
return NULL;
}
info = gtk_file_info_new ();
if (filename_is_root (filename))
{
if (types & GTK_FILE_INFO_DISPLAY_NAME)
gtk_file_info_set_display_name (info, "/");
if (types & GTK_FILE_INFO_IS_HIDDEN)
gtk_file_info_set_is_hidden (info, FALSE);
}
else
{
gchar *basename = g_path_get_basename (filename);
if (types & GTK_FILE_INFO_DISPLAY_NAME)
{
gchar *display_name = g_filename_to_utf8 (basename, -1, NULL, NULL, NULL);
if (!display_name)
display_name = g_strescape (basename, NULL);
gtk_file_info_set_display_name (info, display_name);
g_free (display_name);
}
if (types & GTK_FILE_INFO_IS_HIDDEN)
{
gtk_file_info_set_is_hidden (info, basename[0] == '.');
}
g_free (basename);
}
if (types & GTK_FILE_INFO_IS_FOLDER)
{
gtk_file_info_set_is_folder (info, S_ISDIR (statbuf.st_mode));
}
if (types & GTK_FILE_INFO_MIME_TYPE)
{
gtk_file_info_set_mime_type (info, "application/octet-stream");
}
if (types & GTK_FILE_INFO_MODIFICATION_TIME)
{
gtk_file_info_set_modification_time (info, statbuf.st_mtime);
}
if (types & GTK_FILE_INFO_SIZE)
{
gtk_file_info_set_size (info, (gint64)512 * (gint16)statbuf.st_blocks);
}
if (types & GTK_FILE_INFO_ICON)
{
/* NOT YET IMPLEMENTED */
}
return info;
}
static gchar *
filename_from_uri (const char *uri,
GError **error)
{
GError *tmp_error = NULL;
gchar *result;
result = g_filename_from_uri (uri, NULL, &tmp_error);
if (!result)
{
g_set_error (error,
GTK_FILE_SYSTEM_ERROR,
GTK_FILE_SYSTEM_ERROR_INVALID_URI,
"%s",
tmp_error->message);
g_error_free (tmp_error);
}
return result;
}
static gchar *
filename_to_uri (const char *filename)
{
gchar *result;
result = g_filename_to_uri (filename, NULL, NULL);
if (!result)
g_warning ("GtkFileSystemUnix: Handling of non-UTF-8-representable-filenames needs to be fixed");
return result;
}
static gboolean
filename_is_root (const char *filename)
{
const gchar *after_root;
after_root = g_path_skip_root (filename);
return (*after_root == '\0');
}

38
gtk/gtkfilesystemunix.h Normal file
View File

@ -0,0 +1,38 @@
/* GTK - The GIMP Toolkit
* gtkfilesystemunix.h: Default implementation of GtkFileSystem for UNIX-like systems
* Copyright (C) 2003, Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef __GTK_FILE_SYSTEM_UNIX_H__
#define __GTK_FILE_SYSTEM_UNIX_H__
#include <glib-object.h>
G_BEGIN_DECLS
#define GTK_TYPE_FILE_SYSTEM_UNIX (_gtk_file_system_unix_get_type ())
#define GTK_FILE_SYSTEM_UNIX(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_FILE_SYSTEM_UNIX, GtkFileSystemUnix))
#define GTK_IS_FILE_SYSTEM_UNIX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_FILE_SYSTEM_UNIX))
typedef struct _GtkFileSystemUnix GtkFileSystemUnix;
GType _gtk_file_system_unix_get_type (void);
G_END_DECLS
#endif /* __GTK_FILE_SYSTEM_UNIX_H__ */

79
tests/testfilechooser.c Normal file
View File

@ -0,0 +1,79 @@
#include <gtk/gtk.h>
#include "gtkfilechooserdialog.h"
#include "gtkfilechooser.h"
#include "prop-editor.h"
static void
print_current_folder (GtkFileChooser *chooser)
{
gchar *uri;
uri = gtk_file_chooser_get_current_folder_uri (chooser);
g_print ("Current folder changed :\n %s\n", uri);
g_free (uri);
}
static void
print_selected (GtkFileChooser *chooser)
{
GSList *uris = gtk_file_chooser_get_uris (chooser);
GSList *tmp_list;
g_print ("Selection changed :\n");
for (tmp_list = uris; tmp_list; tmp_list = tmp_list->next)
{
gchar *uri = tmp_list->data;
g_print (" %s\n", uri);
g_free (uri);
}
g_print ("\n");
g_slist_free (uris);
}
int
main (int argc, char **argv)
{
GtkWidget *control_window;
GtkWidget *vbbox;
GtkWidget *button;
GtkWidget *dialog;
GtkWidget *prop_editor;
gtk_init (&argc, &argv);
dialog = gtk_file_chooser_dialog_new ("Select a file", NULL,
GTK_FILE_CHOOSER_ACTION_OPEN,
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
GTK_STOCK_OPEN, GTK_RESPONSE_OK,
NULL);
g_signal_connect (dialog, "selection_changed",
G_CALLBACK (print_selected), NULL);
g_signal_connect (dialog, "current_folder_changed",
G_CALLBACK (print_current_folder), NULL);
gtk_window_set_default_size (GTK_WINDOW (dialog), 600, 400);
gtk_widget_show (dialog);
prop_editor = create_prop_editor (G_OBJECT (dialog), GTK_TYPE_FILE_CHOOSER);
control_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
vbbox = gtk_vbutton_box_new ();
gtk_container_add (GTK_CONTAINER (control_window), vbbox);
button = gtk_button_new_with_mnemonic ("_Select all");
gtk_container_add (GTK_CONTAINER (vbbox), button);
g_signal_connect_swapped (button, "clicked",
G_CALLBACK (gtk_file_chooser_select_all), dialog);
button = gtk_button_new_with_mnemonic ("_Unselect all");
gtk_container_add (GTK_CONTAINER (vbbox), button);
g_signal_connect_swapped (button, "clicked",
G_CALLBACK (gtk_file_chooser_unselect_all), dialog);
gtk_widget_show_all (control_window);
gtk_main ();
return 0;
}