/* Jungle Monkey * Copyright (C) 1999-2001 The Regents of the University of Michigan * * 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 "ggui.h" #include "entry_dialog.h" struct _EntryDialog { GtkWidget* dialog; GtkWidget* entry; GtkWidget* entry2; EntryDialogOkFunc ok_func; EntryDialogCancelFunc cancel_func; }; static void on_entry_dialog_ok(gpointer, EntryDialog* entry_dialog); #ifdef JM_ENABLE_GNOME static void on_entry_dialog_changed (GtkEditable* editable, EntryDialog* entry_dialog); static void on_entry_dialog_clicked (GnomeDialog *dialog, gint button_number, EntryDialog* entry_dialog); #else static void on_entry_dialog_cancel(GtkButton* button, EntryDialog* entry_dialog); #endif EntryDialog* entry_dialog_new (gchar* title, gchar* entry_text, gchar* entry_text2, EntryDialogOkFunc ok_func, EntryDialogCancelFunc cancel_func) { EntryDialog* entry_dialog; GtkWidget* dialog = NULL; GtkWidget* entry = NULL; GtkWidget* entry2 = NULL; GtkWidget* label = NULL; g_return_val_if_fail (title, NULL); g_return_val_if_fail (entry_text, NULL); g_return_val_if_fail (ok_func, NULL); g_return_val_if_fail (cancel_func, NULL); entry_dialog = g_new0(EntryDialog, 1); #ifdef JM_ENABLE_GNOME { GtkWidget* vbox; GtkWidget* hbox; dialog = gnome_dialog_new (title, GNOME_STOCK_BUTTON_OK, GNOME_STOCK_BUTTON_CANCEL, NULL); GTK_WINDOW(dialog)->position = GTK_WIN_POS_MOUSE; gnome_dialog_set_default (GNOME_DIALOG(dialog), 1); vbox = gtk_vbox_new (FALSE, 2); gtk_box_pack_start (GTK_BOX(GNOME_DIALOG(dialog)->vbox), vbox, TRUE, TRUE, 0); gtk_widget_show (vbox); hbox = gtk_hbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX(vbox), hbox, TRUE, TRUE, 0); gtk_widget_show (hbox); label = gtk_label_new(entry_text); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 4); gtk_widget_show(label); entry = gtk_entry_new(); gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 4); gtk_widget_show(entry); if (entry_text2) { hbox = gtk_hbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX(vbox), hbox, TRUE, TRUE, 0); gtk_widget_show (hbox); label = gtk_label_new (entry_text2); gtk_box_pack_start (GTK_BOX(hbox), label, TRUE, FALSE, 4); gtk_widget_show (label); entry2 = gtk_entry_new(); gtk_box_pack_start (GTK_BOX(hbox), entry2, TRUE, TRUE, 4); gtk_widget_show (entry2); gtk_signal_connect (GTK_OBJECT(entry2), "changed", GTK_SIGNAL_FUNC(on_entry_dialog_changed), (gpointer) entry_dialog); } gtk_signal_connect (GTK_OBJECT(dialog), "clicked", GTK_SIGNAL_FUNC(on_entry_dialog_clicked), (gpointer) entry_dialog); gtk_signal_connect (GTK_OBJECT(entry), "changed", GTK_SIGNAL_FUNC(on_entry_dialog_changed), (gpointer) entry_dialog); } #else { GtkWidget* vbox; GtkWidget* hbox; GtkWidget* button; dialog = gtk_dialog_new(); gtk_window_set_title(GTK_WINDOW(dialog), title); GTK_WINDOW(dialog)->position = GTK_WIN_POS_MOUSE; vbox = gtk_vbox_new (FALSE, 2); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), vbox, TRUE, TRUE, 0); gtk_widget_show (vbox); hbox = gtk_hbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX(vbox), hbox, TRUE, TRUE, 0); gtk_widget_show (hbox); label = gtk_label_new(entry_text); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 4); gtk_widget_show(label); entry = gtk_entry_new(); gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 4); gtk_widget_show(entry); if (entry_text2) { hbox = gtk_hbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX(vbox), hbox, TRUE, TRUE, 0); gtk_widget_show (hbox); label = gtk_label_new (entry_text2); gtk_box_pack_start (GTK_BOX(hbox), label, TRUE, FALSE, 4); gtk_widget_show (label); entry2 = gtk_entry_new(); gtk_box_pack_start (GTK_BOX(hbox), entry2, TRUE, TRUE, 4); gtk_widget_show (entry2); } hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->action_area), hbox, TRUE, TRUE, 0); gtk_widget_show(hbox); button = gtk_button_new_with_label (_("OK")); gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC(on_entry_dialog_ok), (gpointer) entry_dialog); gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 4); gtk_widget_show (button); button = gtk_button_new_with_label (_("Cancel")); gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC(on_entry_dialog_cancel), (gpointer) entry_dialog); gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 4); gtk_widget_show (button); } #endif gtk_signal_connect (GTK_OBJECT (entry), "activate", GTK_SIGNAL_FUNC(on_entry_dialog_ok), (gpointer) entry_dialog); if (entry2) { gtk_signal_connect (GTK_OBJECT (entry2), "activate", GTK_SIGNAL_FUNC(on_entry_dialog_ok), (gpointer) entry_dialog); } gtk_widget_show(dialog); entry_dialog->dialog = dialog; entry_dialog->entry = entry; entry_dialog->entry2 = entry2; entry_dialog->ok_func = ok_func; entry_dialog->cancel_func = cancel_func; return entry_dialog; } void entry_dialog_show (EntryDialog* ed) { g_return_if_fail (ed); gtk_widget_show (ed->dialog); } void entry_dialog_set_text (EntryDialog* ed, const gchar* text) { g_return_if_fail (ed); gtk_entry_set_text(GTK_ENTRY(ed->entry), text); } static void on_entry_dialog_ok (gpointer button_or_entry, EntryDialog* entry_dialog) { gchar* text; gchar* text2 = NULL; text = gtk_entry_get_text(GTK_ENTRY(entry_dialog->entry)); if (entry_dialog->entry2) text2 = gtk_entry_get_text(GTK_ENTRY(entry_dialog->entry2)); if (text && text[0] != '\0') { gchar* new_text_dup; gchar* new_text2_dup = NULL; gchar* new_text; gchar* new_text2 = NULL; new_text_dup = g_strdup(text); new_text = g_strstrip(new_text_dup); if (text2) { new_text2_dup = g_strdup(text2); new_text2 = g_strstrip(new_text2_dup); } (*entry_dialog->ok_func)(new_text, new_text2); g_free (new_text_dup); g_free (new_text2_dup); } else (*entry_dialog->cancel_func)(); gtk_widget_destroy(entry_dialog->dialog); g_free(entry_dialog); } #ifdef JM_ENABLE_GNOME static void on_entry_dialog_changed (GtkEditable* editable, EntryDialog* entry_dialog) { gchar* text; text = gtk_entry_get_text(GTK_ENTRY(entry_dialog->entry)); if (text && *text) gnome_dialog_set_default (GNOME_DIALOG(entry_dialog->dialog), 0); else gnome_dialog_set_default (GNOME_DIALOG(entry_dialog->dialog), 1); } static void on_entry_dialog_clicked(GnomeDialog *dialog, gint button_number, EntryDialog* entry_dialog) { if (button_number == 0) { gchar* text; gchar* text2 = NULL; text = gtk_entry_get_text(GTK_ENTRY(entry_dialog->entry)); if (entry_dialog->entry2) text2 = gtk_entry_get_text(GTK_ENTRY(entry_dialog->entry2)); if (text && text[0] != '\0') { gchar* new_text_dup; gchar* new_text2_dup = NULL; gchar* new_text; gchar* new_text2 = NULL; new_text_dup = g_strdup(text); new_text = g_strstrip(new_text_dup); if (text2) { new_text2_dup = g_strdup(text2); new_text2 = g_strstrip(new_text2_dup); } (*entry_dialog->ok_func)(new_text, new_text2); g_free (new_text_dup); g_free (new_text2_dup); } else (*entry_dialog->cancel_func)(); } else (entry_dialog->cancel_func)(); gtk_widget_destroy(entry_dialog->dialog); g_free(entry_dialog); } #else static void on_entry_dialog_cancel(GtkButton* button, EntryDialog* entry_dialog) { (*entry_dialog->cancel_func)(); gtk_widget_destroy(entry_dialog->dialog); g_free(entry_dialog); } #endif