/* gmysql -- a graphical frontend to MySQL databases Copyright (C) 1998 Stephen R. Dodd This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include "indexdlg.h" #include "idxfielddlg.h" static void index_dlg_done( GtkWidget *widget, gpointer data ); static void index_dlg_cancel( GtkWidget *widget, gpointer data ); static void index_dlg_destroyed( GtkWidget *widget, gpointer data ); static gint index_dlg_key_pressed( GtkWidget *widget, GdkEventKey *event ); static void field_add( GtkWidget *widget, gpointer data ); static IndexDlg *index_dlg_active; static gint selected_field; IndexDlg *index_dlg_new( CreateTableDlg *owner ) { IndexDlg *index_dlg; GtkWidget *table, *label, *entry, *button, *dialog, *hbox, *vbox, *scrolled; static char *titles[] = { "Field" }; index_dlg_active = index_dlg = g_new( IndexDlg, 1 ); index_dlg->owner = owner; index_dlg->avail_fields = NULL; dialog = index_dlg->dialog = gtk_dialog_new(); gtk_signal_connect( GTK_OBJECT( dialog ), "destroy", GTK_SIGNAL_FUNC( index_dlg_destroyed ), index_dlg ); gtk_signal_connect( GTK_OBJECT( dialog ), "key_press_event", GTK_SIGNAL_FUNC( index_dlg_key_pressed ), NULL ); table = gtk_table_new( 3, 2, FALSE ); label = gtk_label_new( "Name" ); gtk_label_set_justify( GTK_LABEL( label ), GTK_JUSTIFY_RIGHT ); gtk_misc_set_alignment( GTK_MISC( label ), 1.0, 0.5 ); entry = index_dlg->index = gtk_entry_new(); gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 0, 1, GTK_FILL, 0, 5, 5 ); gtk_table_attach( GTK_TABLE( table ), entry, 1, 2, 0, 1, GTK_FILL|GTK_EXPAND, 0, 5, 5 ); gtk_widget_show( label ); gtk_widget_show( entry ); hbox = gtk_hbox_new( FALSE, 5 ); gtk_widget_show( hbox ); entry = index_dlg->list = gtk_clist_new_with_titles( 1, titles ); gtk_clist_column_titles_passive( GTK_CLIST( entry ) ); gtk_widget_show( entry ); #if CONFIG_GTK_MAJOR==1 && CONFIG_GTK_MINOR==0 gtk_clist_set_policy( GTK_CLIST( entry ), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC ); gtk_box_pack_start( GTK_BOX( hbox ), entry, TRUE, TRUE, 5 ); #else /* not GTK 1.0 */ /* create a scrolled window for the list */ scrolled = gtk_scrolled_window_new( NULL, NULL ); gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW( scrolled ), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC ); gtk_container_add( GTK_CONTAINER( scrolled ), index_dlg->list ); gtk_widget_show( scrolled ); gtk_box_pack_start( GTK_BOX( hbox ), scrolled, TRUE, TRUE, 5 ); #endif /* GTK 1.0 */ vbox = gtk_vbox_new( FALSE, 5 ); gtk_widget_show( vbox ); entry = gtk_button_new_with_label( "Add" ); gtk_signal_connect( GTK_OBJECT( entry ), "clicked", GTK_SIGNAL_FUNC( field_add ), index_dlg ); gtk_box_pack_start( GTK_BOX( vbox ), entry, FALSE, FALSE, 5 ); gtk_widget_show( entry ); entry = gtk_button_new_with_label( "Remove" ); gtk_box_pack_start( GTK_BOX( vbox ), entry, FALSE, FALSE, 5 ); gtk_widget_show( entry ); gtk_box_pack_end( GTK_BOX( hbox ), vbox, FALSE, FALSE, 5 ); gtk_table_attach( GTK_TABLE( table ), hbox, 0, 2, 1, 2, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 5, 5 ); entry = index_dlg->unique = gtk_check_button_new_with_label( "Allow duplicates" ); gtk_table_attach( GTK_TABLE( table ), entry, 0, 2, 2, 3, GTK_FILL|GTK_EXPAND, 0, 5, 5 ); gtk_widget_show( entry ); gtk_box_pack_start( GTK_BOX( GTK_DIALOG( dialog )->vbox ), table, TRUE, TRUE, 0 ); gtk_widget_show( table ); gtk_widget_grab_focus( index_dlg->index ); /* must come after table is shown? */ gtk_box_set_homogeneous( GTK_BOX( GTK_DIALOG( dialog )->action_area ), FALSE ); button = gtk_button_new_with_label( "Cancel" ); gtk_signal_connect( GTK_OBJECT( button ), "clicked", GTK_SIGNAL_FUNC( index_dlg_cancel ), index_dlg ); GTK_WIDGET_SET_FLAGS( button, GTK_CAN_DEFAULT ); gtk_box_pack_end( GTK_BOX( GTK_DIALOG( dialog )->action_area ), button, FALSE, FALSE, 0 ); gtk_widget_show( button ); button = gtk_button_new_with_label( "Create" ); gtk_signal_connect( GTK_OBJECT( button ), "clicked", GTK_SIGNAL_FUNC( index_dlg_done ), index_dlg ); GTK_WIDGET_SET_FLAGS( button, GTK_CAN_DEFAULT ); gtk_box_pack_end( GTK_BOX( GTK_DIALOG( dialog )->action_area ), button, FALSE, FALSE, 0 ); gtk_widget_grab_default( button ); /* must do after packing but before showing */ gtk_widget_show( button ); #if !(CONFIG_GTK_MAJOR==1 && CONFIG_GTK_MINOR==0) gtk_window_set_modal( GTK_WINDOW( dialog ), TRUE ); #endif /* not GTK 1.0 */ return index_dlg; } void index_dlg_show( IndexDlg *index_dlg ) { gtk_widget_show( index_dlg->dialog ); } void index_dlg_done( GtkWidget *widget, gpointer data ) { IndexDlg *index_dlg; gchar *name, *field; GSList *fields = NULL; int i; index_dlg = INDEX_DLG(data); g_assert( index_dlg ); gtk_widget_hide( index_dlg->dialog ); while( gtk_events_pending()) gtk_main_iteration(); name = gtk_entry_get_text( GTK_ENTRY( index_dlg->index ) ); for( i = 0; i < GTK_CLIST( index_dlg->list )->rows; i++ ) { gtk_clist_get_text( GTK_CLIST( index_dlg->list ), i, 0, &field ); if( !fields ) fields = g_slist_append( NULL, g_strdup( field ) ); else g_slist_append( fields, g_strdup( field ) ); } create_table_dlg_add_index( index_dlg->owner, name, fields, !GTK_TOGGLE_BUTTON( index_dlg->unique )->active, TRUE ); g_slist_foreach( fields, (GFunc)g_free, NULL ); g_slist_free( fields ); gtk_widget_destroy( index_dlg->dialog ); } void index_dlg_cancel( GtkWidget *widget, gpointer data ) { IndexDlg *index_dlg; index_dlg = INDEX_DLG(data); gtk_widget_destroy( index_dlg->dialog ); } gint index_dlg_key_pressed( GtkWidget *widget, GdkEventKey *event ) { if( event->keyval == GDK_Escape ) gtk_widget_destroy( widget ); return FALSE; } void index_dlg_destroyed( GtkWidget *widget, gpointer data ) { IndexDlg *index_dlg; index_dlg = INDEX_DLG( data ); if( index_dlg->avail_fields ) g_slist_foreach( index_dlg->avail_fields, (GFunc)g_free, NULL ); g_slist_free( index_dlg->avail_fields ); g_free( data ); } void index_dlg_add_field( IndexDlg *index_dlg, gchar *field ) { gtk_clist_append( GTK_CLIST( index_dlg->list ), &field ); } void index_dlg_add_avail_field( IndexDlg *index_dlg, gchar *field ) { if( !index_dlg->avail_fields ) index_dlg->avail_fields = g_slist_append( NULL, g_strdup( field ) ); else g_slist_append( index_dlg->avail_fields, g_strdup( field ) ); } void idx_field_add( gpointer data, gpointer user_data ) { gchar *field; IdxFieldDlg *idx_field_dlg; idx_field_dlg = IDX_FIELD_DLG( user_data ); field = (gchar *)data; idx_field_dlg_add_field( idx_field_dlg, field ); } void field_add( GtkWidget *widget, gpointer data ) { IndexDlg *index_dlg; IdxFieldDlg *idx_field_dlg; index_dlg = INDEX_DLG( data ); idx_field_dlg = idx_field_dlg_new( index_dlg ); g_slist_foreach( index_dlg->avail_fields, idx_field_add, idx_field_dlg ); idx_field_dlg_show( idx_field_dlg ); } void set_member_remove( GtkWidget *widget, gpointer data ) { IndexDlg *index_dlg; index_dlg = INDEX_DLG( data ); gtk_clist_remove( GTK_CLIST( index_dlg->list ), selected_field ); }