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