8 #include <yui/Libyui_config.h> 9 #include "ygtkfieldentry.h" 13 void ygutils_setFilter (GtkEntry *entry,
const char *validChars);
14 static guint filter_entry_signal = 0;
22 gtk_box_set_spacing (GTK_BOX (entry), 4);
25 static GtkEntry *ygtk_field_entry_focus_next_entry (
YGtkFieldEntry *fields,
26 GtkEntry *current_entry,
29 GList *children = gtk_container_get_children (GTK_CONTAINER (fields));
30 gint pos = g_list_index (children, current_entry);
32 GtkEntry *next_entry = g_list_nth_data (children, pos + (2 * side));
33 g_list_free (children);
36 gtk_widget_grab_focus (GTK_WIDGET (next_entry));
41 static void ygtk_field_entry_insert_text (GtkEditable *editable,
const gchar *new_text,
44 if (*position == gtk_entry_get_max_length (GTK_ENTRY (editable))) {
45 GtkEntry *next_entry = ygtk_field_entry_focus_next_entry (fields,
46 GTK_ENTRY (editable), 1);
49 gtk_editable_insert_text (GTK_EDITABLE (next_entry), new_text,
50 new_text_length, &pos);
51 gtk_editable_set_position (GTK_EDITABLE (next_entry), pos);
54 g_signal_stop_emission_by_name (editable,
"insert_text");
59 static void ygtk_field_entry_move_cursor (GtkEntry *entry, GtkMovementStep move,
62 if (move == GTK_MOVEMENT_VISUAL_POSITIONS) {
64 ygtk_field_entry_focus_next_entry (fields, GTK_ENTRY (entry), 1);
66 ygtk_field_entry_focus_next_entry (fields, GTK_ENTRY (entry), -1);
71 GtkWidget *ygtk_field_entry_new (
void)
72 {
return g_object_new (YGTK_TYPE_FIELD_ENTRY, NULL); }
74 static void ygtk_field_entry_entry_changed (GtkEditable *editable,
YGtkFieldEntry *fields)
76 GList *children = gtk_container_get_children (GTK_CONTAINER (fields));
77 gint nb = g_list_index (children, editable) / 2;
78 g_list_free (children);
80 g_signal_emit (fields, filter_entry_signal, 0, nb);
86 GList *children = gtk_container_get_children (GTK_CONTAINER (fields));
87 length = g_list_length (children);
88 g_list_free (children);
92 static inline guint child_to_index (
YGtkFieldEntry *fields, guint child_i)
93 {
return child_i / 2; }
94 static inline guint index_to_child (
YGtkFieldEntry *fields, guint index)
97 GtkEntry *ygtk_field_entry_get_field_widget (
YGtkFieldEntry *fields, guint index)
100 GList *children = gtk_container_get_children (GTK_CONTAINER (fields));
101 entry = g_list_nth_data (children, index_to_child (fields, index));
102 g_list_free (children);
103 g_assert (GTK_IS_ENTRY (entry));
106 guint ygtk_field_entry_add_field (
YGtkFieldEntry *fields, gchar separator)
108 guint new_index = child_to_index (fields, ygtk_field_entry_length (fields)+1);
110 GtkWidget *label = 0, *entry;
112 const gchar str[2] = { separator,
'\0' };
113 label = gtk_label_new (str);
115 entry = gtk_entry_new();
116 g_signal_connect (G_OBJECT (entry),
"insert-text",
117 G_CALLBACK (ygtk_field_entry_insert_text), fields);
118 g_signal_connect (G_OBJECT (entry),
"move-cursor",
119 G_CALLBACK (ygtk_field_entry_move_cursor), fields);
121 g_signal_connect (G_OBJECT (entry),
"changed",
122 G_CALLBACK (ygtk_field_entry_entry_changed), fields);
124 GtkBox *box = GTK_BOX (fields);
126 gtk_box_pack_start (box, label, FALSE, TRUE, 0);
127 gtk_widget_show (label);
129 gtk_box_pack_start (box, entry, TRUE, TRUE, 0);
130 gtk_widget_show (entry);
134 void ygtk_field_entry_setup_field (
YGtkFieldEntry *fields, guint index,
135 gint max_length,
const gchar *valid_chars)
137 GtkEntry *entry = ygtk_field_entry_get_field_widget (fields, index);
138 gboolean disable_len = (max_length <= 0);
139 gtk_entry_set_max_length (entry, disable_len ? 0 : max_length);
140 gtk_entry_set_width_chars (entry, disable_len ? -1 : max_length);
141 gtk_box_set_child_packing (GTK_BOX (fields), GTK_WIDGET (entry),
142 disable_len, TRUE, 0, GTK_PACK_START);
143 ygutils_setFilter (entry, valid_chars);
146 void ygtk_field_entry_set_field_text (
YGtkFieldEntry *fields, guint index,
const gchar *text)
148 GtkEntry *entry = ygtk_field_entry_get_field_widget (fields, index);
150 g_signal_handlers_block_by_func (entry,
151 (gpointer) ygtk_field_entry_entry_changed, fields);
152 g_signal_handlers_block_by_func (entry,
153 (gpointer) ygtk_field_entry_insert_text, fields);
155 gtk_entry_set_text (entry, text);
157 g_signal_handlers_unblock_by_func (entry,
158 (gpointer) ygtk_field_entry_entry_changed, fields);
159 g_signal_handlers_unblock_by_func (entry,
160 (gpointer) ygtk_field_entry_insert_text, fields);
163 const gchar *ygtk_field_entry_get_field_text (
YGtkFieldEntry *fields, guint index)
165 GtkEntry *entry = ygtk_field_entry_get_field_widget (fields, index);
166 return gtk_entry_get_text (entry);
169 static gboolean ygtk_field_entry_mnemonic_activate (GtkWidget *widget, gboolean cycling)
172 GtkEntry *entry = ygtk_field_entry_get_field_widget (fields, 0);
173 gtk_widget_grab_focus (GTK_WIDGET (entry));
179 ygtk_field_entry_parent_class = g_type_class_peek_parent (klass);
181 GtkWidgetClass* widget_class = GTK_WIDGET_CLASS (klass);
182 widget_class->mnemonic_activate = ygtk_field_entry_mnemonic_activate;
184 filter_entry_signal = g_signal_new (
"field_entry_changed",
185 G_OBJECT_CLASS_TYPE (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
187 NULL, NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
192 GList *children = gtk_container_get_children (GTK_CONTAINER (fields));
193 g_return_val_if_fail (children != NULL, FALSE);
194 GtkWidget *widget = GTK_WIDGET (children->data);
195 g_list_free (children);
197 gtk_editable_select_region (GTK_EDITABLE (widget), 0, -1);
198 gtk_widget_grab_focus (widget);
199 return gtk_widget_is_focus (widget);