[gthumb] allow to change the current image from the edit metadata dialogs
- From: Paolo Bacchilega <paobac src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gthumb] allow to change the current image from the edit metadata dialogs
- Date: Sun, 16 Feb 2020 18:14:24 +0000 (UTC)
commit 26f987f34c7d44ef8d6baa8d3eca74f7ee77a0e8
Author: Paolo Bacchilega <paobac src gnome org>
Date: Sat Feb 1 18:03:13 2020 +0100
allow to change the current image from the edit metadata dialogs
data/ui/file-selection-info.ui | 94 +++++++++++++
extensions/catalogs/data/ui/add-to-catalog.ui | 9 +-
extensions/catalogs/dlg-add-to-catalog.c | 12 ++
extensions/edit_metadata/dlg-edit-metadata.c | 2 +
extensions/edit_metadata/gth-edit-comment-dialog.c | 25 ++--
extensions/edit_metadata/gth-edit-tags-dialog.c | 26 +---
gthumb/gth-file-selection-info.c | 146 +++++++++++++++++++++
gthumb/gth-file-selection-info.h | 57 ++++++++
gthumb/meson.build | 2 +
9 files changed, 332 insertions(+), 41 deletions(-)
---
diff --git a/data/ui/file-selection-info.ui b/data/ui/file-selection-info.ui
new file mode 100644
index 00000000..74199ac0
--- /dev/null
+++ b/data/ui/file-selection-info.ui
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkBox" id="content">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkSeparator">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">6</property>
+ <property name="margin_bottom">6</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkButton" id="prev_button">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes">Previous</property>
+ <child>
+ <object class="GtkImage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">go-previous-symbolic</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="info_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="wrap">True</property>
+ <property name="wrap_mode">word-char</property>
+ <property name="max_width_chars">30</property>
+ <property name="xalign">0.5</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="next_button">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes">Next</property>
+ <child>
+ <object class="GtkImage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">go-next-symbolic</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+</interface>
diff --git a/extensions/catalogs/data/ui/add-to-catalog.ui b/extensions/catalogs/data/ui/add-to-catalog.ui
index 16c38c66..e93be842 100644
--- a/extensions/catalogs/data/ui/add-to-catalog.ui
+++ b/extensions/catalogs/data/ui/add-to-catalog.ui
@@ -5,7 +5,6 @@
<object class="GtkBox" id="dialog_content">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="border_width">5</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
@@ -100,8 +99,8 @@
</packing>
</child>
<child>
- <object class="GtkCheckButton" id="keep_open_checkbutton">
- <property name="label" translatable="yes">_Keep the dialog open</property>
+ <object class="GtkCheckButton" id="view_destination_checkbutton">
+ <property name="label" translatable="yes">_View the destination</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
@@ -116,8 +115,8 @@
</packing>
</child>
<child>
- <object class="GtkCheckButton" id="view_destination_checkbutton">
- <property name="label" translatable="yes">_View the destination</property>
+ <object class="GtkCheckButton" id="keep_open_checkbutton">
+ <property name="label" translatable="yes">_Keep the dialog open</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
diff --git a/extensions/catalogs/dlg-add-to-catalog.c b/extensions/catalogs/dlg-add-to-catalog.c
index 8d31e57b..52405bed 100644
--- a/extensions/catalogs/dlg-add-to-catalog.c
+++ b/extensions/catalogs/dlg-add-to-catalog.c
@@ -86,6 +86,7 @@ typedef struct {
GtkBuilder *builder;
GtkWidget *dialog;
GtkWidget *source_tree;
+ GtkWidget *info;
AddData *add_data;
GthFileSource *catalog_source;
GthFileData *new_catalog;
@@ -266,6 +267,7 @@ update_sensitivity (DialogData *data)
{
GFile *selected_catalog;
GList *items;
+ GList *file_data_list;
gboolean can_add;
selected_catalog = get_selected_catalog (data);
@@ -274,6 +276,11 @@ update_sensitivity (DialogData *data)
gtk_dialog_set_response_sensitive (GTK_DIALOG (data->dialog), GTK_RESPONSE_OK, can_add);
gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (GET_WIDGET ("view_destination_checkbutton")),
gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("keep_open_checkbutton"))));
gtk_widget_set_sensitive (GET_WIDGET ("view_destination_checkbutton"), ! gtk_toggle_button_get_active
(GTK_TOGGLE_BUTTON (GET_WIDGET ("keep_open_checkbutton"))));
+
+ file_data_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (data->browser)),
items);
+ gth_file_selection_info_set_file_list (GTH_FILE_SELECTION_INFO (data->info), file_data_list);
+
+ _g_object_list_unref (file_data_list);
_gtk_tree_path_list_free (items);
_g_object_unref (selected_catalog);
}
@@ -679,6 +686,11 @@ dlg_add_to_catalog (GthBrowser *browser)
NULL);
gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area (GTK_DIALOG (data->dialog))),
GET_WIDGET ("dialog_content"));
+
+ data->info = gth_file_selection_info_new ();
+ gtk_widget_show (data->info);
+ gtk_box_pack_end (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (data->dialog))), data->info,
FALSE, FALSE, 0);
+
gtk_dialog_add_buttons (GTK_DIALOG (data->dialog),
_GTK_LABEL_CLOSE, GTK_RESPONSE_CANCEL,
_("_Add"), GTK_RESPONSE_OK,
diff --git a/extensions/edit_metadata/dlg-edit-metadata.c b/extensions/edit_metadata/dlg-edit-metadata.c
index 422b8503..7fca6587 100644
--- a/extensions/edit_metadata/dlg-edit-metadata.c
+++ b/extensions/edit_metadata/dlg-edit-metadata.c
@@ -271,6 +271,8 @@ update_file_list (gpointer user_data)
file_data_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (data->browser)),
items);
loader_data->files = gth_file_data_list_to_file_list (file_data_list);
+ gtk_dialog_set_response_sensitive (GTK_DIALOG (data->dialog), GTK_RESPONSE_OK, loader_data->files !=
NULL);
+
data->loader = gth_load_file_data_task_new (loader_data->files, "*");
g_signal_connect (data->loader,
"completed",
diff --git a/extensions/edit_metadata/gth-edit-comment-dialog.c
b/extensions/edit_metadata/gth-edit-comment-dialog.c
index 0d2f76f2..ceb4bd1b 100644
--- a/extensions/edit_metadata/gth-edit-comment-dialog.c
+++ b/extensions/edit_metadata/gth-edit-comment-dialog.c
@@ -29,6 +29,7 @@ struct _GthEditCommentDialogPrivate {
GtkWidget *notebook;
GtkWidget *save_changed_checkbutton;
GtkWidget *keep_open_check_button;
+ GtkWidget *info;
};
@@ -50,27 +51,14 @@ gth_edit_comment_dialog_set_file_list (GthEditMetadataDialog *base,
{
GthEditCommentDialog *self = GTH_EDIT_COMMENT_DIALOG (base);
int n_files;
- char *title;
GList *pages;
GList *scan;
- n_files = g_list_length (file_list);
-
- /* update the title */
-
- if (n_files == 1) {
- GthFileData *file_data = file_list->data;
-
- /* Translators: the %s symbol in the string is a file name */
- title = g_strdup_printf (_("%s Metadata"), g_file_info_get_display_name (file_data->info));
- }
- else
- title = g_strdup_printf (g_dngettext (NULL, "%d file", "%d files", n_files), n_files);
- gtk_window_set_title (GTK_WINDOW (self), title);
- g_free (title);
+ gth_file_selection_info_set_file_list (GTH_FILE_SELECTION_INFO (self->priv->info), file_list);
/* update the widgets */
+ n_files = g_list_length (file_list);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->priv->save_changed_checkbutton), n_files > 1);
gtk_widget_set_sensitive (self->priv->save_changed_checkbutton, n_files > 1);
@@ -146,15 +134,20 @@ gth_edit_comment_dialog_init (GthEditCommentDialog *self)
self->priv = gth_edit_comment_dialog_get_instance_private (self);
+ gtk_window_set_title (GTK_WINDOW (self), _("Comment"));
gtk_window_set_resizable (GTK_WINDOW (self), TRUE);
gtk_box_set_spacing (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (self))), 5);
gtk_container_set_border_width (GTK_CONTAINER (self), 5);
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
- gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
+ gtk_container_set_border_width (GTK_CONTAINER (vbox), 0);
gtk_widget_show (vbox);
gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (self))), vbox, TRUE, TRUE, 0);
+ self->priv->info = gth_file_selection_info_new ();
+ gtk_widget_show (self->priv->info);
+ gtk_box_pack_end (GTK_BOX (vbox), self->priv->info, FALSE, FALSE, 0);
+
self->priv->notebook = gtk_notebook_new ();
gtk_widget_show (self->priv->notebook);
gtk_box_pack_start (GTK_BOX (vbox), self->priv->notebook, TRUE, TRUE, 0);
diff --git a/extensions/edit_metadata/gth-edit-tags-dialog.c b/extensions/edit_metadata/gth-edit-tags-dialog.c
index a775d0e1..644f98ab 100644
--- a/extensions/edit_metadata/gth-edit-tags-dialog.c
+++ b/extensions/edit_metadata/gth-edit-tags-dialog.c
@@ -33,6 +33,7 @@ struct _GthEditTagsDialogPrivate {
GtkBuilder *builder;
GtkWidget *tags_entry;
GtkWidget *keep_open_check_button;
+ GtkWidget *info;
};
@@ -64,28 +65,12 @@ gth_edit_tags_dialog_set_file_list (GthEditMetadataDialog *base,
GList *file_list)
{
GthEditTagsDialog *self = GTH_EDIT_TAGS_DIALOG (base);
- int n_files;
- char *title;
GHashTable *common_tags;
GHashTable *no_common_tags;
GList *common_tags_list;
GList *no_common_tags_list;
- n_files = g_list_length (file_list);
-
- /* update the title */
-
- if (n_files == 1) {
- GthFileData *file_data = file_list->data;
-
- /* Translators: the %s symbol in the string is a file name */
- title = g_strdup_printf (_("%s Tags"), g_file_info_get_display_name (file_data->info));
- }
- else
- title = g_strdup_printf (g_dngettext (NULL, "%d file", "%d files", n_files), n_files);
- gtk_window_set_title (GTK_WINDOW (self), title);
-
- g_free (title);
+ gth_file_selection_info_set_file_list (GTH_FILE_SELECTION_INFO (self->priv->info), file_list);
/* update the tag entry */
@@ -197,7 +182,7 @@ gth_edit_tags_dialog_init (GthEditTagsDialog *self)
self->priv = gth_edit_tags_dialog_get_instance_private (self);
self->priv->builder = _gtk_builder_new_from_file ("tag-chooser.ui", "edit_metadata");
- gtk_window_set_title (GTK_WINDOW (self), _("Assign Tags"));
+ gtk_window_set_title (GTK_WINDOW (self), _("Tags"));
gtk_window_set_resizable (GTK_WINDOW (self), TRUE);
gtk_window_set_default_size (GTK_WINDOW (self), -1, 500);
gtk_box_set_spacing (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (self))), 5);
@@ -209,9 +194,10 @@ gth_edit_tags_dialog_init (GthEditTagsDialog *self)
gtk_widget_show (self->priv->tags_entry);
gtk_box_pack_start (GTK_BOX (GET_WIDGET ("tag_entry_box")), self->priv->tags_entry, TRUE, TRUE, 0);
- gtk_container_set_border_width (GTK_CONTAINER (GET_WIDGET ("content")), 5);
-
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
+ self->priv->info = gth_file_selection_info_new ();
+ gtk_widget_show (self->priv->info);
+ gtk_box_pack_end (GTK_BOX (box), self->priv->info, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (box), GET_WIDGET ("content"), TRUE, TRUE, 0);
self->priv->keep_open_check_button = gtk_check_button_new_with_mnemonic (_("_Keep the dialog open"));
gtk_widget_show (self->priv->keep_open_check_button);
diff --git a/gthumb/gth-file-selection-info.c b/gthumb/gth-file-selection-info.c
new file mode 100644
index 00000000..21033d73
--- /dev/null
+++ b/gthumb/gth-file-selection-info.c
@@ -0,0 +1,146 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * GThumb
+ *
+ * Copyright (C) 2020 Free Software Foundation, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+#include <glib/gi18n.h>
+#include "gth-file-selection-info.h"
+
+
+#define GET_WIDGET(name) _gtk_builder_get_widget (self->priv->builder, (name))
+
+
+struct _GthFileSelectionInfoPrivate {
+ GtkBuilder *builder;
+ GthBrowser *browser;
+};
+
+
+G_DEFINE_TYPE_WITH_CODE (GthFileSelectionInfo,
+ gth_file_selection_info,
+ GTK_TYPE_BOX,
+ G_ADD_PRIVATE (GthFileSelectionInfo))
+
+
+static void
+gth_file_selection_info_finalize (GObject *object)
+{
+ GthFileSelectionInfo *self;
+
+ self = GTH_FILE_SELECTION_INFO (object);
+ _g_object_unref (self->priv->builder);
+
+ G_OBJECT_CLASS (gth_file_selection_info_parent_class)->finalize (object);
+}
+
+
+static void
+gth_file_selection_info_class_init (GthFileSelectionInfoClass *klass)
+{
+ GObjectClass *object_class;
+
+ object_class = (GObjectClass*) klass;
+ object_class->finalize = gth_file_selection_info_finalize;
+}
+
+
+static GthBrowser *
+_get_browser (GthFileSelectionInfo *self)
+{
+ GtkWindow *dialog;
+
+ if (self->priv->browser != NULL)
+ return self->priv->browser;
+
+ dialog = _gtk_widget_get_toplevel_if_window (GTK_WIDGET (self));
+ if (dialog != NULL)
+ self->priv->browser = (GthBrowser *) gtk_window_get_transient_for (dialog);
+
+ return self->priv->browser;
+}
+
+
+static void
+next_button_clicked_cb (GtkButton *button,
+ gpointer user_data)
+{
+ GthFileSelectionInfo *self = user_data;
+
+ self->priv->browser = _get_browser (self);
+ if (self->priv->browser != NULL)
+ gth_browser_show_next_image (self->priv->browser, FALSE, FALSE);
+}
+
+
+static void
+prev_button_clicked_cb (GtkButton *button,
+ gpointer user_data)
+{
+ GthFileSelectionInfo *self = user_data;
+
+ self->priv->browser = _get_browser (self);
+ if (self->priv->browser != NULL)
+ gth_browser_show_prev_image (self->priv->browser, FALSE, FALSE);
+}
+
+
+static void
+gth_file_selection_info_init (GthFileSelectionInfo *self)
+{
+ self->priv = gth_file_selection_info_get_instance_private (self);
+ self->priv->builder = _gtk_builder_new_from_file ("file-selection-info.ui", NULL);
+ self->priv->browser = NULL;
+
+ gtk_box_pack_start (GTK_BOX (self), GET_WIDGET ("content"), TRUE, TRUE, 0);
+ g_signal_connect (GET_WIDGET ("next_button"), "clicked", G_CALLBACK (next_button_clicked_cb), self);
+ g_signal_connect (GET_WIDGET ("prev_button"), "clicked", G_CALLBACK (prev_button_clicked_cb), self);
+}
+
+
+GtkWidget *
+gth_file_selection_info_new (void)
+{
+ GthFileSelectionInfo *self;
+
+ self = g_object_new (GTH_TYPE_FILE_SELECTION_INFO, NULL);
+
+ return GTK_WIDGET (self);
+}
+
+
+void
+gth_file_selection_info_set_file_list (GthFileSelectionInfo *self,
+ GList *file_list)
+{
+ char *title;
+
+ if ((file_list != NULL) && (file_list->next == NULL)) {
+ GthFileData *file_data = file_list->data;
+ title = g_strdup (g_file_info_get_display_name (file_data->info));
+ }
+ else {
+ int n_files = g_list_length (file_list);
+ title = g_strdup_printf (g_dngettext (NULL, "%d file", "%d files", n_files), n_files);
+ }
+
+ gtk_label_set_label (GTK_LABEL (GET_WIDGET ("info_label")), title);
+
+ g_free (title);
+}
diff --git a/gthumb/gth-file-selection-info.h b/gthumb/gth-file-selection-info.h
new file mode 100644
index 00000000..457760ba
--- /dev/null
+++ b/gthumb/gth-file-selection-info.h
@@ -0,0 +1,57 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * GThumb
+ *
+ * Copyright (C) 2020 Free Software Foundation, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GTH_FILE_SELECTION_INFO_H
+#define GTH_FILE_SELECTION_INFO_H
+
+#include <gtk/gtk.h>
+#include <gthumb.h>
+
+G_BEGIN_DECLS
+
+#define GTH_TYPE_FILE_SELECTION_INFO (gth_file_selection_info_get_type ())
+#define GTH_FILE_SELECTION_INFO(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj),
GTH_TYPE_FILE_SELECTION_INFO, GthFileSelectionInfo))
+#define GTH_FILE_SELECTION_INFO_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass),
GTH_TYPE_FILE_SELECTION_INFO, GthFileSelectionInfoClass))
+#define GTH_IS_FILE_SELECTION_INFO(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj),
GTH_TYPE_FILE_SELECTION_INFO))
+#define GTH_IS_FILE_SELECTION_INFO_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),
GTH_TYPE_FILE_SELECTION_INFO))
+#define GTH_FILE_SELECTION_INFO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj),
GTH_TYPE_FILE_SELECTION_INFO, GthFileSelectionInfoClass))
+
+typedef struct _GthFileSelectionInfo GthFileSelectionInfo;
+typedef struct _GthFileSelectionInfoClass GthFileSelectionInfoClass;
+typedef struct _GthFileSelectionInfoPrivate GthFileSelectionInfoPrivate;
+
+struct _GthFileSelectionInfo {
+ GtkBox parent_instance;
+ GthFileSelectionInfoPrivate *priv;
+};
+
+struct _GthFileSelectionInfoClass {
+ GtkBoxClass parent_class;
+};
+
+GType gth_file_selection_info_get_type (void);
+GtkWidget * gth_file_selection_info_new (void);
+void gth_file_selection_info_set_file_list (GthFileSelectionInfo *self,
+ GList *file_list);
+
+G_END_DECLS
+
+#endif /* GTH_FILE_SELECTION_INFO_H */
diff --git a/gthumb/meson.build b/gthumb/meson.build
index ab25ccb0..ee44adc5 100644
--- a/gthumb/meson.build
+++ b/gthumb/meson.build
@@ -29,6 +29,7 @@ public_header_files = [
'gth-file-list.h',
'gth-file-properties.h',
'gth-file-selection.h',
+ 'gth-file-selection-info.h',
'gth-file-source.h',
'gth-file-source-vfs.h',
'gth-file-store.h',
@@ -192,6 +193,7 @@ source_files = files(
'gth-file-list.c',
'gth-file-properties.c',
'gth-file-selection.c',
+ 'gth-file-selection-info.c',
'gth-file-source.c',
'gth-file-source-vfs.c',
'gth-file-store.c',
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]