[gnome-system-monitor/wip/newdesign: 9/9] Network color pickers ported to new design, without bits display yet
- From: Robert Roth <robertroth src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-system-monitor/wip/newdesign: 9/9] Network color pickers ported to new design, without bits display yet
- Date: Wed, 14 Aug 2013 04:07:24 +0000 (UTC)
commit d79c590abaff5573ed050df9e6d631df65a82c0b
Author: Robert Roth <robert roth off gmail com>
Date: Wed Aug 14 07:06:47 2013 +0300
Network color pickers ported to new design, without bits display yet
data/interface.ui | 93 +++------------------------------------
src/gsm_color_button.c | 112 +++++-------------------------------------------
src/gsm_color_button.h | 3 +-
src/interface.cpp | 24 +++-------
src/load-graph.cpp | 28 +++++++++---
src/load-graph.h | 9 +++-
src/util.cpp | 27 ++++++------
src/util.h | 24 +++++++++-
8 files changed, 91 insertions(+), 229 deletions(-)
---
diff --git a/data/interface.ui b/data/interface.ui
index 20996a8..998e3c3 100644
--- a/data/interface.ui
+++ b/data/interface.ui
@@ -428,6 +428,7 @@
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">horizontal</property>
+ <property name="margin_right">56</property>
<child>
<object class="GtkLabel" id="net_label">
<property name="visible">True</property>
@@ -448,117 +449,39 @@
<object class="GtkGrid" id="net_table">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="hexpand">True</property>
<property name="row_spacing">6</property>
<property name="column_spacing">6</property>
<property name="row_homogeneous">True</property>
+ <property name="column_homogeneous">True</property>
<child>
<object class="GtkLabel" id="receiving_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="hexpand">True</property>
- <property name="xalign">0</property>
+ <property name="xalign">1</property>
<property name="label" translatable="yes">Receiving</property>
</object>
<packing>
- <property name="left_attach">1</property>
+ <property name="left_attach">0</property>
<property name="top_attach">0</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
- <object class="GtkLabel" id="total_received_label">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="hexpand">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Total Received</property>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="top_attach">1</property>
- <property name="width">1</property>
- <property name="height">1</property>
- </packing>
- </child>
- <child>
<object class="GtkLabel" id="sending_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="hexpand">True</property>
- <property name="xalign">0</property>
+ <property name="xalign">1</property>
<property name="label" translatable="yes">Sending</property>
</object>
<packing>
- <property name="left_attach">5</property>
+ <property name="left_attach">2</property>
<property name="top_attach">0</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
- <object class="GtkLabel" id="total_sent_label">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="hexpand">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Total Sent</property>
- </object>
- <packing>
- <property name="left_attach">5</property>
- <property name="top_attach">1</property>
- <property name="width">1</property>
- <property name="height">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="spacer">
- <property name="width_request">16</property>
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="label"></property>
- </object>
- <packing>
- <property name="left_attach">3</property>
- <property name="top_attach">0</property>
- <property name="width">1</property>
- <property name="height">2</property>
- </packing>
- </child>
- <child>
- <object class="GtkAlignment" id="receiving_picker_alignment">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="border_width">6</property>
- <child>
- <placeholder/>
- </child>
- </object>
- <packing>
- <property name="left_attach">0</property>
- <property name="top_attach">0</property>
- <property name="width">1</property>
- <property name="height">2</property>
- </packing>
- </child>
- <child>
- <object class="GtkAlignment" id="sending_picker_alignment">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="border_width">6</property>
- <child>
- <placeholder/>
- </child>
- </object>
- <packing>
- <property name="left_attach">4</property>
- <property name="top_attach">0</property>
- <property name="width">1</property>
- <property name="height">2</property>
- </packing>
- </child>
- <child>
<placeholder/>
</child>
<child>
@@ -567,7 +490,7 @@
</object>
<packing>
<property name="expand">False</property>
- <property name="fill">True</property>
+ <property name="fill">False</property>
<property name="pack_type">end</property>
<property name="position">0</property>
</packing>
@@ -630,7 +553,7 @@
</object>
<object class="GtkSizeGroup" id="explabels">
<widgets>
- <widget name="net_table"/>
+ <!--<widget name="net_table"/>-->
<widget name="cpu_table"/>
<widget name="mem_table"/>
</widgets>
diff --git a/src/gsm_color_button.c b/src/gsm_color_button.c
index 7973d11..5c0a0ef 100644
--- a/src/gsm_color_button.c
+++ b/src/gsm_color_button.c
@@ -178,47 +178,12 @@ gsm_color_button_class_init (GsmColorButtonClass * klass)
}
-static cairo_surface_t *
-fill_image_buffer_from_resource (cairo_t *cr, const char *path)
-{
- GBytes *bytes;
- const guint8 *data;
- gsize len;
- GError *error = NULL;
- RsvgHandle *handle;
- cairo_surface_t *tmp_surface;
- cairo_t *tmp_cr;
-
- bytes = g_resources_lookup_data (path, 0 , NULL);
- data = g_bytes_get_data (bytes, &len);
-
- handle = rsvg_handle_new_from_data (data, len, &error);
-
- if (handle == NULL) {
- g_warning("rsvg_handle_new_from_data(\"%s\") failed: %s",
- path, (error ? error->message : "unknown error"));
- if (error)
- g_error_free(error);
- return NULL;
- }
-
- tmp_surface = cairo_surface_create_similar (cairo_get_target (cr),
- CAIRO_CONTENT_COLOR_ALPHA,
- 32, 32);
- tmp_cr = cairo_create (tmp_surface);
- rsvg_handle_render_cairo (handle, tmp_cr);
- cairo_destroy (tmp_cr);
- g_object_unref (handle);
- return tmp_surface;
-}
-
static gboolean
gsm_color_button_draw (GtkWidget *widget, cairo_t * cr)
{
GsmColorButton *color_button = GSM_COLOR_BUTTON (widget);
GsmColorButtonPrivate *priv = gsm_color_button_get_instance_private (color_button);
GdkRGBA *color = gdk_rgba_copy(&priv->color);
- cairo_path_t *path = NULL;
gint width, height;
gdouble radius, arc_start, arc_end;
gdouble highlight_factor;
@@ -226,7 +191,7 @@ gsm_color_button_draw (GtkWidget *widget, cairo_t * cr)
PangoLayout* layout;
PangoFontDescription* font_desc;
PangoRectangle extents;
- gchar * caption;
+ gchar * caption = NULL;
if (sensitive && priv->highlight > 0) {
highlight_factor = 0.125 * priv->highlight;
@@ -248,6 +213,7 @@ gsm_color_button_draw (GtkWidget *widget, cairo_t * cr)
switch (priv->type)
{
+ case GSMCP_TYPE_NETWORK:
case GSMCP_TYPE_CPU:
// colored background
cairo_paint (cr);
@@ -266,12 +232,18 @@ gsm_color_button_draw (GtkWidget *widget, cairo_t * cr)
pango_layout_set_font_description (layout, font_desc);
pango_font_description_free (font_desc);
pango_layout_set_alignment (layout, PANGO_ALIGN_RIGHT);
- caption = g_strdup_printf ("<span font-weight='ultrabold'>%.1f%%</span>", priv->fraction * 100.0f);
+ if (priv->type == GSMCP_TYPE_NETWORK) {
+ char* rate = g_format_size(priv->fraction);
+ caption = g_strdup_printf ("<span font-weight='ultrabold'>%s</span>", rate);
+ g_free (rate);
+ } else if (priv->type == GSMCP_TYPE_CPU) {
+ caption = g_strdup_printf ("<span font-weight='ultrabold'>%.1f%%</span>", priv->fraction * 100.0f);
+ }
pango_layout_set_markup (layout, caption, -1);
g_free (caption);
pango_layout_get_extents (layout, NULL, &extents);
// draw label outline
- cairo_move_to (cr, (width - 1.3 * extents.width / PANGO_SCALE)/2 + 5.1 ,
+ cairo_move_to (cr, (width - 1.3 * extents.width / PANGO_SCALE)/2 + 9.5 ,
(height - 1.3 * extents.height / PANGO_SCALE)/2 + 2);
cairo_set_line_width (cr, 3);
@@ -279,7 +251,7 @@ gsm_color_button_draw (GtkWidget *widget, cairo_t * cr)
pango_cairo_layout_path (cr, layout);
cairo_stroke (cr);
// draw label text
- cairo_move_to (cr, (width - 1.3 * extents.width / PANGO_SCALE)/2 + 4.7,
+ cairo_move_to (cr, (width - 1.3 * extents.width / PANGO_SCALE)/2 + 9.1,
(height - 1.3 * extents.height / PANGO_SCALE)/2 + 2);
cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 1.0);
@@ -348,68 +320,6 @@ gsm_color_button_draw (GtkWidget *widget, cairo_t * cr)
cairo_stroke (cr);
break;
- case GSMCP_TYPE_NETWORK_IN:
- if (priv->image_buffer == NULL)
- priv->image_buffer =
- fill_image_buffer_from_resource (cr, "/org/gnome/gnome-system-monitor/pixmaps/download.svg");
- gtk_widget_set_size_request (widget, 32, 32);
- cairo_move_to (cr, 8.5, 1.5);
- cairo_line_to (cr, 23.5, 1.5);
- cairo_line_to (cr, 23.5, 11.5);
- cairo_line_to (cr, 29.5, 11.5);
- cairo_line_to (cr, 16.5, 27.5);
- cairo_line_to (cr, 15.5, 27.5);
- cairo_line_to (cr, 2.5, 11.5);
- cairo_line_to (cr, 8.5, 11.5);
- cairo_line_to (cr, 8.5, 1.5);
- cairo_close_path (cr);
- path = cairo_copy_path (cr);
- cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE);
- cairo_set_line_join (cr, CAIRO_LINE_JOIN_MITER);
- cairo_set_line_width (cr, 1);
- cairo_fill_preserve (cr);
- cairo_set_miter_limit (cr, 5.0);
- cairo_stroke (cr);
- cairo_set_source_rgba (cr, 0, 0, 0, 0.5);
- cairo_append_path (cr, path);
- cairo_path_destroy(path);
- cairo_stroke (cr);
- cairo_set_source_surface (cr, priv->image_buffer, 0.0,
- 0.0);
- cairo_paint (cr);
-
- break;
- case GSMCP_TYPE_NETWORK_OUT:
- if (priv->image_buffer == NULL)
- priv->image_buffer =
- fill_image_buffer_from_resource (cr, "/org/gnome/gnome-system-monitor/pixmaps/upload.svg");
- gtk_widget_set_size_request (widget, 32, 32);
- cairo_move_to (cr, 16.5, 1.5);
- cairo_line_to (cr, 29.5, 17.5);
- cairo_line_to (cr, 23.5, 17.5);
- cairo_line_to (cr, 23.5, 27.5);
- cairo_line_to (cr, 8.5, 27.5);
- cairo_line_to (cr, 8.5, 17.5);
- cairo_line_to (cr, 2.5, 17.5);
- cairo_line_to (cr, 15.5, 1.5);
- cairo_line_to (cr, 16.5, 1.5);
- cairo_close_path (cr);
- path = cairo_copy_path (cr);
- cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE);
- cairo_set_line_join (cr, CAIRO_LINE_JOIN_MITER);
- cairo_set_line_width (cr, 1);
- cairo_fill_preserve (cr);
- cairo_set_miter_limit (cr, 5.0);
- cairo_stroke (cr);
- cairo_set_source_rgba (cr, 0, 0, 0, 0.5);
- cairo_append_path (cr, path);
- cairo_path_destroy(path);
- cairo_stroke (cr);
- cairo_set_source_surface (cr, priv->image_buffer, 0.0,
- 0.0);
- cairo_paint (cr);
-
- break;
}
return FALSE;
diff --git a/src/gsm_color_button.h b/src/gsm_color_button.h
index 3f2f37a..1b63e3b 100644
--- a/src/gsm_color_button.h
+++ b/src/gsm_color_button.h
@@ -52,8 +52,7 @@ enum
{
GSMCP_TYPE_CPU,
GSMCP_TYPE_PIE,
- GSMCP_TYPE_NETWORK_IN,
- GSMCP_TYPE_NETWORK_OUT,
+ GSMCP_TYPE_NETWORK,
GSMCP_TYPES
};
diff --git a/src/interface.cpp b/src/interface.cpp
index c8fc5d0..53394bb 100644
--- a/src/interface.cpp
+++ b/src/interface.cpp
@@ -178,7 +178,6 @@ create_sys_view (GsmApplication *app, GtkBuilder * builder)
GtkWidget *label;
GtkWidget *table;
GtkWidget *color_picker;
- GtkWidget *picker_alignment;
LoadGraph *cpu_graph, *mem_graph, *net_graph;
gint i;
@@ -235,7 +234,7 @@ create_sys_view (GsmApplication *app, GtkBuilder * builder)
g_signal_connect (G_OBJECT (color_picker), "color-set",
G_CALLBACK (cb_cpu_color_changed), GINT_TO_POINTER (i));
gtk_box_pack_start (GTK_BOX (temp_hbox), color_picker, FALSE, TRUE, 0);
- gtk_widget_set_size_request(GTK_WIDGET(color_picker), 80, 20);
+ gtk_widget_set_size_request(GTK_WIDGET(color_picker), 100, 24);
}
@@ -294,36 +293,27 @@ create_sys_view (GsmApplication *app, GtkBuilder * builder)
table = GTK_WIDGET (gtk_builder_get_object (builder, "net_table"));
- color_picker = gsm_color_button_new (
- &net_graph->colors.at(0), GSMCP_TYPE_NETWORK_IN);
+ color_picker = load_graph_get_net_in_color_picker (net_graph);
+ gtk_widget_set_size_request(GTK_WIDGET(color_picker), 100, 24);
g_signal_connect (G_OBJECT (color_picker), "color-set",
G_CALLBACK (cb_net_in_color_changed), app);
title_text = g_strdup_printf(title_template, _("Receiving"));
gsm_color_button_set_title(GSM_COLOR_BUTTON(color_picker), title_text);
g_free(title_text);
- picker_alignment = GTK_WIDGET (gtk_builder_get_object (builder, "receiving_picker_alignment"));
- gtk_container_add (GTK_CONTAINER (picker_alignment), color_picker);
label = GTK_WIDGET (gtk_builder_get_object(builder, "receiving_label"));
- gtk_grid_attach_next_to (GTK_GRID (table), load_graph_get_labels(net_graph)->net_in, label,
GTK_POS_RIGHT, 1, 1);
- label = GTK_WIDGET (gtk_builder_get_object(builder, "total_received_label"));
- gtk_grid_attach_next_to (GTK_GRID (table), load_graph_get_labels(net_graph)->net_in_total, label,
GTK_POS_RIGHT, 1, 1);
+ gtk_grid_attach_next_to (GTK_GRID (table), color_picker, label, GTK_POS_RIGHT, 1, 1);
- color_picker = gsm_color_button_new (
- &net_graph->colors.at(1), GSMCP_TYPE_NETWORK_OUT);
+ color_picker = load_graph_get_net_out_color_picker (net_graph);
+ gtk_widget_set_size_request(GTK_WIDGET(color_picker), 100, 24);
g_signal_connect (G_OBJECT (color_picker), "color-set",
G_CALLBACK (cb_net_out_color_changed), app);
title_text = g_strdup_printf(title_template, _("Sending"));
gsm_color_button_set_title(GSM_COLOR_BUTTON(color_picker), title_text);
g_free(title_text);
- picker_alignment = GTK_WIDGET (gtk_builder_get_object (builder, "sending_picker_alignment"));
- gtk_container_add (GTK_CONTAINER (picker_alignment), color_picker);
-
label = GTK_WIDGET (gtk_builder_get_object(builder, "sending_label"));
- gtk_grid_attach_next_to (GTK_GRID (table), load_graph_get_labels(net_graph)->net_out, label,
GTK_POS_RIGHT, 1, 1);
- label = GTK_WIDGET (gtk_builder_get_object(builder, "total_sent_label"));
- gtk_grid_attach_next_to (GTK_GRID (table), load_graph_get_labels(net_graph)->net_out_total, label,
GTK_POS_RIGHT, 1, 1);
+ gtk_grid_attach_next_to (GTK_GRID (table), color_picker, label, GTK_POS_RIGHT, 1, 1);
app->net_graph = net_graph;
g_free (title_template);
diff --git a/src/load-graph.cpp b/src/load-graph.cpp
index d574108..5207ebb 100644
--- a/src/load-graph.cpp
+++ b/src/load-graph.cpp
@@ -608,11 +608,8 @@ get_net (LoadGraph *graph)
if (!first)
net_scale(graph, din, dout);
- gtk_label_set_text (GTK_LABEL (graph->labels.net_in), procman::format_network_rate(din).c_str());
- gtk_label_set_text (GTK_LABEL (graph->labels.net_in_total), procman::format_network(in).c_str());
-
- gtk_label_set_text (GTK_LABEL (graph->labels.net_out), procman::format_network_rate(dout).c_str());
- gtk_label_set_text (GTK_LABEL (graph->labels.net_out_total), procman::format_network(out).c_str());
+ gsm_color_button_set_fraction (GSM_COLOR_BUTTON (graph->net_in_color_picker), din);
+ gsm_color_button_set_fraction (GSM_COLOR_BUTTON (graph->net_out_color_picker), dout);
}
@@ -700,7 +697,9 @@ LoadGraph::LoadGraph(guint type)
draw(FALSE),
mem_color_picker(NULL),
swap_color_picker(NULL),
- cpu_color_pickers(NULL)
+ cpu_color_pickers(NULL),
+ net_in_color_picker(NULL),
+ net_out_color_picker(NULL)
{
LoadGraph * const graph = this;
@@ -775,6 +774,10 @@ LoadGraph::LoadGraph(guint type)
case LOAD_GRAPH_NET:
colors[0] = GsmApplication::get()->config.net_in_color;
colors[1] = GsmApplication::get()->config.net_out_color;
+ net_in_color_picker = gsm_color_button_new (&colors[0],
+ GSMCP_TYPE_NETWORK);
+ net_out_color_picker = gsm_color_button_new (&colors[1],
+ GSMCP_TYPE_NETWORK);
break;
}
@@ -882,3 +885,16 @@ load_graph_get_cpu_color_picker(LoadGraph *graph, guint nr)
{
return GTK_WIDGET (g_list_nth_data (graph->cpu_color_pickers, nr));
}
+
+GtkWidget*
+load_graph_get_net_in_color_picker(LoadGraph *graph)
+{
+ return graph->net_in_color_picker;
+}
+
+GtkWidget*
+load_graph_get_net_out_color_picker(LoadGraph *graph)
+{
+ return graph->net_out_color_picker;
+}
+
diff --git a/src/load-graph.h b/src/load-graph.h
index dfe601a..c72f0d8 100644
--- a/src/load-graph.h
+++ b/src/load-graph.h
@@ -73,7 +73,8 @@ struct LoadGraph
GtkWidget *mem_color_picker;
GtkWidget *swap_color_picker;
GList * cpu_color_pickers;
-
+ GtkWidget *net_in_color_picker;
+ GtkWidget *net_out_color_picker;
/* union { */
struct
{
@@ -130,4 +131,10 @@ load_graph_get_swap_color_picker(LoadGraph *g) G_GNUC_CONST;
GtkWidget*
load_graph_get_cpu_color_picker(LoadGraph *g, guint nr) G_GNUC_CONST;
+GtkWidget*
+load_graph_get_net_out_color_picker(LoadGraph *g) G_GNUC_CONST;
+
+GtkWidget*
+load_graph_get_net_in_color_picker(LoadGraph *g) G_GNUC_CONST;
+
#endif /* _GSM_LOAD_GRAPH_H_ */
diff --git a/src/util.cpp b/src/util.cpp
index d052a96..04f03cb 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -144,7 +144,7 @@ procman_make_label_for_mmaps_or_ofiles(const char *format,
**/
gchar*
-procman::format_size(guint64 size, guint64 max_size, bool want_bits)
+procman_format_size(guint64 size, guint64 max_size, bool want_bits)
{
enum {
@@ -207,6 +207,15 @@ procman::format_size(guint64 size, guint64 max_size, bool want_bits)
}
}
+gchar* procman_format_rate(guint64 rate, guint64 max_rate, bool want_bits)
+{
+ char* bytes = procman_format_size(rate, max_rate, want_bits);
+ // xgettext: rate, 10MiB/s or 10Mbit/s
+ gchar* formatted_rate = g_strdup_printf(_("%s/s"), bytes);
+ g_free(bytes);
+ return formatted_rate;
+}
+
gchar *
procman::get_nice_level (gint nice)
{
@@ -622,28 +631,18 @@ namespace procman
}
- std::string format_rate(guint64 rate, guint64 max_rate, bool want_bits)
- {
- char* bytes = procman::format_size(rate, max_rate, want_bits);
- // xgettext: rate, 10MiB/s or 10Mbit/s
- std::string formatted_rate(make_string(g_strdup_printf(_("%s/s"), bytes)));
- g_free(bytes);
- return formatted_rate;
- }
-
std::string format_network(guint64 rate, guint64 max_rate)
{
- char* bytes = procman::format_size(rate, max_rate, GsmApplication::get()->config.network_in_bits);
+ char* bytes = procman_format_size(rate, max_rate, GsmApplication::get()->config.network_in_bits);
std::string formatted(bytes);
g_free(bytes);
return formatted;
}
-
-
+
std::string format_network_rate(guint64 rate, guint64 max_rate)
{
- return procman::format_rate(rate, max_rate, GsmApplication::get()->config.network_in_bits);
+ return procman_format_rate (rate, max_rate, GsmApplication::get()->config.network_in_bits);
}
}
diff --git a/src/util.h b/src/util.h
index 6dda021..c3ac57f 100644
--- a/src/util.h
+++ b/src/util.h
@@ -4,10 +4,17 @@
#include <glib.h>
#include <gtk/gtk.h>
+
+#ifdef __cplusplus
+#define EXTERNC extern "C"
#include <string>
using std::string;
+#else
+#define EXTERNC
+#endif
+
/* check if logind is running */
#define LOGIND_RUNNING() (access("/run/systemd/seats/", F_OK) >= 0)
@@ -22,6 +29,19 @@ load_symbols(const char *module, ...) G_GNUC_NULL_TERMINATED;
const char*
format_process_state(guint state);
+
+EXTERNC
+gchar*
+procman_format_rate(guint64 size, guint64 max, gboolean want_bits);
+
+
+#ifdef __cplusplus
+
+gchar*
+procman_format_size(guint64 size, guint64 max = 0, gboolean want_bits = false);
+gchar*
+procman_format_rate(guint64 size, guint64 max = 0, gboolean want_bits = false);
+
void
procman_debug_real(const char *file, int line, const char *func,
const char *format, ...) G_GNUC_PRINTF(4, 5);
@@ -115,8 +135,6 @@ namespace procman
tree_store_update<const char>(model, iter, column, new_value);
}
- gchar* format_size(guint64 size, guint64 max = 0, bool want_bits = false);
-
gchar* get_nice_level (gint nice);
gchar* get_nice_level_with_priority (gint nice);
@@ -126,5 +144,5 @@ namespace procman
std::string format_network(guint64 rate, guint64 max_rate = 0);
std::string format_network_rate(guint64 rate, guint64 max_rate = 0);
}
-
+#endif /* __cpluspluc */
#endif /* _GSM_UTIL_H_ */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]