00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00030 #include "config.h"
00031
00032 #include <glib.h>
00033 #include <stdlib.h>
00034 #include <string.h>
00035
00036 #include "duifield.h"
00037 #include "duifield-gobj.h"
00038 #include "duifilter.h"
00039 #include "duiresolver.h"
00040 #include "interface.h"
00041 #include "perr.h"
00042
00043
00044 struct gobj_field_s
00045 {
00046 DuiInterface *gobj_root;
00047 gchar * property;
00048 gchar * cache_value;
00049 };
00050
00051
00052
00053 static void
00054 gobj_field_clear (DuiField *f)
00055 {
00056 struct gobj_field_s * gf = (struct gobj_field_s*) get_gobj_field (f);
00057 g_free (f->fieldname);
00058 g_free (gf->property);
00059 g_free (gf->cache_value);
00060 f->type = DUI_FIELD_NONE;
00061 }
00062
00063
00064
00065 static const char *
00066 get_gobj_value (DuiField *fs)
00067 {
00068 GObject *gob;
00069 GParamSpec *ps;
00070 struct gobj_field_s * gf = (struct gobj_field_s*) get_gobj_field (fs);
00071
00072 gob = dui_interface_find_object_by_name(gf->gobj_root,
00073 fs->fieldname);
00074 if (!gob)
00075 {
00076 PERR ("Can't find object named \'%s\'\n", fs->fieldname);
00077 return NULL;
00078 }
00079
00080 ps = g_object_class_find_property
00081 (G_OBJECT_GET_CLASS(gob), gf->property);
00082 if (NULL == ps)
00083 {
00084 PERR ("Cannot find parameter to get %s:%s\n",
00085 fs->fieldname, gf->property);
00086 return NULL;
00087 }
00088 if (G_IS_PARAM_SPEC_STRING(ps))
00089 {
00090 GValue * val;
00091 const gchar * str;
00092
00093 val = g_new0(GValue, 1);
00094 g_value_init (val, G_TYPE_STRING);
00095 g_object_get_property (gob, gf->property, val);
00096 str = g_value_get_string (val);
00097 g_free (val);
00098 return str;
00099 }
00100
00101 if (G_IS_PARAM_SPEC_INT(ps))
00102 {
00103 GValue * val;
00104 gint v;
00105
00106 val = g_new0(GValue, 1);
00107 g_value_init (val, G_TYPE_INT);
00108 g_object_get_property (gob, gf->property, val);
00109 v = g_value_get_int (val);
00110 g_free (gf->cache_value);
00111 gf->cache_value = g_strdup_printf ("%d", v);
00112 g_free (val);
00113 return gf->cache_value;
00114 }
00115
00116 if (G_IS_PARAM_SPEC_BOOLEAN(ps))
00117 {
00118 GValue * val;
00119 gboolean v;
00120
00121 val = g_new0(GValue, 1);
00122 g_value_init (val, G_TYPE_BOOLEAN);
00123 g_object_get_property (gob, gf->property, val);
00124 v = g_value_get_boolean (val);
00125 g_free (val);
00126 if (v)
00127 {
00128 return "t";
00129 }
00130 return "f";
00131 }
00132
00133 if (G_IS_PARAM_SPEC_FLOAT(ps))
00134 {
00135 GValue * val;
00136 float v;
00137 val = g_new0(GValue, 1);
00138 g_value_init (val, G_TYPE_FLOAT);
00139 g_object_get_property (gob, gf->property, val);
00140 v = g_value_get_float (val);
00141 g_free (gf->cache_value);
00142 gf->cache_value = g_strdup_printf ("%g", v);
00143 g_free (val);
00144 return gf->cache_value;
00145 }
00146
00147 if (G_IS_PARAM_SPEC_DOUBLE(ps))
00148 {
00149 GValue * val;
00150 double v;
00151
00152 val = g_new0 (GValue, 1);
00153 g_value_init (val, G_TYPE_DOUBLE);
00154 g_object_get_property (gob, gf->property, val);
00155 v = g_value_get_double (val);
00156 g_free (val);
00157 g_free (gf->cache_value);
00158 gf->cache_value = g_strdup_printf ("%g", v);
00159 return gf->cache_value;
00160 }
00161
00162 PERR ("unsupported type %s for %s:%s\n",
00163 G_PARAM_SPEC_TYPE_NAME(ps), fs->fieldname, gf->property);
00164 return NULL;
00165 }
00166
00167 static void
00168 set_gobj_value (DuiField *fs, const gchar *value)
00169 {
00170 GObject *gob;
00171 GParamSpec *ps;
00172 struct gobj_field_s * gf = (struct gobj_field_s*) get_gobj_field (fs);
00173
00174 gob = dui_interface_find_object_by_name(gf->gobj_root,
00175 fs->fieldname);
00176 if (!gob)
00177 {
00178 PERR ("Can't find object named \'%s\'\n", fs->fieldname);
00179 return;
00180 }
00181
00182 ps = g_object_class_find_property
00183 (G_OBJECT_GET_CLASS(gob), gf->property);
00184 if (NULL == ps)
00185 {
00186 PERR ("Cannot find parameter to set %s:%s\n",
00187 fs->fieldname, gf->property);
00188 return;
00189 }
00190 if (G_IS_PARAM_SPEC_STRING(ps))
00191 {
00192 GValue * val;
00193 val = g_new0 (GValue, 1);
00194 g_value_init (val, G_TYPE_STRING);
00195 g_value_set_string (val, value);
00196 g_object_set_property (gob, gf->property, val);
00197 g_free (val);
00198 return;
00199 }
00200 else
00201 if (G_IS_PARAM_SPEC_INT(ps))
00202 {
00203 GValue * val;
00204 gint ii;
00205 val = g_new0 (GValue, 1);
00206 g_value_init (val, G_TYPE_INT);
00207 ii = atoi (value);
00208 g_value_set_int (val, ii);
00209 g_object_set_property (gob, gf->property, val);
00210 g_free (val);
00211 return;
00212 }
00213 else
00214 if (G_IS_PARAM_SPEC_BOOLEAN(ps))
00215 {
00216 GValue * val;
00217 gboolean ii;
00218 val = g_new0 (GValue, 1);
00219 g_value_init (val, G_TYPE_BOOLEAN);
00220 ii = dui_util_bool_to_int (value);
00221 g_value_set_boolean (val, ii);
00222 g_object_set_property (gob, gf->property, val);
00223 g_free (val);
00224 return;
00225 }
00226 else
00227 if (G_IS_PARAM_SPEC_FLOAT(ps))
00228 {
00229 GValue * val;
00230 gfloat ff;
00231 val = g_new0 (GValue, 1);
00232 g_value_init (val, G_TYPE_FLOAT);
00233 ff = atof (value);
00234 g_value_set_float (val, ff);
00235 g_object_set_property (gob, gf->property, val);
00236 g_free (val);
00237 return;
00238 }
00239 else
00240 if (G_IS_PARAM_SPEC_DOUBLE(ps))
00241 {
00242 GValue * val;
00243 gdouble ff;
00244 val = g_new0 (GValue, 1);
00245 g_value_init (val, G_TYPE_DOUBLE);
00246 ff = atof (value);
00247 g_value_set_double (val, ff);
00248 g_object_set_property (gob, gf->property, val);
00249 g_free (val);
00250 return;
00251 }
00252 else
00253 {
00254 PERR ("unsupported type %s for %s:%s\n",
00255 G_PARAM_SPEC_TYPE_NAME(ps), fs->fieldname, gf->property);
00256 return;
00257 }
00258 }
00259
00260 void
00261 dui_field_set_gobj (DuiField *ft, const gchar * obj,
00262 const gchar * prop)
00263 {
00264 struct gobj_field_s * gf = (struct gobj_field_s*) get_gobj_field (ft);
00265
00266 ft->type = DUI_FIELD_GOBJ;
00267 ft->fieldname = g_strdup (obj);
00268
00269 ft->get_field_value = get_gobj_value;
00270 ft->set_field_value = set_gobj_value;
00271 ft->clear_field = gobj_field_clear;
00272
00273 gf->property = g_strdup (prop);
00274 gf->cache_value = NULL;
00275 }
00276
00277
00278
00279 void
00280 dui_resolver_resolve_gobj (DuiResolver *res , DuiInterface *rot)
00281 {
00282 GList *node;
00283 struct gobj_field_s * gf;;
00284
00285 for (node = res->field_list; node; node=node->next)
00286 {
00287 DuiField *fld = node->data;
00288 if (!DUI_FIELD_IS_TYPE(fld,DUI_FIELD_GOBJ)) continue;
00289 gf = (struct gobj_field_s*) get_gobj_field (fld);
00290
00291 gf->gobj_root = rot;
00292 }
00293 }
00294
00295