[gnome-builder/wip/plugins] devhelp: start extracting devhelp into a plugin
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder/wip/plugins] devhelp: start extracting devhelp into a plugin
- Date: Sun, 7 Jun 2015 23:26:56 +0000 (UTC)
commit 2bbbd228f18f6123daf27331d9955be1c5031423
Author: Christian Hergert <christian hergert me>
Date: Sun Jun 7 16:26:50 2015 -0700
devhelp: start extracting devhelp into a plugin
configure.ac | 1 +
plugins/Makefile.am | 1 +
plugins/devhelp/Makefile.am | 46 ++++++
{src => plugins}/devhelp/gb-devhelp-document.c | 0
{src => plugins}/devhelp/gb-devhelp-document.h | 0
plugins/devhelp/gb-devhelp-panel.c | 169 ++++++++++++++++++++
.../devhelp/gb-devhelp-panel.h | 19 +--
{src => plugins}/devhelp/gb-devhelp-view.c | 7 +-
{src => plugins}/devhelp/gb-devhelp-view.h | 0
{data/ui => plugins/devhelp}/gb-devhelp-view.ui | 0
plugins/devhelp/gb-devhelp.gresource.xml | 7 +
plugins/devhelp/gb-devhelp.plugin | 6 +
plugins/symbol-tree/Makefile.am | 6 +-
src/Makefile.am | 7 +-
src/gb-plugins.c | 61 ++++----
src/gb-plugins.h | 25 ++--
src/resources/gnome-builder.gresource.xml | 1 -
17 files changed, 287 insertions(+), 69 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 0b4fc18..4016725 100644
--- a/configure.ac
+++ b/configure.ac
@@ -379,6 +379,7 @@ AC_CONFIG_FILES([
plugins/Makefile
plugins/command-bar/Makefile
+ plugins/devhelp/Makefile
plugins/symbol-tree/Makefile
data/Makefile
diff --git a/plugins/Makefile.am b/plugins/Makefile.am
index d74a9bc..225ff3e 100644
--- a/plugins/Makefile.am
+++ b/plugins/Makefile.am
@@ -1,5 +1,6 @@
SUBDIRS = \
command-bar \
+ devhelp \
symbol-tree \
$(NULL)
diff --git a/plugins/devhelp/Makefile.am b/plugins/devhelp/Makefile.am
new file mode 100644
index 0000000..27b3718
--- /dev/null
+++ b/plugins/devhelp/Makefile.am
@@ -0,0 +1,46 @@
+DISTCLEANFILES =
+BUILT_SOURCES =
+CLEANFILES =
+EXTRA_DIST =
+
+noinst_LTLIBRARIES = libdevhelp.la
+
+libdevhelp_la_SOURCES = \
+ gb-devhelp-document.c \
+ gb-devhelp-document.h \
+ gb-devhelp-panel.c \
+ gb-devhelp-panel.h \
+ gb-devhelp-view.c \
+ gb-devhelp-view.h \
+ gb-devhelp-resources.c \
+ gb-devhelp-resources.h \
+ $(NULL)
+
+libdevhelp_la_CFLAGS = \
+ $(BUILDER_CFLAGS) \
+ -I$(top_srcdir)/src \
+ -I$(top_srcdir)/src/documents \
+ -I$(top_srcdir)/src/views \
+ -I$(top_srcdir)/src/util \
+ -I$(top_srcdir)/src/workbench \
+ -I$(top_srcdir)/src/workspace \
+ -I$(top_srcdir)/libide \
+ $(NULL)
+
+libdevhelp_la_LIBADD = \
+ $(BUILDER_LIBS) \
+ $(top_builddir)/libide/libide-1.0.la \
+ $(NULL)
+
+libdevhelp_la_LDFLAGS = \
+ -avoid-version \
+ -module \
+ $(NULL)
+
+glib_resources_c = gb-devhelp-resources.c
+glib_resources_h = gb-devhelp-resources.h
+glib_resources_xml = gb-devhelp.gresource.xml
+glib_resources_namespace = gb_devhelp
+include $(top_srcdir)/build/autotools/Makefile.am.gresources
+
+-include $(top_srcdir)/git.mk
diff --git a/src/devhelp/gb-devhelp-document.c b/plugins/devhelp/gb-devhelp-document.c
similarity index 100%
rename from src/devhelp/gb-devhelp-document.c
rename to plugins/devhelp/gb-devhelp-document.c
diff --git a/src/devhelp/gb-devhelp-document.h b/plugins/devhelp/gb-devhelp-document.h
similarity index 100%
rename from src/devhelp/gb-devhelp-document.h
rename to plugins/devhelp/gb-devhelp-document.h
diff --git a/plugins/devhelp/gb-devhelp-panel.c b/plugins/devhelp/gb-devhelp-panel.c
new file mode 100644
index 0000000..6652180
--- /dev/null
+++ b/plugins/devhelp/gb-devhelp-panel.c
@@ -0,0 +1,169 @@
+/* gb-devhelp-panel.c
+ *
+ * Copyright (C) 2015 Christian Hergert <christian hergert me>
+ *
+ * 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 3 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 <glib/gi18n.h>
+#include <devhelp/devhelp.h>
+
+#include "gb-devhelp-panel.h"
+#include "gb-devhelp-resources.h"
+#include "gb-plugins.h"
+#include "gb-workbench-addin.h"
+#include "gb-workbench.h"
+#include "gb-workspace.h"
+
+struct _GbDevhelpPanel
+{
+ GtkBin parent_instance;
+
+ GbWorkbench *workbench;
+ DhBookManager *book_manager;
+
+ GtkWidget *sidebar;
+};
+
+static void workbench_addin_iface_init (GbWorkbenchAddinInterface *iface);
+
+G_DEFINE_TYPE_WITH_CODE (GbDevhelpPanel, gb_devhelp_panel, GTK_TYPE_BIN,
+ G_IMPLEMENT_INTERFACE (GB_TYPE_WORKBENCH_ADDIN,
+ workbench_addin_iface_init))
+
+enum {
+ PROP_0,
+ PROP_WORKBENCH,
+ LAST_PROP
+};
+
+static GParamSpec *gParamSpecs [LAST_PROP];
+
+static void
+gb_devhelp_panel_load (GbWorkbenchAddin *addin)
+{
+ GbDevhelpPanel *self = (GbDevhelpPanel *)addin;
+ GtkWidget *workspace;
+ GtkWidget *pane;
+
+ g_print ("Loading and adding panel to workbench\n");
+
+ g_assert (GB_IS_DEVHELP_PANEL (self));
+
+ workspace = gb_workbench_get_workspace (self->workbench);
+ pane = gb_workspace_get_right_pane (GB_WORKSPACE (workspace));
+ gb_workspace_pane_add_page (GB_WORKSPACE_PANE (pane), GTK_WIDGET (self),
+ _("Documentation"),
+ GTK_STOCK_HELP);
+
+ gtk_widget_show (GTK_WIDGET (self));
+}
+
+static void
+gb_devhelp_panel_unload (GbWorkbenchAddin *addin)
+{
+ GbDevhelpPanel *self = (GbDevhelpPanel *)addin;
+
+ g_assert (GB_IS_DEVHELP_PANEL (self));
+
+ ide_clear_weak_pointer (&self->workbench);
+}
+
+static void
+gb_devhelp_panel_finalize (GObject *object)
+{
+ GbDevhelpPanel *self = (GbDevhelpPanel *)object;
+
+ ide_clear_weak_pointer (&self->workbench);
+
+ g_clear_object (&self->book_manager);
+
+ G_OBJECT_CLASS (gb_devhelp_panel_parent_class)->finalize (object);
+}
+
+static void
+gb_devhelp_panel_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GbDevhelpPanel *self = GB_DEVHELP_PANEL (object);
+
+ switch (prop_id)
+ {
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+}
+
+static void
+gb_devhelp_panel_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GbDevhelpPanel *self = GB_DEVHELP_PANEL (object);
+
+ switch (prop_id)
+ {
+ case PROP_WORKBENCH:
+ ide_set_weak_pointer (&self->workbench, g_value_get_object (value));
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+}
+
+static void
+gb_devhelp_panel_class_init (GbDevhelpPanelClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->finalize = gb_devhelp_panel_finalize;
+ object_class->get_property = gb_devhelp_panel_get_property;
+ object_class->set_property = gb_devhelp_panel_set_property;
+
+ gParamSpecs [PROP_WORKBENCH] =
+ g_param_spec_object ("workbench",
+ _("Workbench"),
+ _("Workbench"),
+ GB_TYPE_WORKBENCH,
+ (G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_properties (object_class, LAST_PROP, gParamSpecs);
+}
+
+static void
+gb_devhelp_panel_init (GbDevhelpPanel *self)
+{
+ self->book_manager = dh_book_manager_new ();
+ dh_book_manager_populate (self->book_manager);
+
+ self->sidebar = dh_sidebar_new (self->book_manager);
+ gtk_container_add (GTK_CONTAINER (self), self->sidebar);
+ gtk_widget_show (self->sidebar);
+}
+
+static void
+workbench_addin_iface_init (GbWorkbenchAddinInterface *iface)
+{
+ iface->load = gb_devhelp_panel_load;
+ iface->unload = gb_devhelp_panel_unload;
+}
+
+GB_DEFINE_EMBEDDED_PLUGIN (gb_devhelp,
+ gb_devhelp_get_resource (),
+ "resource:///org/gnome/builder/plugins/devhelp/gb-devhelp.plugin",
+ GB_DEFINE_PLUGIN_TYPE (GB_TYPE_WORKBENCH_ADDIN, GB_TYPE_DEVHELP_PANEL))
diff --git a/src/devhelp/gb-devhelp-view.h b/plugins/devhelp/gb-devhelp-panel.h
similarity index 61%
copy from src/devhelp/gb-devhelp-view.h
copy to plugins/devhelp/gb-devhelp-panel.h
index d2ee3be..d36415b 100644
--- a/src/devhelp/gb-devhelp-view.h
+++ b/plugins/devhelp/gb-devhelp-panel.h
@@ -1,6 +1,6 @@
-/* gb-devhelp-view.h
+/* gb-devhelp-panel.h
*
- * Copyright (C) 2014 Christian Hergert <christian hergert me>
+ * Copyright (C) 2015 Christian Hergert <christian hergert me>
*
* 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
@@ -16,20 +16,17 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef GB_DEVHELP_VIEW_H
-#define GB_DEVHELP_VIEW_H
+#ifndef GB_DEVHELP_PANEL_H
+#define GB_DEVHELP_PANEL_H
-#include "gb-devhelp-document.h"
-#include "gb-view.h"
+#include <gtk/gtk.h>
G_BEGIN_DECLS
-#define GB_TYPE_DEVHELP_VIEW (gb_devhelp_view_get_type())
+#define GB_TYPE_DEVHELP_PANEL (gb_devhelp_panel_get_type())
-G_DECLARE_FINAL_TYPE (GbDevhelpView, gb_devhelp_view, GB, DEVHELP_VIEW, GbView)
-
-GbView *gb_devhelp_view_new (GbDevhelpDocument *document);
+G_DECLARE_FINAL_TYPE (GbDevhelpPanel, gb_devhelp_panel, GB, DEVHELP_PANEL, GtkBin)
G_END_DECLS
-#endif /* GB_DEVHELP_VIEW_H */
+#endif /* GB_DEVHELP_PANEL_H */
diff --git a/src/devhelp/gb-devhelp-view.c b/plugins/devhelp/gb-devhelp-view.c
similarity index 95%
rename from src/devhelp/gb-devhelp-view.c
rename to plugins/devhelp/gb-devhelp-view.c
index 0aee130..3f396ac 100644
--- a/src/devhelp/gb-devhelp-view.c
+++ b/plugins/devhelp/gb-devhelp-view.c
@@ -224,6 +224,7 @@ static void
gb_devhelp_view_class_init (GbDevhelpViewClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
GbViewClass *view_class = GB_VIEW_CLASS (klass);
object_class->finalize = gb_devhelp_view_finalize;
@@ -243,9 +244,9 @@ gb_devhelp_view_class_init (GbDevhelpViewClass *klass)
g_object_class_install_properties (object_class, LAST_PROP, gParamSpecs);
- GB_WIDGET_CLASS_TEMPLATE (klass, "gb-devhelp-view.ui");
- GB_WIDGET_CLASS_BIND (klass, GbDevhelpView, web_view1);
- GB_WIDGET_CLASS_BIND (klass, GbDevhelpView, paned);
+ gtk_widget_class_set_template_from_resource (widget_class,
"/org/gnome/builder/plugins/devhelp/gb-devhelp-view.ui");
+ gtk_widget_class_bind_template_child (widget_class, GbDevhelpView, web_view1);
+ gtk_widget_class_bind_template_child (widget_class, GbDevhelpView, paned);
g_type_ensure (WEBKIT_TYPE_WEB_VIEW);
}
diff --git a/src/devhelp/gb-devhelp-view.h b/plugins/devhelp/gb-devhelp-view.h
similarity index 100%
rename from src/devhelp/gb-devhelp-view.h
rename to plugins/devhelp/gb-devhelp-view.h
diff --git a/data/ui/gb-devhelp-view.ui b/plugins/devhelp/gb-devhelp-view.ui
similarity index 100%
rename from data/ui/gb-devhelp-view.ui
rename to plugins/devhelp/gb-devhelp-view.ui
diff --git a/plugins/devhelp/gb-devhelp.gresource.xml b/plugins/devhelp/gb-devhelp.gresource.xml
new file mode 100644
index 0000000..2657450
--- /dev/null
+++ b/plugins/devhelp/gb-devhelp.gresource.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gresources>
+ <gresource prefix="/org/gnome/builder/plugins/devhelp">
+ <file>gb-devhelp.plugin</file>
+ <file>gb-devhelp-view.ui</file>
+ </gresource>
+</gresources>
diff --git a/plugins/devhelp/gb-devhelp.plugin b/plugins/devhelp/gb-devhelp.plugin
new file mode 100644
index 0000000..aedd2af
--- /dev/null
+++ b/plugins/devhelp/gb-devhelp.plugin
@@ -0,0 +1,6 @@
+[Plugin]
+Module=devhelp
+Name=Devhelp
+Description=Provides devhelp documentation
+Authors=Christian Hergert <christian hergert me>
+Copyright=Copyright © 2015 Christian Hergert
diff --git a/plugins/symbol-tree/Makefile.am b/plugins/symbol-tree/Makefile.am
index e41a912..1bd8882 100644
--- a/plugins/symbol-tree/Makefile.am
+++ b/plugins/symbol-tree/Makefile.am
@@ -14,9 +14,8 @@ libsymbol_tree_la_SOURCES = \
# XXX: temporary, since we need to extract lots of src/ into plugins
libsymbol_tree_la_CFLAGS = \
- $(LIBIDE_CFLAGS) \
+ $(BUILDER_CFLAGS) \
-I$(top_srcdir)/src \
- -I$(top_srcdir)/src/commands \
-I$(top_srcdir)/src/documents \
-I$(top_srcdir)/src/views \
-I$(top_srcdir)/src/tree \
@@ -26,7 +25,7 @@ libsymbol_tree_la_CFLAGS = \
$(NULL)
libsymbol_tree_la_LIBADD = \
- $(LIBIDE_LIBS) \
+ $(BUILDER_LIBS) \
$(top_builddir)/libide/libide-1.0.la \
$(NULL)
@@ -35,7 +34,6 @@ libsymbol_tree_la_LDFLAGS = \
-module \
$(NULL)
-
glib_resources_c = symbol-tree-resources.c
glib_resources_h = symbol-tree-resources.h
glib_resources_xml = symbol-tree.gresource.xml
diff --git a/src/Makefile.am b/src/Makefile.am
index 121af8e..bab880e 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -15,10 +15,6 @@ libgnome_builder_la_SOURCES = \
app/gb-application-private.h \
app/gb-application.c \
app/gb-application.h \
- devhelp/gb-devhelp-document.c \
- devhelp/gb-devhelp-document.h \
- devhelp/gb-devhelp-view.c \
- devhelp/gb-devhelp-view.h \
dialogs/gb-new-project-dialog.c \
dialogs/gb-new-project-dialog.h \
dialogs/gb-projects-dialog.c \
@@ -182,9 +178,7 @@ libgnome_builder_la_CFLAGS = \
-I$(builddir)/resources \
-I$(builddir)/util \
-I$(srcdir)/app \
- -I$(srcdir)/commands \
-I$(srcdir)/css \
- -I$(srcdir)/devhelp \
-I$(srcdir)/dialogs \
-I$(srcdir)/documents \
-I$(srcdir)/editor \
@@ -215,6 +209,7 @@ libgnome_builder_la_CFLAGS = \
define_plugin = -Wl,--whole-archive,$(top_builddir)/plugins/$1/.libs/lib$1.a,--no-whole-archive
gnome_builder_PLUGINS = \
+ devhelp \
command-bar \
symbol-tree \
$(NULL)
diff --git a/src/gb-plugins.c b/src/gb-plugins.c
index e489487..4dd0ab2 100644
--- a/src/gb-plugins.c
+++ b/src/gb-plugins.c
@@ -25,66 +25,65 @@ PeasPluginInfo **peas_register_types (void);
static GPtrArray *embedded_plugins;
void
-gb_plugins_register (PeasPluginInfo *plugin_info)
+gb_plugins_register (GbPluginRegisterFunc callback)
{
- g_assert (plugin_info != NULL);
-
- g_print ("Registering plugin \"%s\"\n", peas_plugin_info_get_module_name (plugin_info));
+ g_assert (callback != NULL);
if (embedded_plugins == NULL)
embedded_plugins = g_ptr_array_new ();
-
- g_ptr_array_add (embedded_plugins, plugin_info);
+ g_ptr_array_add (embedded_plugins, callback);
}
PeasPluginInfo **
peas_register_types (void)
{
- GPtrArray *copy;
+ GPtrArray *ar;
- g_print ("peas_register_types called ...\n");
-
- copy = g_ptr_array_new ();
+ ar = g_ptr_array_new ();
if (embedded_plugins != NULL)
{
gsize i;
for (i = 0; i < embedded_plugins->len; i++)
- g_ptr_array_add (copy, g_ptr_array_index (embedded_plugins, i));
+ {
+ g_autoptr(PeasObjectModule) module = NULL;
+ PeasPluginInfo *plugin_info;
+ GbPluginRegisterFunc callback;
+
+ module = peas_object_module_new_embedded ();
+ callback = g_ptr_array_index (embedded_plugins, i);
+ plugin_info = callback (module);
+
+ if (plugin_info != NULL)
+ g_ptr_array_add (ar, plugin_info);
+ }
}
- g_ptr_array_add (copy, NULL);
+ g_ptr_array_add (ar, NULL);
- return (PeasPluginInfo **)g_ptr_array_free (copy, FALSE);
+ return (PeasPluginInfo **)g_ptr_array_free (ar, FALSE);
}
void
gb_plugins_load (void)
{
PeasEngine *engine;
- GModule *module;
- gpointer symbol = NULL;
- gsize i;
+ const GList *list;
- g_print ("Loading plugins...\n");
+ engine = peas_engine_get_default ();
+ list = peas_engine_get_plugin_list (engine);
- module = g_module_open (NULL, G_MODULE_BIND_LAZY);
- if (g_module_symbol (module, "peas_register_types", &symbol))
- g_print ("Found\n");
- else
- g_print ("Not Found\n");
+ for (; list; list = list->next)
+ {
+ PeasPluginInfo *plugin_info = list->data;
- g_print ("func at %p (%p)\n", symbol, (void *)peas_register_types);
+ /*
+ * TODO: Only load embedded.
+ */
- engine = peas_engine_get_default ();
- peas_engine_add_search_path (engine, "plugins", "plugins");
- peas_engine_rescan_plugins (engine);
+ g_print ("Loading: %s\n", peas_plugin_info_get_module_name (plugin_info));
- for (i = 0; i < embedded_plugins->len; i++)
- {
- PeasPluginInfo *info = g_ptr_array_index (embedded_plugins, i);
- g_print ("Loading %s\n", peas_plugin_info_get_name (info));
- peas_engine_load_plugin (engine, info);
+ peas_engine_load_plugin (engine, plugin_info);
}
}
diff --git a/src/gb-plugins.h b/src/gb-plugins.h
index 05eeee9..6c5b380 100644
--- a/src/gb-plugins.h
+++ b/src/gb-plugins.h
@@ -26,22 +26,19 @@
G_BEGIN_DECLS
#define GB_DEFINE_EMBEDDED_PLUGIN(name, resource, plugin_path, ...) \
+ static PeasPluginInfo * \
+ name##_register (PeasObjectModule *module) \
+ { \
+ g_resources_register (resource); \
+ __VA_ARGS__ \
+ return peas_plugin_info_new_embedded (module, plugin_path); \
+ } \
+ \
G_DEFINE_CONSTRUCTOR(name##_plugin); \
static void \
name##_plugin (void) \
{ \
- g_autoptr(PeasObjectModule) module = NULL; \
- PeasPluginInfo *plugin_info = NULL; \
- \
- if (resource != NULL) \
- g_resources_register (resource); \
- \
- module = peas_object_module_new_embedded (); \
- \
- __VA_ARGS__ \
- \
- plugin_info = peas_plugin_info_new_embedded (module, plugin_path); \
- gb_plugins_register (plugin_info); \
+ gb_plugins_register (name##_register); \
}
#define GB_DEFINE_PLUGIN_TYPE(PLUGIN, IMPL) \
@@ -49,7 +46,9 @@ G_BEGIN_DECLS
peas_object_module_register_extension_type (module, PLUGIN, IMPL); \
} G_STMT_END;
-void gb_plugins_register (PeasPluginInfo *plugin_info);
+typedef PeasPluginInfo *(*GbPluginRegisterFunc) (PeasObjectModule *module);
+
+void gb_plugins_register (GbPluginRegisterFunc callback);
void gb_plugins_load (void);
G_END_DECLS
diff --git a/src/resources/gnome-builder.gresource.xml b/src/resources/gnome-builder.gresource.xml
index 2eb26f8..9a8dbad 100644
--- a/src/resources/gnome-builder.gresource.xml
+++ b/src/resources/gnome-builder.gresource.xml
@@ -42,7 +42,6 @@
<file alias="theme/Adwaita-shared.css">../../data/theme/Adwaita-shared.css</file>
<file alias="theme/shared.css">../../data/theme/shared.css</file>
- <file alias="ui/gb-devhelp-view.ui">../../data/ui/gb-devhelp-view.ui</file>
<file alias="ui/gb-editor-frame.ui">../../data/ui/gb-editor-frame.ui</file>
<file alias="ui/gb-editor-settings-widget.ui">../../data/ui/gb-editor-settings-widget.ui</file>
<file alias="ui/gb-editor-tweak-widget.ui">../../data/ui/gb-editor-tweak-widget.ui</file>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]