1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
3 * Copyright (C) 2006 Armin Burgmeier
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (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 Library 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20 #include "validator.h"
22 #include <gtk/gtkentry.h>
24 typedef struct _CgValidatorPrivate CgValidatorPrivate
;
25 struct _CgValidatorPrivate
31 #define CG_VALIDATOR_PRIVATE(o) \
32 (G_TYPE_INSTANCE_GET_PRIVATE( \
45 static GObjectClass
*parent_class
= NULL
;
48 cg_validator_entry_changed_cb (GtkEntry
*entry
,
51 CgValidator
*validator
;
52 validator
= CG_VALIDATOR (user_data
);
54 cg_validator_revalidate (validator
);
58 cg_validator_init (CgValidator
*validator
)
60 CgValidatorPrivate
*priv
;
61 priv
= CG_VALIDATOR_PRIVATE (validator
);
64 priv
->entry_list
= NULL
;
68 cg_validator_finalize (GObject
*object
)
70 CgValidator
*validator
;
71 CgValidatorPrivate
*priv
;
74 validator
= CG_VALIDATOR (object
);
75 priv
= CG_VALIDATOR_PRIVATE (validator
);
77 for (item
= priv
->entry_list
; item
!= NULL
; item
= item
->next
)
79 g_signal_handlers_disconnect_by_func (
80 G_OBJECT (item
->data
), G_CALLBACK (cg_validator_entry_changed_cb
),
84 g_slist_free (priv
->entry_list
);
85 priv
->entry_list
= NULL
;
87 G_OBJECT_CLASS (parent_class
)->finalize (object
);
91 cg_validator_set_property (GObject
*object
,
96 CgValidator
*validator
;
97 CgValidatorPrivate
*priv
;
99 g_return_if_fail (CG_IS_VALIDATOR (object
));
101 validator
= CG_VALIDATOR (object
);
102 priv
= CG_VALIDATOR_PRIVATE (validator
);
107 priv
->widget
= GTK_WIDGET (g_value_get_object (value
));
110 G_OBJECT_WARN_INVALID_PROPERTY_ID (object
, prop_id
, pspec
);
116 cg_validator_get_property (GObject
*object
,
121 CgValidator
* validator
;
122 CgValidatorPrivate
* priv
;
124 g_return_if_fail(CG_IS_VALIDATOR(object
));
126 validator
= CG_VALIDATOR(object
);
127 priv
= CG_VALIDATOR_PRIVATE(validator
);
132 g_value_set_object(value
, G_OBJECT(priv
->widget
));
135 G_OBJECT_WARN_INVALID_PROPERTY_ID (object
, prop_id
, pspec
);
141 cg_validator_class_init (CgValidatorClass
* klass
)
143 GObjectClass
*object_class
= G_OBJECT_CLASS (klass
);
144 parent_class
= g_type_class_peek_parent (klass
);
146 g_type_class_add_private (klass
, sizeof (CgValidatorPrivate
));
148 object_class
->finalize
= cg_validator_finalize
;
149 object_class
->set_property
= cg_validator_set_property
;
150 object_class
->get_property
= cg_validator_get_property
;
152 g_object_class_install_property (object_class
,
154 g_param_spec_object ("widget",
156 "Widget to make insensitive if the entries are empty",
158 G_PARAM_READWRITE
| G_PARAM_CONSTRUCT_ONLY
));
162 cg_validator_get_type (void)
164 static GType our_type
= 0;
168 static const GTypeInfo our_info
=
170 sizeof (CgValidatorClass
),
171 (GBaseInitFunc
) NULL
,
172 (GBaseFinalizeFunc
) NULL
,
173 (GClassInitFunc
) cg_validator_class_init
,
176 sizeof (CgValidator
),
178 (GInstanceInitFunc
) cg_validator_init
,
182 our_type
= g_type_register_static (G_TYPE_OBJECT
, "CgValidator",
190 cg_validator_new (GtkWidget
*widget
,
193 CgValidator
*validator
;
194 CgValidatorPrivate
*priv
;
198 validator
= CG_VALIDATOR (g_object_new (CG_TYPE_VALIDATOR
, "widget",
201 priv
= CG_VALIDATOR_PRIVATE (validator
);
203 va_start (arglist
, widget
);
204 entry
= va_arg (arglist
, GtkEntry
*);
205 while (entry
!= NULL
)
207 g_signal_connect (G_OBJECT (entry
), "changed",
208 G_CALLBACK (cg_validator_entry_changed_cb
),
211 priv
->entry_list
= g_slist_prepend (priv
->entry_list
, entry
);
212 entry
= va_arg (arglist
, GtkEntry
*);
215 cg_validator_revalidate (validator
);
220 cg_validator_revalidate (CgValidator
*validator
)
222 CgValidatorPrivate
*priv
;
227 priv
= CG_VALIDATOR_PRIVATE (validator
);
228 for (item
= priv
->entry_list
; item
!= NULL
; item
= item
->next
)
230 entry
= GTK_ENTRY (item
->data
);
231 text
= g_strdup (gtk_entry_get_text (entry
));
233 if (*text
== '\0') break;
237 gtk_widget_set_sensitive (priv
->widget
, TRUE
);
239 gtk_widget_set_sensitive (priv
->widget
, FALSE
);