]> de.git.xonotic.org Git - xonotic/netradiant.git/blob - libs/gtkutil/messagebox.cpp
my own uncrustify run
[xonotic/netradiant.git] / libs / gtkutil / messagebox.cpp
1 /*
2    Copyright (C) 2001-2006, William Joseph.
3    All Rights Reserved.
4
5    This file is part of GtkRadiant.
6
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.
11
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.
16
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
20  */
21
22 #include "messagebox.h"
23
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>
34
35 #include "dialog.h"
36 #include "widget.h"
37
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 );
42         return widget;
43 }
44
45 const char* messagebox_stock_icon( EMessageBoxIcon type ){
46         switch ( type )
47         {
48         default:
49         case eMB_ICONDEFAULT:
50                 return GTK_STOCK_DIALOG_INFO;
51         case eMB_ICONERROR:
52                 return GTK_STOCK_DIALOG_ERROR;
53         case eMB_ICONWARNING:
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;
59         }
60 }
61
62 EMessageBoxReturn gtk_MessageBox( GtkWidget *parent, const char* text, const char* title, EMessageBoxType type, EMessageBoxIcon icon ){
63         ModalDialog dialog;
64         ModalDialogButton ok_button( dialog, eIDOK );
65         ModalDialogButton cancel_button( dialog, eIDCANCEL );
66         ModalDialogButton yes_button( dialog, eIDYES );
67         ModalDialogButton no_button( dialog, eIDNO );
68
69         GtkWindow* parentWindow = parent != 0 ? GTK_WINDOW( parent ) : 0;
70
71         GtkWindow* window = create_fixedsize_modal_dialog_window( parentWindow, title, dialog, 400, 100 );
72
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 );
76         }
77
78         GtkAccelGroup* accel = gtk_accel_group_new();
79         gtk_window_add_accel_group( window, accel );
80
81         GtkVBox* vbox = create_dialog_vbox( 8, 8 );
82         gtk_container_add( GTK_CONTAINER( window ), GTK_WIDGET( vbox ) );
83
84
85         GtkHBox* hboxDummy = create_dialog_hbox( 0, 0 );
86         gtk_box_pack_start( GTK_BOX( vbox ), GTK_WIDGET( hboxDummy ), FALSE, FALSE, 0 );
87
88         gtk_box_pack_start( GTK_BOX( hboxDummy ), create_padding( 0, 50 ), FALSE, FALSE, 0 ); // HACK to force minimum height
89
90         GtkHBox* iconBox = create_dialog_hbox( 16, 0 );
91         gtk_box_pack_start( GTK_BOX( hboxDummy ), GTK_WIDGET( iconBox ), FALSE, FALSE, 0 );
92
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 );
96
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 );
103
104
105         GtkVBox* vboxDummy = create_dialog_vbox( 0, 0 );
106         gtk_box_pack_start( GTK_BOX( vbox ), GTK_WIDGET( vboxDummy ), FALSE, FALSE, 0 );
107
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 );
111
112         GtkHBox* hbox = create_dialog_hbox( 8, 0 );
113         gtk_container_add( GTK_CONTAINER( alignment ), GTK_WIDGET( hbox ) );
114
115         gtk_box_pack_start( GTK_BOX( vboxDummy ), create_padding( 400, 0 ), FALSE, FALSE, 0 ); // HACK to force minimum width
116
117
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 ) );
125
126                 dialog.ret = eIDOK;
127         }
128         else if ( type ==  eMB_OKCANCEL ) {
129                 {
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 ) );
135                 }
136
137                 {
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 ) );
142                 }
143
144                 dialog.ret = eIDCANCEL;
145         }
146         else if ( type == eMB_YESNOCANCEL ) {
147                 {
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 ) );
152                 }
153
154                 {
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 ) );
158                 }
159                 {
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 ) );
163                 }
164
165                 dialog.ret = eIDCANCEL;
166         }
167         else if ( type == eMB_NOYES ) {
168                 {
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 ) );
173                 }
174                 {
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 ) );
178                 }
179
180                 dialog.ret = eIDNO;
181         }
182         else /* if (type == eMB_YESNO) */
183         {
184                 {
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 ) );
189                 }
190
191                 {
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 ) );
195                 }
196                 dialog.ret = eIDNO;
197         }
198
199         modal_dialog_show( window, dialog );
200
201         gtk_widget_destroy( GTK_WIDGET( window ) );
202
203         return dialog.ret;
204 }