[Glade-users] How to get to the label field of a button



--Boundary_(ID_oAqjk8SjIlGAtVPuRxOeQw)
Content-type: text/plain; charset=us-ascii
Content-transfer-encoding: 7BIT

Hey, talk about an answer.  Ask what time it is, and get a thirty-minute
discourse on Egyptian water clocks.  No, really.  Andrae, you are a
prince!  You didn't say, "You dumb s--t, don't you know anything?"
Instead,  you helped me.  I really appreciate the tutorial nature of
your reply.  It solved my immediate problem, but even more importantly,
gave me a brief course on how to use the publicly available data to
solve my own similar problems in the future.  This is what I love about
this list.  I heartily agree with James' post that this should be in the
FAQ.

Thanks again,
Ed

Andrae Muys wrote:



Jered Bolton wrote:

Ed Winchester wrote:

Hi again, all,

I've been trying to get my glade-generated app to compile.  I
know, from
something I read, but can't remember where, that Glade itself will
not
generate code to change the label for a button.  I remember seeing

somewhere an example, but can't for the life of me remember where
I read
that.

What I tried last was:
    gtk_label_set_text (GTK_LABEL(button->label),"New button
label");

I got the error:
    structure has no member named `label'

Please help.

No idea how this works (well I kind of have but....), but try the
following:

   GtkWidget        *label;
    GList            *glist;

  widget = lookup_widget(window_widget_is_on, "slider_button"); /*
may not
need this as long as you have a pointer to the widget you'll be
okay*/

    glist = gtk_container_children( GTK_CONTAINER(widget) );
   label = GTK_WIDGET( glist->data );
    gtk_label_set( GTK_LABEL(label), "FRED");

I found this after trawling through stacks of stuff on the web, all
seemed
a bit mysterious to me, as I too had similar problems in
setting/changing
the label for the button.
I found the answer in a posting from 1998 from someone complaining
about
the lack of useful documentation....
yet I still find myself wandering how the hell did they know to A)
use a
GList, and B) that is has a member called data.  Half the time the
documentation states that the structure should only be accessed
using the
functions given...  which in turn can only be used with this "extra"

knowledge.
I realise this is more of a GTK problem than glade specific, but I'm
sure
there are many other relative "newbies" like myself who feel
slightly lost
at times.

Actually Gtk+ is reasonably well documented (GNOME is sometimes a
different matter).  In this specific case the documentation is clear.
(All quotes are direct cut/paste from
http://developer.gnome.org/doc/API/ )

Reading from the Gtk+ reference for GtkButton :

Object Hierarchy
   GtkObject
    +----GtkWidget
          +----GtkContainer
                +----GtkBin
                      +----GtkButton

Args
   "label"                gchar*               : Read / Write
   "relief"               GtkReliefStyle       : Read / Write

Note that a GtkButton is a GtkBin, so it is a GtkContainer that
supports
a single child widget (in this specific/normal case a GtkLabel).

Also note that the "label" Arg is available, which provides an
immediate
answer to your question, specifically :

                gtk_object_set(GTK_OBJECT(button), "label", "goodbye",
NULL);

You can know this is a gtk_object_* function because you can look in
GGAD, written by Havoc Pennington, and published under an Open licence

(ie, you can dl/read it off the web).  Dead tree version available
from
New Riders IIRC.

If, like me, you have merely forgotten the precise syntax, you just
need
to look at the reference docs for GtkObject, specifically:

++++++++
gtk_object_set ()

 void        gtk_object_set                  (GtkObject *object,
                                              const gchar
*first_arg_name,
                                              ...);

This function sets multiple arguments of an object.

It takes an object, then a list of name/value pairs in a list,
followed
by NULL.

 void set_box_properties(GtkBox* box)
 {
   gtk_object_set(GTK_OBJECT(box), "homogeneous", TRUE,
                                   "spacing", 8,
                                   NULL);
 }
             object :
                     the object whose arguments should be set.
     first_arg_name :
                     the name of the first argument to set.
                ... :
                     the value of the first argument, followed
optionally by more name/value pairs, followed by
                     NULL.
++++++++

However there are at least two other ways of achiving the same end.
As
the GtkButton appears to it's child as a GtkBin (see inheritance
list),
it would make sense that facilities for manipulating it's child would
be
associated with GtkBin, not GtkButton.  So if we take a look at GtkBin

we see:

GtkBin -- a container with just one child.
....
Details

struct GtkBin

 struct GtkBin;

The GtkBin struct contains the following fields. (These fields should
be
considered read-only. They should
never be set by an application.)

 GtkWidget *child;            the child widget.

Which immediately suggests the following code :

        gtk_label_set_text(GTK_LABEL(GTK_BIN(button)->child),
"hello");

(In actual fact this was my immediate response to the question, it's
just the GtkArg approach is most immediately obvious from the
GtkButton
docs)

Of course there is also the child manipulation functions provided by
GtkBin's parent class GtkContainer:

GList*      gtk_container_children          (GtkContainer *container);

I am a little surprised to find this function undocumented, although
it
is listed with it's full signature in the GtkContainer reference, and
is
sufficiently obvious to hardly require documenting.  I guessed
(correctly) from the signature that it returns a linked list of
children
widgets given a container widget.

Taking a look at the GList reference (which is complete except for
complexity info, that is rare in any documentation, but would be
useful
in the glib docs sometimes) :

+++++
Description

The GList structure and its associated functions provide a standard
doubly-linked list data structure.

Each element in the list contains a piece of data, together with
pointers which link to the previous and next
elements in the list. <SNIP: lots of useful info on GList's>
Details

struct GList

 struct GList
 {
   gpointer data;
   GList *next;
   GList *prev;
 };

The GList struct is used for each element in a doubly-linked list. The

data field holds the element's data, which
can be a pointer to any kind of data, or any integer value using the
Type Conversion Macros. The next and prev
pointers are the links to the next and previous elements in the list.

+++++

Which makes the following code snippet easy enough to generate:

     GList *child = gtk_container_children(GTK_CONTAINER(button));
     gtk_label_set_text(GTK_LABEL(child->data), "clicked");

I've attached a small libglade based demo that shows the above in
action. (Total project 115 lines in 3 files in 2.6k)

Andrae Muys



--Boundary_(ID_oAqjk8SjIlGAtVPuRxOeQw)
Content-type: text/html; charset=us-ascii
Content-transfer-encoding: 7BIT

<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
Hey, talk about an answer.&nbsp; Ask what time it is, and get a thirty-minute
discourse on Egyptian water clocks.&nbsp; No, really.&nbsp; Andrae, you
are a prince!&nbsp; You didn't say, "You dumb s--t, don't you know anything?"&nbsp;
Instead,&nbsp; you helped me.&nbsp; I really appreciate the tutorial nature
of your reply.&nbsp; It solved my immediate problem, but even more importantly,
gave me a brief course on how to use the publicly available data to solve
my own similar problems in the future.&nbsp; This is what I love about
this list.&nbsp; I heartily agree with James' post that this should be
in the FAQ.
<p>Thanks again,
<br>Ed
<p>Andrae Muys wrote:
<blockquote TYPE=CITE>&nbsp;
<p><font size=-1>Jered Bolton wrote:</font>
<br><font size=-1>></font>
<br><font size=-1>> Ed Winchester wrote:</font>
<br><font size=-1>></font>
<br><font size=-1>> > Hi again, all,</font>
<br><font size=-1>> ></font>
<br><font size=-1>> > I've been trying to get my glade-generated app to
compile.&nbsp; I know, from</font>
<br><font size=-1>> > something I read, but can't remember where, that
Glade itself will not</font>
<br><font size=-1>> > generate code to change the label for a button.&nbsp;
I remember seeing</font>
<br><font size=-1>> > somewhere an example, but can't for the life of me
remember where I read</font>
<br><font size=-1>> > that.</font>
<br><font size=-1>> ></font>
<br><font size=-1>> > What I tried last was:</font>
<br><font size=-1>> >&nbsp;&nbsp;&nbsp;&nbsp; gtk_label_set_text (GTK_LABEL(button->label),"New
button label");</font>
<br><font size=-1>> ></font>
<br><font size=-1>> > I got the error:</font>
<br><font size=-1>> >&nbsp;&nbsp;&nbsp;&nbsp; structure has no member named
`label'</font>
<br><font size=-1>> ></font>
<br><font size=-1>> > Please help.</font>
<br><font size=-1>></font>
<br><font size=-1>> No idea how this works (well I kind of have but....),
but try the</font>
<br><font size=-1>> following:</font>
<br><font size=-1>></font>
<br><font size=-1>>&nbsp;&nbsp;&nbsp; GtkWidget&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
*label;</font>
<br><font size=-1>>&nbsp;&nbsp;&nbsp;&nbsp; 
GList&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
*glist;</font>
<br><font size=-1>></font>
<br><font size=-1>>&nbsp;&nbsp; widget = lookup_widget(window_widget_is_on,
"slider_button"); /* may not</font>
<br><font size=-1>> need this as long as you have a pointer to the widget
you'll be okay*/</font>
<br><font size=-1>></font>
<br><font size=-1>>&nbsp;&nbsp;&nbsp;&nbsp; glist = gtk_container_children(
GTK_CONTAINER(widget) );</font>
<br><font size=-1>>&nbsp;&nbsp;&nbsp; label = GTK_WIDGET( glist->data );</font>
<br><font size=-1>>&nbsp;&nbsp;&nbsp;&nbsp; gtk_label_set( GTK_LABEL(label),
"FRED");</font>
<br><font size=-1>></font>
<br><font size=-1>> I found this after trawling through stacks of stuff
on the web, all seemed</font>
<br><font size=-1>> a bit mysterious to me, as I too had similar problems
in setting/changing</font>
<br><font size=-1>> the label for the button.</font>
<br><font size=-1>> I found the answer in a posting from 1998 from someone
complaining about</font>
<br><font size=-1>> the lack of useful documentation....</font>
<br><font size=-1>> yet I still find myself wandering how the hell did
they know to A) use a</font>
<br><font size=-1>> GList, and B) that is has a member called data.&nbsp;
Half the time the</font>
<br><font size=-1>> documentation states that the structure should only
be accessed using the</font>
<br><font size=-1>> functions given...&nbsp; which in turn can only be
used with this "extra"</font>
<br><font size=-1>> knowledge.</font>
<br><font size=-1>> I realise this is more of a GTK problem than glade
specific, but I'm sure</font>
<br><font size=-1>> there are many other relative "newbies" like myself
who feel slightly lost</font>
<br><font size=-1>> at times.</font>
<p><font size=-1>Actually Gtk+ is reasonably well documented (GNOME is
sometimes a</font>
<br><font size=-1>different matter).&nbsp; In this specific case the documentation
is clear.</font>
<br><font size=-1>(All quotes are direct cut/paste from</font>
<br><font size=-1><a href="http://developer.gnome.org/doc/API/"; 
TARGET="_blank">http://developer.gnome.org/doc/API/</a>
)</font>
<p><font size=-1>Reading from the Gtk+ reference for GtkButton :</font>
<p><font size=-1>Object Hierarchy</font>
<br><font size=-1>&nbsp;&nbsp; GtkObject</font>
<br><font size=-1>&nbsp;&nbsp;&nbsp; +----GtkWidget</font>
<br><font size=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+----GtkContainer</font>
<br><font size=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+----GtkBin</font>
<br><font 
size=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+----GtkButton</font>
<p><font size=-1>Args</font>
<br><font size=-1>&nbsp;&nbsp; 
"label"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
gchar*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
: Read / Write</font>
<br><font size=-1>&nbsp;&nbsp; 
"relief"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
GtkReliefStyle&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Read / Write</font>
<p><font size=-1>Note that a GtkButton is a GtkBin, so it is a GtkContainer
that supports</font>
<br><font size=-1>a single child widget (in this specific/normal case a
GtkLabel).</font>
<p><font size=-1>Also note that the "label" Arg is available, which provides
an immediate</font>
<br><font size=-1>answer to your question, specifically :</font>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<font size=-1>gtk_object_set(GTK_OBJECT(button), "label", "goodbye", NULL);</font>
<p><font size=-1>You can know this is a gtk_object_* function because you
can look in</font>
<br><font size=-1>GGAD, written by Havoc Pennington, and published under
an Open licence</font>
<br><font size=-1>(ie, you can dl/read it off the web).&nbsp; Dead tree
version available from</font>
<br><font size=-1>New Riders IIRC.</font>
<p><font size=-1>If, like me, you have merely forgotten the precise syntax,
you just need</font>
<br><font size=-1>to look at the reference docs for GtkObject, specifically:</font>
<p><font size=-1>++++++++</font>
<br><font size=-1>gtk_object_set ()</font>
<p><font size=-1>&nbsp;void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
gtk_object_set&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
(GtkObject *object,</font>
<br><font 
size=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
const gchar</font>
<br><font size=-1>*first_arg_name,</font>
<br><font 
size=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
...);</font>
<p><font size=-1>This function sets multiple arguments of an object.</font>
<p><font size=-1>It takes an object, then a list of name/value pairs in
a list, followed</font>
<br><font size=-1>by NULL.</font>
<p><font size=-1>&nbsp;void set_box_properties(GtkBox* box)</font>
<br><font size=-1>&nbsp;{</font>
<br><font size=-1>&nbsp;&nbsp; gtk_object_set(GTK_OBJECT(box), "homogeneous",
TRUE,</font>
<br><font 
size=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
"spacing", 8,</font>
<br><font 
size=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
NULL);</font>
<br><font size=-1>&nbsp;}</font>
<br><font size=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
object :</font>
<br><font 
size=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
the object whose arguments should be set.</font>
<br><font size=-1>&nbsp;&nbsp;&nbsp;&nbsp; first_arg_name :</font>
<br><font 
size=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
the name of the first argument to set.</font>
<br><font size=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
... :</font>
<br><font 
size=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
the value of the first argument, followed</font>
<br><font size=-1>optionally by more name/value pairs, followed by</font>
<br><font 
size=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
NULL.</font>
<br><font size=-1>++++++++</font>
<p><font size=-1>However there are at least two other ways of achiving
the same end.&nbsp; As</font>
<br><font size=-1>the GtkButton appears to it's child as a GtkBin (see
inheritance list),</font>
<br><font size=-1>it would make sense that facilities for manipulating
it's child would be</font>
<br><font size=-1>associated with GtkBin, not GtkButton.&nbsp; So if we
take a look at GtkBin</font>
<br><font size=-1>we see:</font>
<p><font size=-1>GtkBin -- a container with just one child.</font>
<br><font size=-1>....</font>
<br><font size=-1>Details</font>
<p><font size=-1>struct GtkBin</font>
<p><font size=-1>&nbsp;struct GtkBin;</font>
<p><font size=-1>The GtkBin struct contains the following fields. (These
fields should be</font>
<br><font size=-1>considered read-only. They should</font>
<br><font size=-1>never be set by an application.)</font>
<p><font size=-1>&nbsp;GtkWidget *child;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
the child widget.</font>
<p><font size=-1>Which immediately suggests the following code :</font>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font 
size=-1>gtk_label_set_text(GTK_LABEL(GTK_BIN(button)->child),
"hello");</font>
<p><font size=-1>(In actual fact this was my immediate response to the
question, it's</font>
<br><font size=-1>just the GtkArg approach is most immediately obvious
from the GtkButton</font>
<br><font size=-1>docs)</font>
<p><font size=-1>Of course there is also the child manipulation functions
provided by</font>
<br><font size=-1>GtkBin's parent class GtkContainer:</font>
<p><font size=-1>GList*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
gtk_container_children&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
(GtkContainer *container);</font>
<p><font size=-1>I am a little surprised to find this function undocumented,
although it</font>
<br><font size=-1>is listed with it's full signature in the GtkContainer
reference, and is</font>
<br><font size=-1>sufficiently obvious to hardly require documenting.&nbsp;
I guessed</font>
<br><font size=-1>(correctly) from the signature that it returns a linked
list of children</font>
<br><font size=-1>widgets given a container widget.</font>
<p><font size=-1>Taking a look at the GList reference (which is complete
except for</font>
<br><font size=-1>complexity info, that is rare in any documentation, but
would be useful</font>
<br><font size=-1>in the glib docs sometimes) :</font>
<p><font size=-1>+++++</font>
<br><font size=-1>Description</font>
<p><font size=-1>The GList structure and its associated functions provide
a standard</font>
<br><font size=-1>doubly-linked list data structure.</font>
<p><font size=-1>Each element in the list contains a piece of data, together
with</font>
<br><font size=-1>pointers which link to the previous and next</font>
<br><font size=-1>elements in the list. &lt;SNIP: lots of useful info on
GList's></font>
<br><font size=-1>Details</font>
<p><font size=-1>struct GList</font>
<p><font size=-1>&nbsp;struct GList</font>
<br><font size=-1>&nbsp;{</font>
<br><font size=-1>&nbsp;&nbsp; gpointer data;</font>
<br><font size=-1>&nbsp;&nbsp; GList *next;</font>
<br><font size=-1>&nbsp;&nbsp; GList *prev;</font>
<br><font size=-1>&nbsp;};</font>
<p><font size=-1>The GList struct is used for each element in a doubly-linked
list. The</font>
<br><font size=-1>data field holds the element's data, which</font>
<br><font size=-1>can be a pointer to any kind of data, or any integer
value using the</font>
<br><font size=-1>Type Conversion Macros. The next and prev</font>
<br><font size=-1>pointers are the links to the next and previous elements
in the list.</font>
<p><font size=-1>+++++</font>
<p><font size=-1>Which makes the following code snippet easy enough to
generate:</font>
<p><font size=-1>&nbsp;&nbsp;&nbsp;&nbsp; GList *child = gtk_container_children(GTK_CONTAINER(button));</font>
<br><font size=-1>&nbsp;&nbsp;&nbsp;&nbsp; gtk_label_set_text(GTK_LABEL(child->data),
"clicked");</font>
<p><font size=-1>I've attached a small libglade based demo that shows the
above in</font>
<br><font size=-1>action. (Total project 115 lines in 3 files in 2.6k)</font>
<p><font size=-1>Andrae Muys</font>
<br>&nbsp;
<br>&nbsp;</blockquote>
</html>

--Boundary_(ID_oAqjk8SjIlGAtVPuRxOeQw)--





[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]