[gthumb] fixed renaming of folders and catalogs
- From: Paolo Bacchilega <paobac src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gthumb] fixed renaming of folders and catalogs
- Date: Sun, 11 Dec 2011 14:43:58 +0000 (UTC)
commit 2d72f2ffccea65461c871a5e6645b95f03a27164
Author: Paolo Bacchilega <paobac src gnome org>
Date: Sun Dec 11 15:43:25 2011 +0100
fixed renaming of folders and catalogs
extensions/catalogs/callbacks.c | 4 +-
extensions/catalogs/dlg-catalog-properties.c | 9 +--
extensions/catalogs/gth-file-source-catalogs.c | 88 +++++++++++++++++
extensions/file_manager/callbacks.c | 5 -
gthumb/glib-utils.c | 7 ++
gthumb/glib-utils.h | 1 +
gthumb/gth-browser.c | 25 +-----
gthumb/gth-file-source.c | 36 +++++--
gthumb/gth-file-source.h | 4 +-
gthumb/gth-folder-tree.c | 121 ++++++++++++++++--------
gthumb/gth-source-tree.c | 23 +-----
11 files changed, 215 insertions(+), 108 deletions(-)
---
diff --git a/extensions/catalogs/callbacks.c b/extensions/catalogs/callbacks.c
index 3cedf18..0ed805a 100644
--- a/extensions/catalogs/callbacks.c
+++ b/extensions/catalogs/callbacks.c
@@ -611,7 +611,9 @@ catalogs__gth_browser_folder_tree_popup_before_cb (GthBrowser *browser,
g_object_set (action, "sensitive", sensitive, NULL);
action = gtk_action_group_get_action (data->actions, "Catalog_Rename");
- sensitive = (folder != NULL) && _g_content_type_is_a (g_file_info_get_content_type (folder->info), "gthumb/library") && g_file_info_get_attribute_boolean (folder->info, G_FILE_ATTRIBUTE_ACCESS_CAN_RENAME);
+ sensitive = ((folder != NULL)
+ && (_g_content_type_is_a (g_file_info_get_content_type (folder->info), "gthumb/library") || _g_content_type_is_a (g_file_info_get_content_type (folder->info), "gthumb/catalog"))
+ && g_file_info_get_attribute_boolean (folder->info, G_FILE_ATTRIBUTE_ACCESS_CAN_RENAME));
g_object_set (action, "sensitive", sensitive, NULL);
action = gtk_action_group_get_action (data->actions, "Catalog_Properties");
diff --git a/extensions/catalogs/dlg-catalog-properties.c b/extensions/catalogs/dlg-catalog-properties.c
index 61a4c68..a8d3659 100644
--- a/extensions/catalogs/dlg-catalog-properties.c
+++ b/extensions/catalogs/dlg-catalog-properties.c
@@ -83,13 +83,6 @@ catalog_saved_cb (void **buffer,
}
-static char *
-clear_name_for_file (const char *display_name)
-{
- return _g_utf8_replace (display_name, "/", "_");
-}
-
-
static void
save_button_clicked_cb (GtkButton *button,
DialogData *data)
@@ -108,7 +101,7 @@ save_button_clicked_cb (GtkButton *button,
parent = g_file_get_parent (data->original_file);
uri = g_file_get_uri (data->original_file);
- clean_name = clear_name_for_file (gtk_entry_get_text (GTK_ENTRY (GET_WIDGET ("name_entry"))));
+ clean_name = _g_filename_clear_for_file (gtk_entry_get_text (GTK_ENTRY (GET_WIDGET ("name_entry"))));
display_name = g_strconcat (clean_name, _g_uri_get_file_extension (uri), NULL);
new_file = g_file_get_child_for_display_name (parent, display_name, NULL);
if ((new_file != NULL) && ! g_file_equal (new_file, data->original_file))
diff --git a/extensions/catalogs/gth-file-source-catalogs.c b/extensions/catalogs/gth-file-source-catalogs.c
index 23fa95d..3db9721 100644
--- a/extensions/catalogs/gth-file-source-catalogs.c
+++ b/extensions/catalogs/gth-file-source-catalogs.c
@@ -410,6 +410,93 @@ gth_file_source_catalogs_read_metadata (GthFileSource *file_source,
}
+static void
+gth_file_source_catalogs_rename (GthFileSource *file_source,
+ GFile *file,
+ const char *edit_name,
+ ReadyCallback callback,
+ gpointer data)
+{
+ GFile *parent;
+ GFile *new_file;
+ GthCatalog *catalog;
+ GError *error = NULL;
+
+ parent = g_file_get_parent (file);
+
+ catalog = gth_catalog_load_from_file (file);
+ if (catalog != NULL) {
+ char *uri;
+ char *clean_name;
+ char *name;
+ GFile *gio_new_file;
+ char *data;
+ gsize size;
+
+ uri = g_file_get_uri (file);
+ clean_name = _g_filename_clear_for_file (edit_name);
+ name = g_strconcat (clean_name, _g_uri_get_file_extension (uri), NULL);
+ new_file = g_file_get_child_for_display_name (parent, name, &error);
+ gth_catalog_set_file (catalog, new_file);
+ gth_catalog_set_name (catalog, edit_name);
+
+ gio_new_file = gth_catalog_file_to_gio_file (new_file);
+ data = gth_catalog_to_data (catalog, &size);
+ if (g_write_file (gio_new_file,
+ FALSE,
+ G_FILE_CREATE_NONE,
+ data,
+ size,
+ gth_file_source_get_cancellable (file_source),
+ &error))
+ {
+ GFile *gio_old_file;
+
+ gio_old_file = gth_catalog_file_to_gio_file (file);
+ if (g_file_delete (gio_old_file, gth_file_source_get_cancellable (file_source), &error))
+ gth_monitor_file_renamed (gth_main_get_default_monitor (), file, new_file);
+
+ g_object_unref (gio_old_file);
+ }
+
+ g_free (data);
+ g_object_unref (gio_new_file);
+ g_free (clean_name);
+ g_free (name);
+ g_free (uri);
+ }
+ else {
+ new_file = g_file_get_child_for_display_name (parent, edit_name, &error);
+ if (new_file != NULL) {
+ GFile *gio_file;
+ GFile *gio_new_file;
+
+ gio_file = gth_file_source_to_gio_file (file_source, file);
+ gio_new_file = gth_file_source_to_gio_file (file_source, new_file);
+
+ if (g_file_move (gio_file,
+ gio_new_file,
+ 0,
+ gth_file_source_get_cancellable (file_source),
+ NULL,
+ NULL,
+ &error))
+ {
+ gth_monitor_file_renamed (gth_main_get_default_monitor (), file, new_file);
+ }
+
+ g_object_unref (gio_new_file);
+ g_object_unref (gio_file);
+ }
+ }
+
+ object_ready_with_error (file_source, callback, data, error);
+
+ _g_object_unref (new_file);
+ g_object_unref (catalog);
+}
+
+
/* -- gth_file_source_catalogs_for_each_child -- */
@@ -1436,6 +1523,7 @@ gth_file_source_catalogs_class_init (GthFileSourceCatalogsClass *class)
file_source_class->get_file_data = gth_file_source_catalogs_get_file_data;
file_source_class->write_metadata = gth_file_source_catalogs_write_metadata;
file_source_class->read_metadata = gth_file_source_catalogs_read_metadata;
+ file_source_class->rename = gth_file_source_catalogs_rename;
file_source_class->for_each_child = gth_file_source_catalogs_for_each_child;
file_source_class->copy = gth_file_source_catalogs_copy;
file_source_class->can_cut = gth_file_source_catalogs_can_cut;
diff --git a/extensions/file_manager/callbacks.c b/extensions/file_manager/callbacks.c
index cff6008..4de61d6 100644
--- a/extensions/file_manager/callbacks.c
+++ b/extensions/file_manager/callbacks.c
@@ -804,11 +804,6 @@ fm__gth_browser_folder_tree_popup_before_cb (GthBrowser *browser,
g_error_free (error);
}
}
- set_action_sensitive (data, "Folder_Create", (folder != NULL) && g_file_info_get_attribute_boolean (folder->info, G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE));
- set_action_sensitive (data, "Folder_Rename", (folder != NULL) && g_file_info_get_attribute_boolean (folder->info, G_FILE_ATTRIBUTE_ACCESS_CAN_RENAME));
- set_action_sensitive (data, "Folder_Delete", (folder != NULL) && g_file_info_get_attribute_boolean (folder->info, G_FILE_ATTRIBUTE_ACCESS_CAN_DELETE));
- set_action_sensitive (data, "Folder_Trash", (folder != NULL) && g_file_info_get_attribute_boolean (folder->info, G_FILE_ATTRIBUTE_ACCESS_CAN_TRASH));
- set_action_sensitive (data, "Folder_Cut", (folder != NULL) && g_file_info_get_attribute_boolean (folder->info, G_FILE_ATTRIBUTE_ACCESS_CAN_DELETE));
fm__gth_browser_update_sensitivity_cb (browser);
}
diff --git a/gthumb/glib-utils.c b/gthumb/glib-utils.c
index 4bc3a58..cf0536f 100644
--- a/gthumb/glib-utils.c
+++ b/gthumb/glib-utils.c
@@ -1867,6 +1867,13 @@ _g_uri_get_relative_path (const char *uri,
}
+char *
+_g_filename_clear_for_file (const char *display_name)
+{
+ return _g_utf8_replace (display_name, "/", "_");
+}
+
+
/* GIO utils */
diff --git a/gthumb/glib-utils.h b/gthumb/glib-utils.h
index c24cd02..799a339 100644
--- a/gthumb/glib-utils.h
+++ b/gthumb/glib-utils.h
@@ -242,6 +242,7 @@ const char * _g_uri_remove_host (const char *uri);
char * _g_uri_get_host (const char *uri);
char * _g_uri_get_relative_path (const char *uri,
const char *base);
+char * _g_filename_clear_for_file (const char *display_name);
/* GIO utils */
diff --git a/gthumb/gth-browser.c b/gthumb/gth-browser.c
index 31453a7..707f729 100644
--- a/gthumb/gth-browser.c
+++ b/gthumb/gth-browser.c
@@ -2825,29 +2825,10 @@ folder_tree_rename_cb (GthFolderTree *folder_tree,
const char *new_name,
GthBrowser *browser)
{
- GFile *parent;
- char *uri;
- GFile *new_file;
- GError *error = NULL;
-
- parent = g_file_get_parent (file);
- uri = g_file_get_uri (file);
- new_file = g_file_get_child_for_display_name (parent, new_name, &error);
-
- if (new_file == NULL) {
- _gtk_error_dialog_from_gerror_show (GTK_WINDOW (browser), _("Could not change name"), error);
- g_clear_error (&error);
- }
- else {
- GthFileSource *file_source;
-
- file_source = gth_main_get_file_source (file);
- gth_file_source_rename (file_source, file, new_file, file_source_rename_ready_cb, browser);
- }
+ GthFileSource *file_source;
- g_object_unref (new_file);
- g_free (uri);
- g_object_unref (parent);
+ file_source = gth_main_get_file_source (file);
+ gth_file_source_rename (file_source, file, new_name, file_source_rename_ready_cb, browser);
}
diff --git a/gthumb/gth-file-source.c b/gthumb/gth-file-source.c
index a379862..49899a5 100644
--- a/gthumb/gth-file-source.c
+++ b/gthumb/gth-file-source.c
@@ -77,7 +77,7 @@ typedef struct {
typedef struct {
GFile *file;
- GFile *new_file;
+ char *edit_name;
ReadyCallback callback;
gpointer data;
} RenameData;
@@ -188,7 +188,7 @@ file_source_async_op_free (FileSourceAsyncOp *async_op)
break;
case FILE_SOURCE_OP_RENAME:
g_object_unref (async_op->data.rename.file);
- g_object_unref (async_op->data.rename.new_file);
+ g_free (async_op->data.rename.edit_name);
break;
case FILE_SOURCE_OP_COPY:
g_object_unref (async_op->data.copy.destination);
@@ -325,7 +325,7 @@ gth_file_source_queue_read_attributes (GthFileSource *file_source,
static void
gth_file_source_queue_rename (GthFileSource *file_source,
GFile *file,
- GFile *new_file,
+ const char *edit_name,
ReadyCallback callback,
gpointer data)
{
@@ -335,7 +335,7 @@ gth_file_source_queue_rename (GthFileSource *file_source,
async_op->file_source = file_source;
async_op->op = FILE_SOURCE_OP_RENAME;
async_op->data.rename.file = g_file_dup (file);
- async_op->data.rename.new_file = g_file_dup (new_file);
+ async_op->data.rename.edit_name = g_strdup (edit_name);
async_op->data.rename.callback = callback;
async_op->data.rename.data = data;
@@ -494,7 +494,7 @@ gth_file_source_exec_next_in_queue (GthFileSource *file_source)
case FILE_SOURCE_OP_RENAME:
gth_file_source_rename (file_source,
async_op->data.rename.file,
- async_op->data.rename.new_file,
+ async_op->data.rename.edit_name,
async_op->data.rename.callback,
async_op->data.rename.data);
break;
@@ -753,18 +753,34 @@ base_read_metadata (GthFileSource *file_source,
static void
base_rename (GthFileSource *file_source,
GFile *file,
- GFile *new_file,
+ const char *edit_name,
ReadyCallback callback,
gpointer data)
{
+ GFile *parent;
+ GFile *new_file;
GFile *source;
GFile *destination;
GError *error = NULL;
+ parent = g_file_get_parent (file);
+ new_file = g_file_get_child_for_display_name (parent, edit_name, &error);
+ if (new_file == NULL) {
+ object_ready_with_error (file_source, callback, data, error);
+ return;
+ }
+
source = gth_file_source_to_gio_file (file_source, file);
destination = gth_file_source_to_gio_file (file_source, new_file);
- if (g_file_move (source, destination, 0, NULL, NULL, NULL, &error)) {
+ if (g_file_move (source,
+ destination,
+ 0,
+ gth_file_source_get_cancellable (file_source),
+ NULL,
+ NULL,
+ &error))
+ {
GthMonitor *monitor;
monitor = gth_main_get_default_monitor ();
@@ -1231,16 +1247,16 @@ gth_file_source_read_attributes (GthFileSource *file_source,
void
gth_file_source_rename (GthFileSource *file_source,
GFile *file,
- GFile *new_file,
+ const char *edit_name,
ReadyCallback ready_callback,
gpointer data)
{
if (gth_file_source_is_active (file_source)) {
- gth_file_source_queue_rename (file_source, file, new_file, ready_callback, data);
+ gth_file_source_queue_rename (file_source, file, edit_name, ready_callback, data);
return;
}
g_cancellable_reset (file_source->priv->cancellable);
- GTH_FILE_SOURCE_GET_CLASS (G_OBJECT (file_source))->rename (file_source, file, new_file, ready_callback, data);
+ GTH_FILE_SOURCE_GET_CLASS (G_OBJECT (file_source))->rename (file_source, file, edit_name, ready_callback, data);
}
diff --git a/gthumb/gth-file-source.h b/gthumb/gth-file-source.h
index 504c00e..9f9ffc9 100644
--- a/gthumb/gth-file-source.h
+++ b/gthumb/gth-file-source.h
@@ -101,7 +101,7 @@ struct _GthFileSourceClass
gpointer data);
void (*rename) (GthFileSource *file_source,
GFile *file,
- GFile *new_file,
+ const char *edit_name,
ReadyCallback callback,
gpointer data);
void (*copy) (GthFileSource *file_source,
@@ -189,7 +189,7 @@ void gth_file_source_read_attributes (GthFileSource *file
gpointer data);
void gth_file_source_rename (GthFileSource *file_source,
GFile *file,
- GFile *new_file,
+ const char *edit_name,
ReadyCallback ready_callback,
gpointer data);
void gth_file_source_copy (GthFileSource *file_source,
diff --git a/gthumb/gth-folder-tree.c b/gthumb/gth-folder-tree.c
index 0747f06..1f0caf4 100644
--- a/gthumb/gth-folder-tree.c
+++ b/gthumb/gth-folder-tree.c
@@ -211,6 +211,10 @@ text_renderer_edited_cb (GtkCellRendererText *renderer,
GthFileData *file_data;
char *name;
+ g_object_set (folder_tree->priv->text_renderer,
+ "editable", FALSE,
+ NULL);
+
tree_path = gtk_tree_path_new_from_string (path);
if (! gtk_tree_model_get_iter (GTK_TREE_MODEL (folder_tree->priv->tree_store),
&iter,
@@ -237,6 +241,49 @@ text_renderer_edited_cb (GtkCellRendererText *renderer,
static void
+text_renderer_editing_started_cb (GtkCellRenderer *cell,
+ GtkCellEditable *editable,
+ const char *path,
+ gpointer user_data)
+{
+ GthFolderTree *folder_tree = user_data;
+ GtkTreePath *tree_path;
+ GtkTreeIter iter;
+ GthFileData *file_data;
+
+ tree_path = gtk_tree_path_new_from_string (path);
+ if (! gtk_tree_model_get_iter (GTK_TREE_MODEL (folder_tree->priv->tree_store),
+ &iter,
+ tree_path))
+ {
+ gtk_tree_path_free (tree_path);
+ return;
+ }
+ gtk_tree_path_free (tree_path);
+
+ gtk_tree_model_get (GTK_TREE_MODEL (folder_tree->priv->tree_store),
+ &iter,
+ COLUMN_FILE_DATA, &file_data,
+ -1);
+
+ if (GTK_IS_ENTRY (editable))
+ gtk_entry_set_text (GTK_ENTRY (editable), g_file_info_get_edit_name (file_data->info));
+}
+
+
+static void
+text_renderer_editing_canceled_cb (GtkCellRenderer *renderer,
+ gpointer user_data)
+{
+ GthFolderTree *folder_tree = user_data;
+
+ g_object_set (folder_tree->priv->text_renderer,
+ "editable", FALSE,
+ NULL);
+}
+
+
+static void
add_columns (GthFolderTree *folder_tree,
GtkTreeView *treeview)
{
@@ -252,14 +299,21 @@ add_columns (GthFolderTree *folder_tree,
NULL);
folder_tree->priv->text_renderer = renderer = gtk_cell_renderer_text_new ();
- g_object_set (G_OBJECT (renderer),
+ g_object_set (renderer,
"ellipsize", PANGO_ELLIPSIZE_END,
- "editable", TRUE,
NULL);
g_signal_connect (folder_tree->priv->text_renderer,
"edited",
G_CALLBACK (text_renderer_edited_cb),
folder_tree);
+ g_signal_connect (folder_tree->priv->text_renderer,
+ "editing-started",
+ G_CALLBACK (text_renderer_editing_started_cb),
+ folder_tree);
+ g_signal_connect (folder_tree->priv->text_renderer,
+ "editing-canceled",
+ G_CALLBACK (text_renderer_editing_canceled_cb),
+ folder_tree);
gtk_tree_view_column_pack_start (column, renderer, TRUE);
gtk_tree_view_column_set_attributes (column, renderer,
@@ -452,12 +506,6 @@ button_press_cb (GtkWidget *widget,
_g_object_unref (file_data);
}
else if ((event->button == 1) && (event->type == GDK_BUTTON_PRESS)) {
- GtkTreeSelection *selection;
- int start_pos;
- int width;
- int expander_size;
- int horizontal_separator;
-
/* This can be the start of a dragging action. */
if (! (event->state & GDK_CONTROL_MASK)
@@ -468,27 +516,6 @@ button_press_cb (GtkWidget *widget,
folder_tree->priv->drag_start_x = event->x;
folder_tree->priv->drag_start_y = event->y;
}
-
- /**/
-
- if (! gtk_tree_view_column_cell_get_position (column,
- folder_tree->priv->text_renderer,
- &start_pos,
- &width))
- {
- start_pos = 0;
- width = 0;
- }
-
- gtk_style_context_get_style (gtk_widget_get_style_context (GTK_WIDGET (folder_tree)),
- "expander-size", &expander_size,
- "horizontal-separator", &horizontal_separator,
- NULL);
- start_pos += (gtk_tree_path_get_depth (path) - 1) * (expander_size + (horizontal_separator * 2));
-
- selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (folder_tree));
- if ((cell_x > start_pos) && gtk_tree_selection_iter_is_selected (selection, &iter))
- retval = TRUE;
}
else if ((event->button == 1) && (event->type == GDK_2BUTTON_PRESS)) {
if (! gtk_tree_view_row_expanded (GTK_TREE_VIEW (folder_tree), path))
@@ -605,9 +632,6 @@ selection_changed_cb (GtkTreeSelection *selection,
selected_path = gtk_tree_model_get_path (GTK_TREE_MODEL (folder_tree->priv->tree_store), &iter);
- /*if (! gtk_tree_view_row_expanded (GTK_TREE_VIEW (folder_tree), selected_path))
- gtk_tree_view_expand_row (GTK_TREE_VIEW (folder_tree), selected_path, FALSE);*/
-
gtk_tree_model_get (GTK_TREE_MODEL (folder_tree->priv->tree_store),
&iter,
COLUMN_TYPE, &entry_type,
@@ -1421,10 +1445,30 @@ gth_folder_tree_update_child (GthFolderTree *folder_tree,
GFile *old_file,
GthFileData *file_data)
{
- GtkTreeIter iter;
+ GtkTreeIter old_file_iter;
+ GtkTreeIter new_file_iter;
+
+ if (! gth_folder_tree_get_iter (folder_tree, old_file, &old_file_iter, NULL))
+ return;
+
+ if (gth_folder_tree_get_iter (folder_tree, file_data->file, &new_file_iter, NULL)) {
+ GFile *parent;
+ GList *files;
+
+ /* the new file is already present, remove the old file */
- if (gth_folder_tree_get_iter (folder_tree, old_file, &iter, NULL))
- _gth_folder_tree_set_file_data (folder_tree, &iter, file_data);
+ parent = g_file_get_parent (old_file);
+ files = g_list_prepend (NULL, g_object_ref (old_file));
+ gth_folder_tree_delete_children (folder_tree, parent, files);
+ _g_object_list_unref (files);
+ g_object_unref (parent);
+
+ /* update the data old of the new file */
+
+ _gth_folder_tree_set_file_data (folder_tree, &new_file_iter, file_data);
+ }
+ else
+ _gth_folder_tree_set_file_data (folder_tree, &old_file_iter, file_data);
}
@@ -1474,10 +1518,11 @@ gth_folder_tree_start_editing (GthFolderTree *folder_tree,
if (! gth_folder_tree_get_iter (folder_tree, file, &iter, NULL))
return;
+ g_object_set (folder_tree->priv->text_renderer,
+ "editable", TRUE,
+ NULL);
+
tree_path = gtk_tree_model_get_path (GTK_TREE_MODEL (folder_tree->priv->tree_store), &iter);
- gtk_tree_view_expand_to_path (GTK_TREE_VIEW (folder_tree), tree_path);
- gtk_tree_view_collapse_row (GTK_TREE_VIEW (folder_tree), tree_path);
- gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (folder_tree), tree_path, NULL, TRUE, 0.5, 0.0);
tree_column = gtk_tree_view_get_column (GTK_TREE_VIEW (folder_tree), 0);
gtk_tree_view_set_cursor (GTK_TREE_VIEW (folder_tree),
tree_path,
diff --git a/gthumb/gth-source-tree.c b/gthumb/gth-source-tree.c
index e4e63a6..6674a32 100644
--- a/gthumb/gth-source-tree.c
+++ b/gthumb/gth-source-tree.c
@@ -189,28 +189,7 @@ source_tree_rename_cb (GthFolderTree *folder_tree,
const char *new_name,
GthSourceTree *source_tree)
{
- GFile *parent;
- char *uri;
- char *new_basename;
- GFile *new_file;
- GError *error = NULL;
-
- parent = g_file_get_parent (file);
- uri = g_file_get_uri (file);
- new_basename = g_strconcat (new_name, _g_uri_get_file_extension (uri), NULL);
- new_file = g_file_get_child_for_display_name (parent, new_basename, &error);
-
- if (new_file == NULL) {
- _gtk_error_dialog_from_gerror_show (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (source_tree))), _("Could not change name"), error);
- g_clear_error (&error);
- }
- else
- gth_file_source_rename (source_tree->priv->file_source, file, new_file, file_source_rename_ready_cb, source_tree);
-
- g_object_unref (new_file);
- g_free (new_basename);
- g_free (uri);
- g_object_unref (parent);
+ gth_file_source_rename (source_tree->priv->file_source, file, new_name, file_source_rename_ready_cb, source_tree);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]