2 Copyright (C) 2001-2006, William Joseph.
5 This file is part of GtkRadiant.
7 GtkRadiant is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 GtkRadiant is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GtkRadiant; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22 #include "messagebox.h"
24 #include <gdk/gdkkeysyms.h>
25 #include <gtk/gtkmain.h>
26 #include <gtk/gtkwindow.h>
27 #include <gtk/gtkhbox.h>
28 #include <gtk/gtkvbox.h>
29 #include <gtk/gtklabel.h>
30 #include <gtk/gtkalignment.h>
31 #include <gtk/gtkbutton.h>
32 #include <gtk/gtkimage.h>
33 #include <gtk/gtkstock.h>
38 GtkWidget* create_padding( int width, int height ){
39 GtkWidget* widget = gtk_alignment_new( 0.0, 0.0, 0.0, 0.0 );
40 gtk_widget_show( widget );
41 gtk_widget_set_size_request( widget, width, height );
45 const char* messagebox_stock_icon( EMessageBoxIcon type ){
50 return GTK_STOCK_DIALOG_INFO;
52 return GTK_STOCK_DIALOG_ERROR;
54 return GTK_STOCK_DIALOG_WARNING;
55 case eMB_ICONQUESTION:
56 return GTK_STOCK_DIALOG_QUESTION;
57 case eMB_ICONASTERISK:
58 return GTK_STOCK_DIALOG_INFO;
62 EMessageBoxReturn gtk_MessageBox( GtkWidget *parent, const char* text, const char* title, EMessageBoxType type, EMessageBoxIcon icon ){
64 ModalDialogButton ok_button( dialog, eIDOK );
65 ModalDialogButton cancel_button( dialog, eIDCANCEL );
66 ModalDialogButton yes_button( dialog, eIDYES );
67 ModalDialogButton no_button( dialog, eIDNO );
69 GtkWindow* parentWindow = parent != 0 ? GTK_WINDOW( parent ) : 0;
71 GtkWindow* window = create_fixedsize_modal_dialog_window( parentWindow, title, dialog, 400, 100 );
73 if ( parentWindow != 0 ) {
74 //g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(floating_window_delete_present), parent);
75 gtk_window_deiconify( parentWindow );
78 GtkAccelGroup* accel = gtk_accel_group_new();
79 gtk_window_add_accel_group( window, accel );
81 GtkVBox* vbox = create_dialog_vbox( 8, 8 );
82 gtk_container_add( GTK_CONTAINER( window ), GTK_WIDGET( vbox ) );
85 GtkHBox* hboxDummy = create_dialog_hbox( 0, 0 );
86 gtk_box_pack_start( GTK_BOX( vbox ), GTK_WIDGET( hboxDummy ), FALSE, FALSE, 0 );
88 gtk_box_pack_start( GTK_BOX( hboxDummy ), create_padding( 0, 50 ), FALSE, FALSE, 0 ); // HACK to force minimum height
90 GtkHBox* iconBox = create_dialog_hbox( 16, 0 );
91 gtk_box_pack_start( GTK_BOX( hboxDummy ), GTK_WIDGET( iconBox ), FALSE, FALSE, 0 );
93 GtkImage* image = GTK_IMAGE( gtk_image_new_from_stock( messagebox_stock_icon( icon ), GTK_ICON_SIZE_DIALOG ) );
94 gtk_widget_show( GTK_WIDGET( image ) );
95 gtk_box_pack_start( GTK_BOX( iconBox ), GTK_WIDGET( image ), FALSE, FALSE, 0 );
97 GtkLabel* label = GTK_LABEL( gtk_label_new( text ) );
98 gtk_widget_show( GTK_WIDGET( label ) );
99 gtk_misc_set_alignment( GTK_MISC( label ), 0, 0.5 );
100 gtk_label_set_justify( label, GTK_JUSTIFY_LEFT );
101 gtk_label_set_line_wrap( label, TRUE );
102 gtk_box_pack_start( GTK_BOX( iconBox ), GTK_WIDGET( label ), TRUE, TRUE, 0 );
105 GtkVBox* vboxDummy = create_dialog_vbox( 0, 0 );
106 gtk_box_pack_start( GTK_BOX( vbox ), GTK_WIDGET( vboxDummy ), FALSE, FALSE, 0 );
108 GtkAlignment* alignment = GTK_ALIGNMENT( gtk_alignment_new( 0.5, 0.0, 0.0, 0.0 ) );
109 gtk_widget_show( GTK_WIDGET( alignment ) );
110 gtk_box_pack_start( GTK_BOX( vboxDummy ), GTK_WIDGET( alignment ), FALSE, FALSE, 0 );
112 GtkHBox* hbox = create_dialog_hbox( 8, 0 );
113 gtk_container_add( GTK_CONTAINER( alignment ), GTK_WIDGET( hbox ) );
115 gtk_box_pack_start( GTK_BOX( vboxDummy ), create_padding( 400, 0 ), FALSE, FALSE, 0 ); // HACK to force minimum width
118 if ( type == eMB_OK ) {
119 GtkButton* button = create_modal_dialog_button( "OK", ok_button );
120 gtk_box_pack_start( GTK_BOX( hbox ), GTK_WIDGET( button ), TRUE, FALSE, 0 );
121 gtk_widget_add_accelerator( GTK_WIDGET( button ), "clicked", accel, GDK_Escape, (GdkModifierType)0, (GtkAccelFlags)0 );
122 gtk_widget_add_accelerator( GTK_WIDGET( button ), "clicked", accel, GDK_Return, (GdkModifierType)0, (GtkAccelFlags)0 );
123 widget_make_default( GTK_WIDGET( button ) );
124 gtk_widget_show( GTK_WIDGET( button ) );
128 else if ( type == eMB_OKCANCEL ) {
130 GtkButton* button = create_modal_dialog_button( "OK", ok_button );
131 gtk_box_pack_start( GTK_BOX( hbox ), GTK_WIDGET( button ), TRUE, FALSE, 0 );
132 gtk_widget_add_accelerator( GTK_WIDGET( button ), "clicked", accel, GDK_Return, (GdkModifierType)0, (GtkAccelFlags)0 );
133 widget_make_default( GTK_WIDGET( button ) );
134 gtk_widget_show( GTK_WIDGET( button ) );
138 GtkButton* button = create_modal_dialog_button( "OK", cancel_button );
139 gtk_box_pack_start( GTK_BOX( hbox ), GTK_WIDGET( button ), TRUE, FALSE, 0 );
140 gtk_widget_add_accelerator( GTK_WIDGET( button ), "clicked", accel, GDK_Escape, (GdkModifierType)0, (GtkAccelFlags)0 );
141 gtk_widget_show( GTK_WIDGET( button ) );
144 dialog.ret = eIDCANCEL;
146 else if ( type == eMB_YESNOCANCEL ) {
148 GtkButton* button = create_modal_dialog_button( "Yes", yes_button );
149 gtk_box_pack_start( GTK_BOX( hbox ), GTK_WIDGET( button ), TRUE, FALSE, 0 );
150 widget_make_default( GTK_WIDGET( button ) );
151 gtk_widget_show( GTK_WIDGET( button ) );
155 GtkButton* button = create_modal_dialog_button( "No", no_button );
156 gtk_box_pack_start( GTK_BOX( hbox ), GTK_WIDGET( button ), TRUE, FALSE, 0 );
157 gtk_widget_show( GTK_WIDGET( button ) );
160 GtkButton* button = create_modal_dialog_button( "Cancel", cancel_button );
161 gtk_box_pack_start( GTK_BOX( hbox ), GTK_WIDGET( button ), TRUE, FALSE, 0 );
162 gtk_widget_show( GTK_WIDGET( button ) );
165 dialog.ret = eIDCANCEL;
167 else if ( type == eMB_NOYES ) {
169 GtkButton* button = create_modal_dialog_button( "No", no_button );
170 gtk_box_pack_start( GTK_BOX( hbox ), GTK_WIDGET( button ), TRUE, FALSE, 0 );
171 widget_make_default( GTK_WIDGET( button ) );
172 gtk_widget_show( GTK_WIDGET( button ) );
175 GtkButton* button = create_modal_dialog_button( "Yes", yes_button );
176 gtk_box_pack_start( GTK_BOX( hbox ), GTK_WIDGET( button ), TRUE, FALSE, 0 );
177 gtk_widget_show( GTK_WIDGET( button ) );
182 else /* if (type == eMB_YESNO) */
185 GtkButton* button = create_modal_dialog_button( "Yes", yes_button );
186 gtk_box_pack_start( GTK_BOX( hbox ), GTK_WIDGET( button ), TRUE, FALSE, 0 );
187 widget_make_default( GTK_WIDGET( button ) );
188 gtk_widget_show( GTK_WIDGET( button ) );
192 GtkButton* button = create_modal_dialog_button( "No", no_button );
193 gtk_box_pack_start( GTK_BOX( hbox ), GTK_WIDGET( button ), TRUE, FALSE, 0 );
194 gtk_widget_show( GTK_WIDGET( button ) );
199 modal_dialog_show( window, dialog );
201 gtk_widget_destroy( GTK_WIDGET( window ) );