|
Server : Apache/2.2.17 (Unix) mod_ssl/2.2.17 OpenSSL/0.9.8e-fips-rhel5 DAV/2 PHP/5.2.17 System : Linux localhost 2.6.18-419.el5 #1 SMP Fri Feb 24 22:47:42 UTC 2017 x86_64 User : nobody ( 99) PHP Version : 5.2.17 Disable Function : NONE Directory : /usr/share/gtk-doc/html/libbonobo/ |
Upload File : |
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Properties</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
<link rel="start" href="index.html" title="Libbonobo Reference Manual">
<link rel="up" href="property-bags.html" title="Property Bags, Events, Listeners">
<link rel="prev" href="property-bags.html" title="Property Bags, Events, Listeners">
<link rel="next" href="libbonobo-bonobo-event-source.html" title="bonobo-event-source">
<meta name="generator" content="GTK-Doc V1.7 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="General">
<link rel="chapter" href="factories.html" title="Objects, Factories, Reference Counting">
<link rel="chapter" href="property-bags.html" title="Property Bags, Events, Listeners">
<link rel="chapter" href="monikers.html" title="Monikers">
<link rel="chapter" href="streams.html" title="Storages and Streams">
<link rel="chapter" href="persist.html" title="Persistency">
<link rel="chapter" href="misc.html" title="Miscellaneous">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="property-bags.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="property-bags.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<th width="100%" align="center">Libbonobo Reference Manual</th>
<td><a accesskey="n" href="libbonobo-bonobo-event-source.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
</tr></table>
<div class="refentry" lang="en">
<a name="properties"></a><div class="titlepage"></div>
<div class="refsect1" lang="en">
<a name="id2714056"></a><h2>Properties</h2>
<p>Bonobo component properties, version 0.1 by Michael
Meeks <mmeeks@gnu.org></p>
<p>A brief discussion of how to use the property API to add
a simple to use configuration mechanism to your bonobo
component.</p>
<div class="refsect2" lang="en">
<a name="id2714073"></a><h3>Properties and bags</h3>
<p>A property is an attribute that is attached to a
Bonobo object. It can have any type, although the
standard types <span class="type">boolean</span>,
<span class="type">long</span>, <span class="type">float</span>, double, string
are handled in a convenient fashion. Properties are
attached to a <code class="classname">PropertyBag</code>
object that is attached to your control or component
in some way.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<a name="id2715062"></a><h3>BonoboArgs</h3>
<p>A bonobo arg contains the value of a property whilst
it is 'in flight' between a property and a
requestor. The bonobo arg system is designed to make
ORBit's 'any' code easier to use and less error prone
- it is however simply a wrapper around a
<span class="type">CORBA_any</span>.</p>
<p>A number of macros and helper functions are provided
in <code class="filename">bonobo-arg.h</code>. Particularly,
the type macros of BonoboArgType eg.</p>
<p><code class="literal">BONOBO_ARG_BOOLEAN, BONOBO_ARG_LONG,
BONOBO_ARG_STRING</code></p>
<p>And a number of access procedures for getting and
setting standard values from a BonoboArg. Eg. if 'a'
is a <span class="type">BonoboArg *</span> we should use:</p>
<p><code class="literal">BONOBO_ARG_GET_STRING (a)</code> to get its string value</p>
<p> or </p>
<p><code class="literal">BONOBO_ARG_SET_STRING (a, "GNU")</code>to set its string value</p>
<p>NB. Passing a NULL string to
<code class="function">BONOBO_ARG_SET_STRING</code> is equivalent
to passing an empty string.</p>
<p> The bonobo-arg code also provides functions for
mapping <span class="type">GParamSpec</span>s to BonoboArgs and
vice-versa.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<a name="id2715153"></a><h3>PropertyBag creation</h3>
<p>To add properties to an object first we must create
a property bag hence:</p>
<pre class="synopsis">
BonoboPropertyBag *bonobo_property_bag_new (BonoboPropertyGetFn get_prop,
BonoboPropertySetFn set_prop,
gpointer user_data);
</pre>
<p> Each property has a get / set / user_data (GSU)
triplet that handles that property's behavior. In a
typical scenario all object properties in a bag
utilise the same GSU triplet, and are identified
inside the get / set functions by a unique enumerated
constant arg_id. Inside the function this arg_id can
then be used with a switch statement to provide
efficient (de)multiplexing of property
requests. </p>
<p> For particularly obtuse persons wanting more
flexibility it is possible to specify the GSU triplet
per property using the add_full variant. </p>
</div>
<hr>
<div class="refsect2" lang="en">
<a name="id2715189"></a><h3>Property Creation</h3>
<p> Each basic property is created by this function: </p>
<pre class="synopsis">
void bonobo_property_bag_add (BonoboPropertyBag *pb,
const char *name,
int idx,
BonoboArgType type,
BonoboArg *default_value,
const char *docstring,
BonoboPropertyFlags flags);
</pre>
<p> It looks horrendous, but is horribly simple in most
cases; the idx is the index that will be passed to a
generic get / set function for this property. The type
is one of the BonoboArgType macros discussed in
section 2 which maps to an ORBit TypeCode [ hence any
arbitary type can be added without the property-bag
knowing anything about it ( allocation of that type is
the users responsibility ) ]. Default_value is either
NULL or a value created thusly:</p>
<pre class="programlisting">
BonoboArg *def = bonobo_arg_new (BONOBO_ARG_DOUBLE);
BONOBO_ARG_SET_DOUBLE (def, 0.3127);
</pre>
<p>It's reference is stored in the property_bag.</p>
<p> The rest of the code is internal and extremely
transparent. In order to implement the get / set
functions I would copy & paste the sample code in:
<code class="filename">libbonoboui/samples/controls/bonobo-sample-controls.c.
</code></p>
</div>
<hr>
<div class="refsect2" lang="en">
<a name="id2715247"></a><h3>Wrapping GObjects</h3>
<p> If you have already implemented a GObject that
has the set of properties that you wish to export as
Bonobo properties then it is trivial to add them to
the property bag using a transparent mapping. This
means that you do not have to write any more code,
simply use:</p>
<pre class="programlisting">
GParamSpec **pspecs;
guint n_props;
pspecs = g_object_class_list_properties (
G_OBJECT_GET_CLASS (my_object), &n_props);
bonobo_property_bag_map_params (pb, my_object, pspecs, n_props);
g_free (pspecs)
</pre>
</div>
<hr>
<div class="refsect2" lang="en">
<a name="id2715270"></a><h3>Using properties in your client application</h3>
<p>There are some fairly typesafe but convenient vararg
ways to get remote properties. Example:</p>
<div class="informalexample"><pre class="programlisting">
CORBA_double i;
bonobo_widget_get_property (control, "value",
TC_CORBA_double, &i, NULL);
i+= 0.37;
bonobo_widget_set_property (control, "value",
TC_CORBA_double, i, NULL);
</pre></div>
<p>The alternative being the even more type safe version:</p>
<pre class="programlisting">
bonobo_property_bag_client_get_value_gdouble (pb, "value", &i);
</pre>
</div>
</div>
</div>
</body>
</html>