00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00028
00029
00030 #include <gtk/gtk.h>
00031
00032 #include <libergtk/ergtk.h>
00033 #include <liberdm/display.h>
00034
00035 #include "connectionMgrLog.h"
00036 #include "displayStatus.h"
00037 #include "gtkSettingItem.h"
00038 #include "gtkSettingItemTextEntry.h"
00039
00040 #define LOGPRINTF CN_LOGPRINTF
00041
00042 enum
00043 {
00044
00045 ENTER_SELECTED,
00046 LAST_SIGNAL,
00047 };
00048
00049 static gint settingitem_textentry_signals[LAST_SIGNAL] = { 0 };
00050
00051
00052
00053 static void gtk_settingitem_textentry_class_init(GtkSettingItemTextEntryClass * klass);
00054 static void gtk_settingitem_textentry_init(GtkSettingItemTextEntry * item);
00055 static void send_button_press(GtkSettingItemTextEntry * item);
00056
00057
00058 static void on_changed(GtkEntry* widget, gpointer data);
00059 static void on_button_toggled(GtkToggleButton* button, gpointer data);
00060
00061
00062
00063 GtkWidget *gtk_settingitem_textentry_new(gboolean with_button)
00064 {
00065 GtkSettingItemTextEntry *settingItem;
00066
00067 settingItem = (GtkSettingItemTextEntry *) g_object_new(GTK_SETTINGITEM_TEXTENTRY_TYPE,
00068 NULL);
00069
00070 if (!with_button)
00071 {
00072
00073 gtk_widget_destroy(settingItem->button);
00074 settingItem->button = NULL;
00075 }
00076
00077 return GTK_WIDGET(settingItem);
00078 }
00079
00080
00081 GType gtk_settingitem_textentry_get_type(void)
00082 {
00083 static GType settingitem_textentry_type = 0;
00084
00085 if (!settingitem_textentry_type)
00086 {
00087 static const GTypeInfo settingitem_textentry_info = {
00088 sizeof(GtkSettingItemTextEntryClass),
00089 NULL,
00090 NULL,
00091 (GClassInitFunc) gtk_settingitem_textentry_class_init,
00092 NULL,
00093 NULL,
00094 sizeof(GtkSettingItemTextEntry),
00095 0,
00096 (GInstanceInitFunc) gtk_settingitem_textentry_init,
00097 };
00098
00099 settingitem_textentry_type = g_type_register_static(GTK_TYPE_EVENT_BOX,
00100 "SettingItemTextEntry",
00101 &settingitem_textentry_info,
00102 0);
00103 }
00104 return settingitem_textentry_type;
00105 }
00106
00107
00108 static void gtk_settingitem_textentry_class_init(GtkSettingItemTextEntryClass * klass)
00109 {
00110 GtkObjectClass *object_class;
00111
00112 object_class = (GtkObjectClass *) klass;
00113
00114
00115
00116 settingitem_textentry_signals[ENTER_SELECTED] =
00117 g_signal_new("settingitem_textentry_enter",
00118 G_OBJECT_CLASS_TYPE(object_class),
00119 G_SIGNAL_RUN_LAST,
00120 G_STRUCT_OFFSET(GtkSettingItemTextEntryClass,
00121 settingitem_textentry_enter),
00122 NULL,
00123 NULL,
00124 gtk_marshal_VOID__STRING,
00125 G_TYPE_NONE,
00126 1,
00127 G_TYPE_CHAR);
00128 }
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143 static void gtk_settingitem_textentry_init(GtkSettingItemTextEntry * item)
00144 {
00145 GtkWidget *item_background;
00146 GtkWidget *alignment;
00147 GtkWidget *vbox;
00148 GtkWidget *hbox;
00149 GtkWidget *widget;
00150
00151 gtk_widget_set_size_request(GTK_WIDGET(item),
00152 SETTINGITEMTEXT_REQ_WIDTH, SETTINGITEMTEXT_REQ_HEIGHT);
00153
00154
00155 item_background = gtk_event_box_new();
00156 gtk_widget_set_name(GTK_WIDGET(item_background),
00157 "settingitem_te_background");
00158 gtk_container_add(GTK_CONTAINER(item), item_background);
00159
00160
00161 alignment = gtk_alignment_new(0.0, 0.0, 0.0, 0.0);
00162 gtk_alignment_set_padding(GTK_ALIGNMENT(alignment),
00163 SETTINGITEMTEXT_BORDER_TOP,
00164 SETTINGITEMTEXT_BORDER_BOTTOM,
00165 SETTINGITEMTEXT_BORDER_LEFT,
00166 SETTINGITEMTEXT_BORDER_RIGHT );
00167 gtk_container_add(GTK_CONTAINER(item_background), alignment);
00168
00169
00170 vbox = gtk_vbox_new(FALSE, 0);
00171 gtk_widget_set_size_request(vbox, -1, -1);
00172 gtk_container_add(GTK_CONTAINER(alignment), vbox);
00173
00174
00175 widget = gtk_label_new("");
00176 gtk_widget_set_name(widget, "settingitem_te_label");
00177 gtk_widget_set_size_request(widget,
00178 SETTINGITEMTEXT_REQ_WIDTH, SETTINGITEMTEXT_LABEL_HEIGHT);
00179 gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.6);
00180 gtk_box_pack_start(GTK_BOX(vbox), widget, FALSE, FALSE, 0);
00181 item->label = widget;
00182
00183
00184 hbox = gtk_hbox_new(FALSE, 0);
00185 gtk_widget_set_size_request(hbox, -1, -1);
00186 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
00187
00188
00189 widget = ergtk_entry_new();
00190 gtk_widget_set_size_request(widget,
00191 SETTINGITEMTEXT_ENTRY_WIDTH, SETTINGITEMTEXT_ENTRY_HEIGHT);
00192 gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, FALSE, 0);
00193 item->entry = widget;
00194
00195 g_signal_connect_after(G_OBJECT(widget), "changed-stable",
00196 G_CALLBACK(on_changed), item);
00197
00198
00199 widget = ergtk_toggle_button_new_with_label("");
00200 gtk_widget_set_size_request(widget,
00201 SETTINGITEMTEXT_BUTTON_WIDTH_SMALL, -1);
00202 gtk_box_pack_start(GTK_BOX(hbox), widget,
00203 FALSE, FALSE, SETTINGITEMTEXT_BUTTON_PADDING);
00204 item->button = widget;
00205
00206 g_signal_connect_after(G_OBJECT(widget), "toggled",
00207 G_CALLBACK(on_button_toggled), item);
00208
00209
00210 gtk_widget_show_all(GTK_WIDGET(item));
00211
00212
00213 item->callback_on_changed = NULL;
00214 }
00215
00216
00217 void gtk_settingitem_textentry_grabfocus(GtkSettingItemTextEntry *item)
00218 {
00219 LOGPRINTF("entry");
00220 gtk_widget_grab_focus(item->entry);
00221 }
00222
00223
00224
00225 void gtk_settingitem_textentry_setlabel(GtkSettingItemTextEntry* item,
00226 const gchar* text)
00227 {
00228 gtk_label_set_text(GTK_LABEL(item->label), text);
00229 }
00230
00231 void gtk_settingitem_textentry_settext(GtkSettingItemTextEntry* item,
00232 const gchar * text)
00233 {
00234 gtk_entry_set_text(GTK_ENTRY(item->entry), text);
00235 }
00236
00237 const gchar* gtk_settingitem_textentry_gettext(GtkSettingItemTextEntry* item)
00238 {
00239 return gtk_entry_get_text(GTK_ENTRY(item->entry));
00240 }
00241
00242 void gtk_settingitem_textentry_setvisibility(GtkSettingItemTextEntry* item,
00243 gboolean visible)
00244 {
00245 gtk_entry_set_visibility(GTK_ENTRY(item->entry), visible);
00246 }
00247
00248 void gtk_settingitem_textentry_setsensitive(GtkSettingItemTextEntry* item,
00249 gboolean sensitive)
00250 {
00251 gtk_widget_set_sensitive(item->entry, sensitive);
00252 }
00253
00254 void gtk_settingitem_textentry_show_button(GtkSettingItemTextEntry* item,
00255 const gboolean show)
00256 {
00257 g_return_if_fail(item->button != NULL);
00258
00259 if (show)
00260 {
00261 gtk_widget_show(item->button);
00262 }
00263 else
00264 {
00265 gtk_widget_hide(item->button);
00266 }
00267 }
00268
00269 void gtk_settingitem_textentry_set_buttontext(GtkSettingItemTextEntry*item,
00270 const gchar* text)
00271 {
00272 g_return_if_fail(item->button != NULL);
00273 gtk_button_set_label(GTK_BUTTON(item->button), text);
00274 }
00275
00276 void gtk_settingitem_textentry_set_buttonsize(GtkSettingItemTextEntry*item,
00277 const gboolean large_button)
00278 {
00279 g_return_if_fail(item->button != NULL);
00280
00281 if (large_button)
00282 {
00283 gtk_widget_set_size_request(item->button,
00284 SETTINGITEMTEXT_BUTTON_WIDTH_LARGE, -1);
00285 }
00286 else
00287 {
00288 gtk_widget_set_size_request(item->button,
00289 SETTINGITEMTEXT_BUTTON_WIDTH_SMALL, -1);
00290 }
00291 }
00292
00293 void gtk_settingitem_textentry_set_buttonstate(GtkSettingItemTextEntry*item,
00294 const gboolean active)
00295 {
00296 g_return_if_fail(item->button != NULL);
00297 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(item->button), active);
00298 }
00299
00300 const gboolean gtk_settingitem_textentry_get_buttonactive(GtkSettingItemTextEntry* item)
00301 {
00302 g_return_val_if_fail((item->button != NULL), FALSE);
00303 return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(item->button));
00304 }
00305
00306
00307
00308 void gtk_settingitem_textentry_callback_on_buttonclicked(GtkSettingItemTextEntry* item,
00309 on_textentry_buttonclicked_t* callback)
00310 {
00311 item->callback_on_buttonclicked = callback;
00312 }
00313
00314 void gtk_settingitem_textentry_callback_on_changed(GtkSettingItemTextEntry* item,
00315 on_textentry_changed_t* callback)
00316 {
00317 item->callback_on_changed = callback;
00318 }
00319
00320 static void send_button_press(GtkSettingItemTextEntry* item)
00321 {
00322 LOGPRINTF("entry");
00323
00324
00325 static GdkEventButton event;
00326 event.type = GDK_BUTTON_PRESS;
00327 gboolean result = FALSE;
00328 g_signal_emit_by_name(item, "button-press-event", GTK_WIDGET(item),
00329 &event, NULL, &result);
00330 }
00331
00332
00333
00334 static void on_changed(GtkEntry* widget, gpointer data)
00335 {
00336 LOGPRINTF("entry");
00337
00338 GtkSettingItemTextEntry* item = GTK_SETTINGITEM_TEXTENTRY(data);
00339 g_return_if_fail(item != NULL);
00340
00341
00342 send_button_press(item);
00343 if (item->callback_on_changed)
00344 {
00345 item->callback_on_changed( GTK_WIDGET(data),
00346 gtk_entry_get_text(GTK_ENTRY(item->entry)) );
00347 }
00348 }
00349
00350 static void on_button_toggled(GtkToggleButton* button, gpointer data)
00351 {
00352 LOGPRINTF("entry");
00353
00354 GtkSettingItemTextEntry* item = GTK_SETTINGITEM_TEXTENTRY(data);
00355 g_return_if_fail(item != NULL);
00356
00357 gboolean active;
00358
00359
00360 if (item->callback_on_buttonclicked)
00361 {
00362 active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button));
00363 item->callback_on_buttonclicked(GTK_WIDGET(item), active);
00364 }
00365 }
00366