diff options
author | Havoc Pennington <hp@redhat.com> | 2000-10-20 23:14:41 +0000 |
---|---|---|
committer | Havoc Pennington <hp@src.gnome.org> | 2000-10-20 23:14:41 +0000 |
commit | 1c9f0c0bac5e73d80968fc791568f1566e3ec5e6 (patch) | |
tree | a274b213438121a8a69c6a61318322b94164d59e /gtk/gtkmessagedialog.c | |
parent | 779e461e89dc5d423d9d5440d76e1f607b074b21 (diff) | |
download | gtk+-1c9f0c0bac5e73d80968fc791568f1566e3ec5e6.tar.gz |
create some stock buttons with the default accel group (create_image):
2000-10-04 Havoc Pennington <hp@redhat.com>
* gtk/testgtk.c (create_buttons): create some stock buttons
with the default accel group
(create_image): test some new GtkImage features
(make_message_dialog): test GtkMessageDialog
(create_modal_window): fix someone's bizzarro indentation
* gtk/gtkwindow.h, gtk/gtkwindow.c: Implement
GTK_WIN_POS_CENTER_ON_PARENT.
Add "destroy with parent" setting, which means the window goes
away with its transient parent.
(gtk_window_get_default_accel_group): get the default accel group
for the window.
(gtk_window_set_destroy_with_parent): set/unset destroy with
parent flag
(gtk_window_read_rcfiles): invalidate icon set caches
after reloading rcfiles
* gtk/gtkenums.h (GtkWindowPosition): add
GTK_WIN_POS_CENTER_ON_PARENT, which centers a dialog
on its parent window when the dialog is mapped for the first time.
* gtk/gtkmessagedialog.h, gtk/gtkmessagedialog.c: Add
a simple message dialog class
* gtk/gtkdialog.c (gtk_dialog_init): Connect delete event
handler to emit response signal, and maybe later it would
honor a hide_on_delete flag - though that isn't there yet.
Set border width on the vbox to 2, so we get some padding.
Use a button box for the action area.
(gtk_dialog_key_press): synthesize a delete event if Esc
is pressed and the GtkWidget key press handler didn't
handle the escape key.
(gtk_dialog_new_with_buttons): new function creates a dialog
with some default buttons in it.
(gtk_dialog_add_action_widget): add an activatable widget
as a button in the dialog - you can also add a non-activatable
widget by accessing the action area directly.
(gtk_dialog_add_button): add a simple button - stock ID or
label - to the action area
(gtk_dialog_response): emit response signal
(gtk_dialog_run): block waiting for the dialog, return
the response. Override normal delete_event behavior, so that
delete_event does nothing inside gtk_dialog_run().
* gtk/gtkdialog.h, gtk/gtkdialog.c: Add "response" signal
emitted when an action widget is clicked or the dialog gets
delete_event
* gtk/gtk.h: add gtkmessagedialog.h
* gtk/Makefile.am: add gtkmessagedialog.[hc]
2000-10-20 Havoc Pennington <hp@redhat.com>
* gtk/gtk-sections.txt: Add dialog docs
Diffstat (limited to 'gtk/gtkmessagedialog.c')
-rw-r--r-- | gtk/gtkmessagedialog.c | 251 |
1 files changed, 251 insertions, 0 deletions
diff --git a/gtk/gtkmessagedialog.c b/gtk/gtkmessagedialog.c new file mode 100644 index 0000000000..6ecb161c0b --- /dev/null +++ b/gtk/gtkmessagedialog.c @@ -0,0 +1,251 @@ +/* GTK - The GIMP Toolkit + * Copyright (C) 2000 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GTK+ Team and others 1997-1999. See the AUTHORS + * file for a list of people on the GTK+ Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GTK+ at ftp://ftp.gtk.org/pub/gtk/. + */ + +#include "gtkmessagedialog.h" +#include "gtklabel.h" +#include "gtkhbox.h" +#include "gtkimage.h" +#include "gtkstock.h" +#include "gtkiconfactory.h" + +static void gtk_message_dialog_class_init (GtkMessageDialogClass *klass); +static void gtk_message_dialog_init (GtkMessageDialog *dialog); + + +GtkType +gtk_message_dialog_get_type (void) +{ + static GtkType dialog_type = 0; + + if (!dialog_type) + { + static const GtkTypeInfo dialog_info = + { + "GtkMessageDialog", + sizeof (GtkMessageDialog), + sizeof (GtkMessageDialogClass), + (GtkClassInitFunc) gtk_message_dialog_class_init, + (GtkObjectInitFunc) gtk_message_dialog_init, + /* reserved_1 */ NULL, + /* reserved_2 */ NULL, + (GtkClassInitFunc) NULL, + }; + + dialog_type = gtk_type_unique (GTK_TYPE_DIALOG, &dialog_info); + } + + return dialog_type; +} + +static void +gtk_message_dialog_class_init (GtkMessageDialogClass *class) +{ +} + +static void +gtk_message_dialog_init (GtkMessageDialog *dialog) +{ + GtkWidget *hbox; + + dialog->label = gtk_label_new (NULL); + dialog->image = gtk_image_new_from_stock (NULL, GTK_ICON_SIZE_DIALOG); + + gtk_label_set_line_wrap (GTK_LABEL (dialog->label), TRUE); + + hbox = gtk_hbox_new (FALSE, 10); + + gtk_container_set_border_width (GTK_CONTAINER (hbox), 10); + + gtk_box_pack_start (GTK_BOX (hbox), dialog->image, + FALSE, FALSE, 2); + + gtk_box_pack_start (GTK_BOX (hbox), dialog->label, + TRUE, TRUE, 2); + + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), + hbox, + FALSE, FALSE, 10); + + gtk_widget_show_all (hbox); +} + +static void +setup_type(GtkMessageDialog *dialog, GtkMessageType type) +{ + /* Note: this function can be called more than once, + * and after showing the dialog, due to object args + */ + + const gchar *stock_id = NULL; + GtkStockItem item; + + switch (type) + { + case GTK_MESSAGE_INFO: + stock_id = GTK_STOCK_DIALOG_INFO; + break; + + case GTK_MESSAGE_QUESTION: + stock_id = GTK_STOCK_DIALOG_QUESTION; + break; + + case GTK_MESSAGE_WARNING: + stock_id = GTK_STOCK_DIALOG_WARNING; + break; + + case GTK_MESSAGE_ERROR: + stock_id = GTK_STOCK_DIALOG_ERROR; + break; + + default: + g_warning ("Unknown GtkMessageType %d", type); + break; + } + + if (stock_id == NULL) + stock_id = GTK_STOCK_DIALOG_INFO; + + if (gtk_stock_lookup (stock_id, &item)) + { + gtk_image_set_from_stock (GTK_IMAGE (dialog->image), stock_id, + GTK_ICON_SIZE_DIALOG); + + gtk_window_set_title (GTK_WINDOW (dialog), item.label); + } + else + g_warning ("Stock dialog ID doesn't exist?"); +} + +/** + * gtk_message_dialog_new: + * @parent: transient parent, or NULL for none + * @flags: flags + * @type: type of message + * @buttons: set of buttons to use + * @message_format: printf()-style format string, or NULL + * @Varargs: arguments for @message_format + * + * Creates a new message dialog, which is a simple dialog with an icon + * indicating the dialog type (error, warning, etc.) and some text the + * user may want to see. If the button set you select with the @buttons + * argument has positive buttons (OK, Yes) they will result in a response ID + * of GTK_RESPONSE_ACCEPT. If it has negative buttons (Cancel, No) they will + * result in a response ID of GTK_RESPONSE_REJECT. See #GtkDialog for more + * details. + * + * Return value: a new #GtkMessageDialog + **/ +GtkWidget* +gtk_message_dialog_new (GtkWindow *parent, + GtkDialogFlags flags, + GtkMessageType type, + GtkButtonsType buttons, + const gchar *message_format, + ...) +{ + GtkWidget *widget; + GtkDialog *dialog; + gchar* msg; + va_list args; + + widget = GTK_WIDGET (gtk_type_new (GTK_TYPE_MESSAGE_DIALOG)); + dialog = GTK_DIALOG (widget); + + if (message_format) + { + va_start (args, message_format); + msg = g_strdup_vprintf(message_format, args); + va_end (args); + + + gtk_label_set_text (GTK_LABEL (GTK_MESSAGE_DIALOG (widget)->label), + msg); + + g_free (msg); + } + + if (parent != NULL) + gtk_window_set_transient_for (GTK_WINDOW (widget), + GTK_WINDOW (parent)); + + + if (flags & GTK_DIALOG_MODAL) + gtk_window_set_modal (GTK_WINDOW (dialog), TRUE); + + if (flags & GTK_DIALOG_DESTROY_WITH_PARENT) + gtk_window_set_destroy_with_parent (GTK_WINDOW (dialog), TRUE); + + setup_type (GTK_MESSAGE_DIALOG (dialog), type); + + switch (buttons) + { + case GTK_BUTTONS_NONE: + /* nothing */ + break; + + case GTK_BUTTONS_OK: + gtk_dialog_add_button (dialog, + GTK_STOCK_BUTTON_OK, + GTK_RESPONSE_ACCEPT); + break; + + case GTK_BUTTONS_CLOSE: + gtk_dialog_add_button (dialog, + GTK_STOCK_BUTTON_CLOSE, + GTK_RESPONSE_ACCEPT); + break; + + case GTK_BUTTONS_CANCEL: + gtk_dialog_add_button (dialog, + GTK_STOCK_BUTTON_CANCEL, + GTK_RESPONSE_REJECT); + break; + + case GTK_BUTTONS_YES_NO: + gtk_dialog_add_button (dialog, + GTK_STOCK_BUTTON_YES, + GTK_RESPONSE_ACCEPT); + gtk_dialog_add_button (dialog, + GTK_STOCK_BUTTON_NO, + GTK_RESPONSE_REJECT); + break; + + case GTK_BUTTONS_OK_CANCEL: + gtk_dialog_add_button (dialog, + GTK_STOCK_BUTTON_OK, + GTK_RESPONSE_ACCEPT); + gtk_dialog_add_button (dialog, + GTK_STOCK_BUTTON_CANCEL, + GTK_RESPONSE_REJECT); + break; + + default: + g_warning ("Unknown GtkButtonsType"); + break; + } + + return widget; +} |