00001 #include <gtk/gtksignal.h> 00002 #include <glib.h> 00003 #include <glib/gprintf.h> 00004 #include "etk_addrem.h" 00005 00006 enum 00007 { 00008 ADD_REM_ADD_LINE, 00009 ADD_REM_REM_LINE, 00010 LAST_SIGNAL 00011 }; 00012 00013 static guint add_rem_signals[LAST_SIGNAL] = { 0 }; 00014 00015 static void add_rem_class_init ( Add_Rem_Class* c ); 00016 static void add_rem_init ( Add_Rem* obj ); 00017 00018 static void add_rem_class_init( Add_Rem_Class* c ) 00019 { 00020 add_rem_signals[ADD_REM_ADD_LINE] = g_signal_new( "add_line" , 00021 G_TYPE_FROM_CLASS(c) , 00022 G_SIGNAL_RUN_FIRST|G_SIGNAL_ACTION , 00023 G_STRUCT_OFFSET( Add_Rem_Class , add_line ) , 00024 NULL , 00025 NULL , 00026 g_cclosure_marshal_VOID__VOID , 00027 G_TYPE_NONE , 0 ); 00028 00029 add_rem_signals[ADD_REM_REM_LINE] = g_signal_new( "rem_line" , 00030 G_TYPE_FROM_CLASS(c) , 00031 G_SIGNAL_RUN_FIRST|G_SIGNAL_ACTION , 00032 G_STRUCT_OFFSET( Add_Rem_Class , rem_line ) , 00033 NULL , 00034 NULL , 00035 g_cclosure_marshal_VOID__VOID , 00036 G_TYPE_NONE , 0 ); 00037 00038 return; 00039 } 00040 00041 GType add_rem_get_type( void ) 00042 { 00043 static GType this_type = 0; 00044 00045 if ( !this_type ) 00046 { 00047 static const GTypeInfo this_type_info = 00048 { 00049 sizeof( Add_Rem_Class ), 00050 NULL, 00051 NULL, 00052 (GClassInitFunc)add_rem_class_init, 00053 NULL, 00054 NULL, 00055 sizeof(Add_Rem), 00056 0, 00057 (GInstanceInitFunc)add_rem_init 00058 }; 00059 00060 this_type = g_type_register_static( GTK_TYPE_HBOX , "Add_Rem" , &this_type_info , 0 ); 00061 } 00062 00063 return this_type; 00064 } 00065 00066 static void rem_line( GtkWidget* w , Add_Rem* ar ) 00067 { 00068 g_printf( "Remove this entry.\n" ); 00069 g_signal_emit( G_OBJECT(ar) , add_rem_signals[ADD_REM_REM_LINE] , 0 ); 00070 } 00071 00072 static void add_line( GtkWidget* w , Add_Rem* ar ) 00073 { 00074 g_printf( "Add another entry.\n" ); 00075 g_signal_emit( G_OBJECT(ar) , add_rem_signals[ADD_REM_ADD_LINE] , 0 ); 00076 } 00077 00078 static void add_rem_init( Add_Rem* obj ) 00079 { 00080 obj->label = GTK_WIDGET( gtk_label_new( "" ) ); 00081 obj->add_button = GTK_WIDGET( gtk_button_new_from_stock( GTK_STOCK_ADD ) ); 00082 obj->rem_button = GTK_WIDGET( gtk_button_new_from_stock( GTK_STOCK_REMOVE ) ); 00083 00084 gtk_box_set_homogeneous( GTK_BOX( obj ) , FALSE ); 00085 gtk_box_set_spacing ( GTK_BOX( obj ) , 2 ); 00086 00087 gtk_box_pack_start( GTK_BOX( obj ) , obj->label , TRUE , TRUE , 2 ); 00088 gtk_box_pack_end ( GTK_BOX( obj ) , obj->rem_button , FALSE , FALSE, 2 ); 00089 gtk_box_pack_end ( GTK_BOX( obj ) , obj->add_button , FALSE , FALSE, 2 ); 00090 00091 g_signal_connect( G_OBJECT( obj->rem_button ) , "clicked" , 00092 G_CALLBACK(rem_line) , (gpointer)obj ); 00093 g_signal_connect( G_OBJECT( obj->add_button ) , "clicked" , 00094 G_CALLBACK(add_line) , (gpointer)obj ); 00095 00096 gtk_widget_show( obj->add_button ); 00097 gtk_widget_show( obj->rem_button ); 00098 gtk_widget_show( obj->label ); 00099 } 00100 00101 const gchar* add_rem_get_name( Add_Rem* ar ) 00102 { 00103 return gtk_label_get_text( GTK_LABEL( ar->label ) ); 00104 } 00105 00106 GtkWidget* add_rem_new( const char* label_str ) 00107 { 00108 Add_Rem* obj = g_object_new( ADD_REM_TYPE , NULL ); 00109 00110 gtk_label_set_text( GTK_LABEL(obj->label), label_str ); 00111 00112 return GTK_WIDGET( obj ); 00113 } 00114