3
* Copyright (C) 2003 Vivien Malerba
5
* This program is free software; you can redistribute it and/or
6
* modify it under the terms of the GNU General Public License as
7
* published by the Free Software Foundation; either version 2 of the
8
* License, or (at your option) any later version.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with this program; if not, write to the Free Software
17
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
21
#include "mg-entry-wrapper.h"
22
#include <libmergeant/mg-data-handler.h>
24
static void mg_entry_wrapper_class_init (MgEntryWrapperClass *class);
25
static void mg_entry_wrapper_init (MgEntryWrapper *wid);
26
static void mg_entry_wrapper_dispose (GObject *object);
28
static void mg_entry_wrapper_set_property (GObject *object,
32
static void mg_entry_wrapper_get_property (GObject *object,
37
static void contents_changed_cb (GtkWidget *entry, MgEntryWrapper *mgwrap);
38
static void check_correct_init (MgEntryWrapper *wid);
39
static void block_signals (MgEntryWrapper *wid);
40
static void unblock_signals (MgEntryWrapper *wid);
42
/* MgDataEntry interface */
43
static void mg_entry_wrapper_data_entry_init (MgDataEntryIface *iface);
44
static void mg_entry_wrapper_set_value_type (MgDataEntry *de, GdaValueType type);
45
static GdaValueType mg_entry_wrapper_get_value_type (MgDataEntry *de);
46
static void mg_entry_wrapper_set_value (MgDataEntry *de, const GdaValue *value);
47
static GdaValue *mg_entry_wrapper_get_value (MgDataEntry *de);
48
static void mg_entry_wrapper_set_value_orig (MgDataEntry *de, const GdaValue *value);
49
static const GdaValue *mg_entry_wrapper_get_value_orig (MgDataEntry *de);
50
static void mg_entry_wrapper_set_value_default (MgDataEntry *de, const GdaValue *value);
51
static void mg_entry_wrapper_set_attributes (MgDataEntry *de, guint attrs, guint mask);
52
static guint mg_entry_wrapper_get_attributes (MgDataEntry *de);
53
static MgDataHandler *mg_entry_wrapper_get_handler (MgDataEntry *de);
54
static gboolean mg_entry_wrapper_expand_in_layout (MgDataEntry *de);
61
PROP_SET_DEFAULT_IF_INVALID
70
static gint mg_entry_wrapper_signals[LAST_SIGNAL] = { };
73
struct _MgEntryWrapperPriv {
74
gboolean impl_is_correct;
76
MgEntryWrapperClass *real_class;
77
guint signals_blocked;
81
GdaValue *value_default; /* Can be of any type, not just 'type' */
84
gboolean default_forced;
86
gboolean null_possible;
87
gboolean default_possible;
88
gboolean show_actions;
91
gboolean set_default_if_invalid;
94
/* get a pointer to the parents to be able to call their destructor */
95
static GObjectClass *parent_class = NULL;
98
mg_entry_wrapper_get_type (void)
100
static GType type = 0;
103
static const GTypeInfo info = {
104
sizeof (MgEntryWrapperClass),
105
(GBaseInitFunc) NULL,
106
(GBaseFinalizeFunc) NULL,
107
(GClassInitFunc) mg_entry_wrapper_class_init,
110
sizeof (MgEntryWrapper),
112
(GInstanceInitFunc) mg_entry_wrapper_init
115
static const GInterfaceInfo data_entry_info = {
116
(GInterfaceInitFunc) mg_entry_wrapper_data_entry_init,
121
type = g_type_register_static (MG_ENTRY_SHELL_TYPE, "MgEntryWrapper", &info, 0);
122
g_type_add_interface_static (type, MG_DATA_ENTRY_TYPE, &data_entry_info);
128
mg_entry_wrapper_data_entry_init (MgDataEntryIface *iface)
130
iface->set_value_type = mg_entry_wrapper_set_value_type;
131
iface->get_value_type = mg_entry_wrapper_get_value_type;
132
iface->set_value = mg_entry_wrapper_set_value;
133
iface->get_value = mg_entry_wrapper_get_value;
134
iface->set_value_orig = mg_entry_wrapper_set_value_orig;
135
iface->get_value_orig = mg_entry_wrapper_get_value_orig;
136
iface->set_value_default = mg_entry_wrapper_set_value_default;
137
iface->set_attributes = mg_entry_wrapper_set_attributes;
138
iface->get_attributes = mg_entry_wrapper_get_attributes;
139
iface->get_handler = mg_entry_wrapper_get_handler;
140
iface->expand_in_layout = mg_entry_wrapper_expand_in_layout;
145
mg_entry_wrapper_class_init (MgEntryWrapperClass *class)
147
GObjectClass *object_class = G_OBJECT_CLASS (class);
149
parent_class = g_type_class_peek_parent (class);
151
/* virtual functions */
152
class->create_entry = NULL;
153
class->real_set_value = NULL;
154
class->real_get_value = NULL;
157
object_class->set_property = mg_entry_wrapper_set_property;
158
object_class->get_property = mg_entry_wrapper_get_property;
159
g_object_class_install_property (object_class, PROP_SET_DEFAULT_IF_INVALID,
160
g_param_spec_boolean ("set_default_if_invalid", NULL, NULL, FALSE,
161
(G_PARAM_READABLE | G_PARAM_WRITABLE)));
163
object_class->dispose = mg_entry_wrapper_dispose;
167
check_correct_init (MgEntryWrapper *mgwrap)
169
if (!mgwrap->priv->impl_is_correct) {
170
GtkWidget *entry = NULL;
171
MgEntryWrapperClass *class;
172
gboolean class_impl_error = FALSE;;
174
class = MG_ENTRY_WRAPPER_CLASS (G_OBJECT_GET_CLASS (mgwrap));
175
if (! class->create_entry) {
176
g_warning ("create_entry () virtual function not implemented for object class %s\n",
177
G_OBJECT_TYPE_NAME (mgwrap));
178
class_impl_error = TRUE;
180
if (! class->real_set_value) {
181
g_warning ("real_set_value () virtual function not implemented for object class %s\n",
182
G_OBJECT_TYPE_NAME (mgwrap));
183
class_impl_error = TRUE;
185
if (! class->real_get_value) {
186
g_warning ("real_get_value () virtual function not implemented for object class %s\n",
187
G_OBJECT_TYPE_NAME (mgwrap));
188
class_impl_error = TRUE;
190
if (! class->connect_signals) {
191
g_warning ("connect_signals () virtual function not implemented for object class %s\n",
192
G_OBJECT_TYPE_NAME (mgwrap));
193
class_impl_error = TRUE;
195
if (! class->expand_in_layout) {
196
g_warning ("expand_in_layout () virtual function not implemented for object class %s\n",
197
G_OBJECT_TYPE_NAME (mgwrap));
198
class_impl_error = TRUE;
201
if (!class_impl_error) {
202
mgwrap->priv->real_class = class;
203
mgwrap->priv->impl_is_correct = TRUE;
204
entry = (*mgwrap->priv->real_class->create_entry) (mgwrap);
206
mg_entry_shell_pack_entry (MG_ENTRY_SHELL (mgwrap), entry);
207
gtk_widget_show (entry);
208
mgwrap->priv->entry = entry;
210
(*mgwrap->priv->real_class->connect_signals) (mgwrap, G_CALLBACK (contents_changed_cb));
213
/* we need to exit because the program WILL BE unstable and WILL crash */
214
g_assert_not_reached ();
220
block_signals (MgEntryWrapper *mgwrap)
222
mgwrap->priv->signals_blocked ++;
226
unblock_signals (MgEntryWrapper *mgwrap)
228
mgwrap->priv->signals_blocked --;
233
mg_entry_wrapper_init (MgEntryWrapper *mgwrap)
235
/* Private structure */
236
mgwrap->priv = g_new0 (MgEntryWrapperPriv, 1);
237
mgwrap->priv->impl_is_correct = FALSE;
238
mgwrap->priv->entry = NULL;
239
mgwrap->priv->real_class = NULL;
240
mgwrap->priv->signals_blocked = 0;
242
mgwrap->priv->type = GDA_VALUE_TYPE_UNKNOWN;
243
mgwrap->priv->value_orig = NULL;
244
mgwrap->priv->value_default = NULL;
246
mgwrap->priv->null_forced = FALSE;
247
mgwrap->priv->default_forced = FALSE;
249
mgwrap->priv->null_possible = TRUE;
250
mgwrap->priv->default_possible = FALSE;
251
mgwrap->priv->show_actions = TRUE;
253
mgwrap->priv->set_default_if_invalid = FALSE;
257
mg_entry_wrapper_dispose (GObject *object)
259
MgEntryWrapper *mgwrap;
261
g_return_if_fail (object != NULL);
262
g_return_if_fail (IS_MG_ENTRY_WRAPPER (object));
264
mgwrap = MG_ENTRY_WRAPPER (object);
267
if (mgwrap->priv->value_orig)
268
gda_value_free (mgwrap->priv->value_orig);
269
if (mgwrap->priv->value_default)
270
gda_value_free (mgwrap->priv->value_default);
272
g_free (mgwrap->priv);
276
/* for the parent class */
277
parent_class->dispose (object);
282
mg_entry_wrapper_set_property (GObject *object,
287
MgEntryWrapper *mgwrap = MG_ENTRY_WRAPPER (object);
290
case PROP_SET_DEFAULT_IF_INVALID:
291
if (mgwrap->priv->set_default_if_invalid != g_value_get_boolean (value)) {
294
mgwrap->priv->set_default_if_invalid = g_value_get_boolean (value);
295
attrs = mg_data_entry_get_attributes (MG_DATA_ENTRY (mgwrap));
297
if (mgwrap->priv->set_default_if_invalid && (attrs & MG_DATA_ENTRY_DATA_NON_VALID)) {
298
GdaValue *sane_value;
302
check_correct_init (mgwrap);
303
dh = mg_data_entry_get_handler (MG_DATA_ENTRY (mgwrap));
304
type = mg_data_entry_get_value_type (MG_DATA_ENTRY (mgwrap));
305
sane_value = mg_data_handler_get_sane_init_value (dh, type);
306
(*mgwrap->priv->real_class->real_set_value) (mgwrap, sane_value);
307
gda_value_free (sane_value);
316
mg_entry_wrapper_get_property (GObject *object,
321
MgEntryWrapper *mgwrap = MG_ENTRY_WRAPPER (object);
324
case PROP_SET_DEFAULT_IF_INVALID:
325
g_value_set_boolean (value, mgwrap->priv->set_default_if_invalid);
332
static void mg_entry_wrapper_emit_signal (MgEntryWrapper *mgwrap);
334
contents_changed_cb (GtkWidget *entry, MgEntryWrapper *mgwrap)
336
if (! mgwrap->priv->signals_blocked) {
337
mgwrap->priv->null_forced = FALSE;
338
mgwrap->priv->default_forced = FALSE;
339
mg_entry_wrapper_emit_signal (mgwrap);
344
mg_entry_wrapper_emit_signal (MgEntryWrapper *mgwrap)
346
if (! mgwrap->priv->signals_blocked) {
348
g_print (">> 'CONTENTS_MODIFIED' from %s\n", __FUNCTION__);
350
g_signal_emit_by_name (G_OBJECT (mgwrap), "contents_modified");
352
g_print ("<< 'CONTENTS_MODIFIED' from %s\n", __FUNCTION__);
359
/* Interface implementation */
361
mg_entry_wrapper_set_value_type (MgDataEntry *iface, GdaValueType type)
363
MgEntryWrapper *mgwrap;
365
g_return_if_fail (iface && IS_MG_ENTRY_WRAPPER (iface));
366
mgwrap = MG_ENTRY_WRAPPER (iface);
367
g_return_if_fail (mgwrap->priv);
369
if (mgwrap->priv->type != type) {
373
if (mgwrap->priv->value_orig) {
374
gda_value_free (mgwrap->priv->value_orig);
375
mgwrap->priv->value_orig = NULL;
377
if (mgwrap->priv->value_default) {
378
gda_value_free (mgwrap->priv->value_default);
379
mgwrap->priv->value_default = NULL;
382
mgwrap->priv->type = type;
383
mgwrap->priv->value_default = gda_value_new_null ();
385
/* Set original value */
386
dh = mg_data_entry_get_handler (MG_DATA_ENTRY (mgwrap));
387
value = gda_value_new_null ();
388
mg_entry_wrapper_set_value_orig (MG_DATA_ENTRY (mgwrap), value);
389
gda_value_free (value);
394
mg_entry_wrapper_get_value_type (MgDataEntry *iface)
396
MgEntryWrapper *mgwrap;
398
g_return_val_if_fail (iface && IS_MG_ENTRY_WRAPPER (iface), GDA_VALUE_TYPE_UNKNOWN);
399
mgwrap = MG_ENTRY_WRAPPER (iface);
400
g_return_val_if_fail (mgwrap->priv, GDA_VALUE_TYPE_UNKNOWN);
402
return mgwrap->priv->type;
407
mg_entry_wrapper_set_value (MgDataEntry *iface, const GdaValue *value)
409
MgEntryWrapper *mgwrap;
411
g_return_if_fail (iface && IS_MG_ENTRY_WRAPPER (iface));
412
mgwrap = MG_ENTRY_WRAPPER (iface);
413
g_return_if_fail (mgwrap->priv);
414
check_correct_init (mgwrap);
416
block_signals (mgwrap);
418
g_return_if_fail ((gda_value_get_type (value) == mgwrap->priv->type) ||
419
(gda_value_get_type (value) == GDA_VALUE_TYPE_NULL));
420
(*mgwrap->priv->real_class->real_set_value) (mgwrap, value);
421
if (gda_value_is_null (value))
422
mgwrap->priv->null_forced = TRUE;
424
mgwrap->priv->null_forced = FALSE;
427
(*mgwrap->priv->real_class->real_set_value) (mgwrap, NULL);
428
mgwrap->priv->null_forced = TRUE;
430
unblock_signals (mgwrap);
431
mgwrap->priv->default_forced = FALSE;
433
mg_entry_wrapper_emit_signal (mgwrap);
437
mg_entry_wrapper_get_value (MgDataEntry *iface)
439
GdaValue *value = NULL;
440
MgEntryWrapper *mgwrap;
443
g_return_val_if_fail (iface && IS_MG_ENTRY_WRAPPER (iface), NULL);
444
mgwrap = MG_ENTRY_WRAPPER (iface);
445
g_return_val_if_fail (mgwrap->priv, NULL);
447
dh = mg_entry_wrapper_get_handler (MG_DATA_ENTRY (mgwrap));
449
if (mgwrap->priv->null_forced)
450
value = gda_value_new_null ();
452
if (mgwrap->priv->default_forced) {
453
if (gda_value_get_type (mgwrap->priv->value_default) == mgwrap->priv->type)
454
value = gda_value_copy (mgwrap->priv->value_default);
456
value = gda_value_new_null ();
459
check_correct_init (mgwrap);
460
value = (*mgwrap->priv->real_class->real_get_value) (mgwrap);
468
mg_entry_wrapper_set_value_orig (MgDataEntry *iface, const GdaValue *value)
470
MgEntryWrapper *mgwrap;
471
gboolean changed = TRUE;
474
g_return_if_fail (iface && IS_MG_ENTRY_WRAPPER (iface));
475
mgwrap = MG_ENTRY_WRAPPER (iface);
476
g_return_if_fail (mgwrap->priv);
477
check_correct_init (mgwrap);
479
/* compare existing value and the one provided as argument */
480
evalue = mg_entry_wrapper_get_value (iface);
481
if ((!value && !evalue) ||
482
(!value && gda_value_is_null (evalue)) ||
483
(!evalue && gda_value_is_null (value)) ||
484
((gda_value_get_type (value) == gda_value_get_type (evalue)) &&
485
!gda_value_compare (value, evalue)))
488
/* get rid on any existing orig value */
489
if (mgwrap->priv->value_orig) {
490
gda_value_free (mgwrap->priv->value_orig);
491
mgwrap->priv->value_orig = NULL;
496
block_signals (mgwrap);
497
mg_entry_wrapper_set_value (iface, value);
498
unblock_signals (mgwrap);
501
g_return_if_fail ((gda_value_get_type (value) == mgwrap->priv->type) ||
502
(gda_value_get_type (value) == GDA_VALUE_TYPE_NULL));
503
mgwrap->priv->value_orig = gda_value_copy (value);
506
mgwrap->priv->value_orig = gda_value_new_null ();
507
mg_entry_wrapper_emit_signal (mgwrap);
509
gda_value_free (evalue);
513
mgwrap->priv->value_orig = evalue;
515
mgwrap->priv->value_orig = gda_value_new_null ();
519
static const GdaValue *
520
mg_entry_wrapper_get_value_orig (MgDataEntry *iface)
522
g_return_val_if_fail (iface && IS_MG_ENTRY_WRAPPER (iface), NULL);
523
g_return_val_if_fail (MG_ENTRY_WRAPPER (iface)->priv, NULL);
525
return MG_ENTRY_WRAPPER (iface)->priv->value_orig;
529
mg_entry_wrapper_set_value_default (MgDataEntry *iface, const GdaValue *value)
531
MgEntryWrapper *mgwrap;
533
g_return_if_fail (iface && IS_MG_ENTRY_WRAPPER (iface));
534
mgwrap = MG_ENTRY_WRAPPER (iface);
535
g_return_if_fail (mgwrap->priv);
537
if (mgwrap->priv->value_default)
538
gda_value_free (mgwrap->priv->value_default);
541
mgwrap->priv->value_default = gda_value_copy (value);
543
mgwrap->priv->value_default = gda_value_new_null ();
545
if (mgwrap->priv->default_forced) {
546
if (gda_value_get_type (mgwrap->priv->value_default) == mgwrap->priv->type) {
547
check_correct_init (mgwrap);
548
block_signals (mgwrap);
549
mg_entry_wrapper_set_value (iface, mgwrap->priv->value_default);
550
unblock_signals (mgwrap);
551
mgwrap->priv->default_forced = TRUE;
552
mg_entry_wrapper_emit_signal (mgwrap);
555
check_correct_init (mgwrap);
556
(*mgwrap->priv->real_class->real_set_value) (mgwrap, NULL);
557
mg_entry_wrapper_emit_signal (mgwrap);
563
mg_entry_wrapper_set_attributes (MgDataEntry *iface, guint attrs, guint mask)
565
MgEntryWrapper *mgwrap;
567
g_return_if_fail (iface && IS_MG_ENTRY_WRAPPER (iface));
568
mgwrap = MG_ENTRY_WRAPPER (iface);
569
g_return_if_fail (mgwrap->priv);
570
check_correct_init (mgwrap);
572
/* Setting to NULL */
573
if (mask & MG_DATA_ENTRY_IS_NULL) {
574
if ((mask & MG_DATA_ENTRY_CAN_BE_NULL) &&
575
!(attrs & MG_DATA_ENTRY_CAN_BE_NULL))
576
g_return_if_reached ();
577
if (attrs & MG_DATA_ENTRY_IS_NULL) {
578
block_signals (mgwrap);
579
mg_entry_wrapper_set_value (iface, NULL);
580
unblock_signals (mgwrap);
581
mgwrap->priv->null_forced = TRUE;
583
/* if default is set, see if we can keep it that way */
584
if (mgwrap->priv->default_forced) {
585
if (gda_value_get_type (mgwrap->priv->value_default) !=
587
mgwrap->priv->default_forced = FALSE;
590
mg_entry_wrapper_emit_signal (mgwrap);
594
mgwrap->priv->null_forced = FALSE;
595
mg_entry_wrapper_emit_signal (mgwrap);
600
if (mask & MG_DATA_ENTRY_CAN_BE_NULL)
601
mgwrap->priv->null_possible = (attrs & MG_DATA_ENTRY_CAN_BE_NULL) ? TRUE : FALSE;
603
/* Setting to DEFAULT */
604
if (mask & MG_DATA_ENTRY_IS_DEFAULT) {
605
if ((mask & MG_DATA_ENTRY_CAN_BE_DEFAULT) &&
606
!(attrs & MG_DATA_ENTRY_CAN_BE_DEFAULT))
607
g_return_if_reached ();
608
if (attrs & MG_DATA_ENTRY_IS_DEFAULT) {
609
block_signals (mgwrap);
610
if (mgwrap->priv->value_default) {
611
if (gda_value_get_type (mgwrap->priv->value_default) == mgwrap->priv->type)
612
mg_entry_wrapper_set_value (iface, mgwrap->priv->value_default);
614
(*mgwrap->priv->real_class->real_set_value) (mgwrap, NULL);
617
mg_entry_wrapper_set_value (iface, NULL);
618
unblock_signals (mgwrap);
620
/* if NULL is set, see if we can keep it that way */
621
if (mgwrap->priv->null_forced) {
622
if (gda_value_get_type (mgwrap->priv->value_default) !=
624
mgwrap->priv->null_forced = FALSE;
627
mgwrap->priv->default_forced = TRUE;
628
mg_entry_wrapper_emit_signal (mgwrap);
632
mgwrap->priv->default_forced = FALSE;
633
mg_entry_wrapper_emit_signal (mgwrap);
637
/* Can be DEFAULT ? */
638
if (mask & MG_DATA_ENTRY_CAN_BE_DEFAULT)
639
mgwrap->priv->default_possible = (attrs & MG_DATA_ENTRY_CAN_BE_DEFAULT) ? TRUE : FALSE;
642
if (mask & MG_DATA_ENTRY_IS_UNCHANGED) {
643
if (attrs & MG_DATA_ENTRY_IS_UNCHANGED) {
644
mgwrap->priv->default_forced = FALSE;
645
block_signals (mgwrap);
646
mg_entry_wrapper_set_value (iface, mgwrap->priv->value_orig);
647
unblock_signals (mgwrap);
648
mg_entry_wrapper_emit_signal (mgwrap);
652
/* Actions buttons ? */
653
if (mask & MG_DATA_ENTRY_ACTIONS_SHOWN) {
655
mgwrap->priv->show_actions = (attrs & MG_DATA_ENTRY_ACTIONS_SHOWN) ? TRUE : FALSE;
657
gval = g_new0 (GValue, 1);
658
g_value_init (gval, G_TYPE_BOOLEAN);
659
g_value_set_boolean (gval, mgwrap->priv->show_actions);
660
g_object_set_property (G_OBJECT (mgwrap), "actions", gval);
664
/* NON WRITABLE attributes */
665
if (mask & MG_DATA_ENTRY_DATA_NON_VALID)
666
g_warning ("Can't force a MgDataEntry to be invalid!");
668
if (mask & MG_DATA_ENTRY_HAS_VALUE_ORIG)
669
g_warning ("Having an original value is not a write attribute on MgDataEntry!");
671
g_signal_emit_by_name (G_OBJECT (mgwrap), "status_changed");
675
mg_entry_wrapper_get_attributes (MgDataEntry *iface)
678
MgEntryWrapper *mgwrap;
681
g_return_val_if_fail (iface && IS_MG_ENTRY_WRAPPER (iface), 0);
682
mgwrap = MG_ENTRY_WRAPPER (iface);
683
g_return_val_if_fail (mgwrap->priv, 0);
685
value = mg_entry_wrapper_get_value (iface);
688
if (gda_value_get_type (value) == GDA_VALUE_TYPE_NULL) {
689
if (mgwrap->priv->default_forced) {
690
if (mgwrap->priv->null_forced)
691
retval = retval | MG_DATA_ENTRY_IS_NULL;
694
retval = retval | MG_DATA_ENTRY_IS_NULL;
698
if (mgwrap->priv->null_possible)
699
retval = retval | MG_DATA_ENTRY_CAN_BE_NULL;
702
if (mgwrap->priv->default_forced)
703
retval = retval | MG_DATA_ENTRY_IS_DEFAULT;
705
/* can be default? */
706
if (mgwrap->priv->default_possible)
707
retval = retval | MG_DATA_ENTRY_CAN_BE_DEFAULT;
710
if (mgwrap->priv->value_orig &&
711
(gda_value_get_type (value) == gda_value_get_type (mgwrap->priv->value_orig))) {
712
if (gda_value_is_null (value))
713
retval = retval | MG_DATA_ENTRY_IS_UNCHANGED;
715
if (! gda_value_compare (value, mgwrap->priv->value_orig))
716
retval = retval | MG_DATA_ENTRY_IS_UNCHANGED;
721
if (mgwrap->priv->show_actions)
722
retval = retval | MG_DATA_ENTRY_ACTIONS_SHOWN;
725
if (! (mgwrap->priv->default_forced && mgwrap->priv->default_possible)) {
726
if (/*(gda_value_is_null (value) && !mgwrap->priv->null_forced) ||*/
727
(gda_value_is_null (value) && !mgwrap->priv->null_possible))
728
retval = retval | MG_DATA_ENTRY_DATA_NON_VALID;
731
/* has original value? */
732
if (mgwrap->priv->value_orig) {
733
retval = retval | MG_DATA_ENTRY_HAS_VALUE_ORIG;
736
gda_value_free (value);
742
static MgDataHandler *
743
mg_entry_wrapper_get_handler (MgDataEntry *iface)
748
g_return_val_if_fail (iface && IS_MG_ENTRY_WRAPPER (iface), NULL);
749
g_return_val_if_fail (MG_ENTRY_WRAPPER (iface)->priv, NULL);
751
g_value_init (&val, G_TYPE_POINTER);
752
g_object_get_property (G_OBJECT (iface), "handler", &val);
753
dh = g_value_get_pointer (&val);
754
g_value_unset (&val);
760
mg_entry_wrapper_expand_in_layout (MgDataEntry *iface)
762
MgEntryWrapper *mgwrap;
764
g_return_val_if_fail (iface && IS_MG_ENTRY_WRAPPER (iface), FALSE);
765
mgwrap = MG_ENTRY_WRAPPER (iface);
766
g_return_val_if_fail (mgwrap->priv, FALSE);
767
check_correct_init (mgwrap);
769
return (*mgwrap->priv->real_class->expand_in_layout) (mgwrap);