diff options
Diffstat (limited to 'src/msgbox.c')
-rwxr-xr-x | src/msgbox.c | 312 |
1 files changed, 312 insertions, 0 deletions
diff --git a/src/msgbox.c b/src/msgbox.c new file mode 100755 index 0000000..3099e50 --- /dev/null +++ b/src/msgbox.c @@ -0,0 +1,312 @@ +/* msgbox.c - 2000/10/13 */ +/* + * EasyTAG - Tag editor for MP3 and Ogg Vorbis files + * Copyright (C) 2000-2003 Jerome Couderc <easytag@gmail.com> + * + * 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. + */ +/* Note: Some pieces of codes come from gnome-dialog.c + */ + +#include <config.h> + +#include <gtk/gtk.h> +#include <glib/gi18n-lib.h> +#include <stdarg.h> + +#include "msgbox.h" +#include "easytag.h" +#include "misc.h" +#include "setting.h" + + +static void msg_box_class_init (MsgBoxClass *class); +static void msg_box_init (MsgBox *mb); + +static void msg_box_show (GtkWidget *widget); +static gint msg_box_delete_event (GtkWidget *widget, GdkEventAny *event); +static void msg_box_button_clicked (GtkButton *button, gpointer data); +void check_button_toggled (GtkCheckButton *checkbutton, gpointer data); + + +static GtkDialogClass *parent_klass = NULL; + + +GType msg_box_get_type(void) +{ + static GType mb_type = 0; + + if (!mb_type) + { + GTypeInfo mb_info = + { + sizeof(MsgBoxClass), + NULL, + NULL, + (GClassInitFunc) msg_box_class_init, + NULL, + NULL, + sizeof(MsgBox), + 0, + (GInstanceInitFunc) msg_box_init + }; + mb_type = g_type_register_static(GTK_TYPE_DIALOG, "MsgBox", &mb_info, 0); + } + return mb_type; +} + + +static void msg_box_button_clicked (GtkButton *button, gpointer data) +{ + MsgBox *mb; + + g_return_if_fail( (mb = MSG_BOX(data)) ); + + mb->button_clicked = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(button),"button_value")); + + if (gtk_main_level()>1) + gtk_main_quit(); +} + + +static void msg_box_class_init (MsgBoxClass *class) +{ + GtkObjectClass *object_class; + GtkWidgetClass *widget_class; + GtkDialogClass *dialog_class; + + object_class = (GtkObjectClass*) class; + widget_class = (GtkWidgetClass*) class; + dialog_class = (GtkDialogClass*) class; + + parent_klass = gtk_type_class(gtk_dialog_get_type()); + + object_class->destroy = msg_box_destroy; + widget_class->delete_event = msg_box_delete_event; + widget_class->show = msg_box_show; +} + + +static void msg_box_init (MsgBox *mb) +{ + g_return_if_fail(mb != NULL); + g_return_if_fail(IS_MSG_BOX(mb)); + + mb->icon = -1; + mb->check_button = NULL; + mb->check_button_state = 0; + +} + + +/* + * Create a new message box + */ +GtkWidget *msg_box_new (gchar *title, gchar *message, const gchar *stock_id, + /* Put all the buttons to display, and terminate by 0 */ + ...) +{ + MsgBox *mb; + GtkWidget *Table; + GtkWidget *Pixmap; + GtkWidget *Label; + GtkWidget *ButtonBox; + GtkWidget *Button = NULL; + va_list cursor; + gint cursor_value; + + + g_return_val_if_fail(message!=NULL, NULL); + + mb = MSG_BOX(g_object_new(TYPE_MSG_BOX, NULL)); + //mb->icon = icon; + mb->check_button = gtk_check_button_new_with_label(_("Repeat action for the rest of the files")); /* Can save or cancel all files */ + + /* Window configuration */ + gtk_window_set_title(GTK_WINDOW(mb),title); + gtk_window_set_transient_for(GTK_WINDOW(mb),GTK_WINDOW(MainWindow)); + gtk_window_set_modal(GTK_WINDOW(mb),TRUE); + + if (MESSAGE_BOX_POSITION_NONE) + gtk_window_set_position(GTK_WINDOW(mb),GTK_WIN_POS_NONE); + else if (MESSAGE_BOX_POSITION_CENTER) + gtk_window_set_position(GTK_WINDOW(mb),GTK_WIN_POS_CENTER); + else if (MESSAGE_BOX_POSITION_MOUSE) + gtk_window_set_position(GTK_WINDOW(mb),GTK_WIN_POS_MOUSE); + else if (MESSAGE_BOX_POSITION_CENTER_ON_PARENT) + gtk_window_set_position(GTK_WINDOW(mb),GTK_WIN_POS_CENTER_ON_PARENT); + + + /* Table to put: the pixmap, the message and the check button */ + Table = gtk_table_new(2,2,FALSE); + gtk_box_pack_start(GTK_BOX(GTK_DIALOG(mb)->vbox),Table,TRUE,TRUE,0); + gtk_container_set_border_width(GTK_CONTAINER(Table),4); + gtk_widget_show(Table); + + /* The Pixmap */ + Pixmap = gtk_image_new_from_stock(stock_id, GTK_ICON_SIZE_DIALOG); + gtk_table_attach_defaults(GTK_TABLE(Table),Pixmap,0,1,0,1); + //gtk_table_attach(GTK_TABLE(Table),Pixmap,0,1,0,1,GTK_FILL,GTK_FILL,0,0); + gtk_misc_set_padding(GTK_MISC(Pixmap),6,6); + gtk_widget_show(Pixmap); + + /* The Message */ + Label = gtk_label_new (message); + gtk_table_attach_defaults(GTK_TABLE(Table),Label,1,2,0,1); + gtk_misc_set_padding(GTK_MISC(Label),6,6); + gtk_label_set_justify(GTK_LABEL(Label),GTK_JUSTIFY_CENTER); + //gtk_label_set_line_wrap(GTK_LABEL(Label),TRUE); + gtk_widget_show(Label); + + /* The Check Button */ + gtk_table_attach_defaults(GTK_TABLE(Table),mb->check_button,0,2,1,2); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(mb->check_button),mb->check_button_state); + g_signal_connect(G_OBJECT(mb->check_button),"toggled",G_CALLBACK(check_button_toggled),mb); + gtk_widget_show(mb->check_button); + + + /* Buttons */ + ButtonBox = gtk_hbutton_box_new(); + gtk_box_set_spacing(GTK_BOX(ButtonBox), 15); + gtk_button_box_set_layout(GTK_BUTTON_BOX(ButtonBox), GTK_BUTTONBOX_END); + gtk_container_add(GTK_CONTAINER(GTK_DIALOG(mb)->action_area),ButtonBox); + + /* Read buttons from variable arguments */ + va_start (cursor,stock_id); + while ( (cursor_value = va_arg(cursor,gint)) != 0 ) + { + Button = Create_Button_With_Pixmap(cursor_value); + gtk_container_add(GTK_CONTAINER(ButtonBox),Button); + GTK_WIDGET_SET_FLAGS(Button,GTK_CAN_DEFAULT); + g_signal_connect(G_OBJECT(Button),"destroy", G_CALLBACK(gtk_widget_destroyed),&Button); + g_signal_connect(G_OBJECT(Button),"clicked", G_CALLBACK(msg_box_button_clicked),mb); + g_object_set_data(G_OBJECT(Button),"button_value", GINT_TO_POINTER(cursor_value)); + } + va_end(cursor); + gtk_widget_grab_default(Button); + gtk_widget_show_all(ButtonBox); + + return GTK_WIDGET(mb); +} + + +void msg_box_destroy (GtkObject *object) +{ + MsgBox *mb; + + g_return_if_fail( (mb = MSG_BOX(object)) ); + + if (mb->check_button) + gtk_widget_destroy(mb->check_button); + +/* FIXME: causes segfault in some cases (when callin gtk_widget_destroy(msgbox) ) */ +/* if (GTK_OBJECT_CLASS(parent_klass)->destroy) + * (* GTK_OBJECT_CLASS(parent_klass)->destroy) (object); + */ +} + + +static gint msg_box_delete_event (GtkWidget *widget, GdkEventAny *event) +{ + MsgBox *mb; + + g_return_val_if_fail((mb = MSG_BOX(widget)), FALSE); + + /* If the window is closed whitout pressing a button, we return -1 */ + mb->button_clicked = -1; + + if (gtk_main_level()>1) + gtk_main_quit(); + + return TRUE; +} + + +/* + * "Run" and show the msgbox, and send which button was pressed (or not a button) + */ +gint msg_box_run (MsgBox *msgbox) +{ + MsgBox *mb; + + g_return_val_if_fail((mb = MSG_BOX(msgbox)),0); + + gtk_widget_show(GTK_WIDGET(mb)); + gtk_main(); + gtk_widget_hide(GTK_WIDGET(mb)); + gtk_window_set_modal(GTK_WINDOW(mb),FALSE); + + return (MSG_BOX(mb)->button_clicked); +} + + +static void msg_box_show (GtkWidget *widget) +{ + if (GTK_WIDGET_CLASS(parent_klass)->show) + (* (GTK_WIDGET_CLASS(parent_klass)->show))(widget); +} + + +/* + * Callback when the check_button is pressed + */ +void check_button_toggled (GtkCheckButton *checkbutton, gpointer data) +{ + MsgBox *mb; + + g_return_if_fail((mb = MSG_BOX(data))); + + mb->check_button_state = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbutton)); +} + + +/* + * Set the check_button to the 'is_active' state + */ +void msg_box_check_button_set_active (MsgBox *msgbox, gboolean is_active) +{ + MsgBox *mb; + + g_return_if_fail((mb = MSG_BOX(msgbox))); + + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(mb->check_button),is_active); + mb->check_button_state = is_active; +} + + +/* + * Get state of the check_button + */ +gboolean msg_box_check_button_get_active (MsgBox *msgbox) +{ + MsgBox *mb; + + g_return_val_if_fail((mb = MSG_BOX(msgbox)),FALSE); + + return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(mb->check_button)); +} + + +/* + * Hide the check_button. + */ +void msg_box_hide_check_button (MsgBox *msgbox) +{ + MsgBox *mb; + + g_return_if_fail((mb = MSG_BOX(msgbox))); + + gtk_widget_hide(mb->check_button); +} |