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