]> de.git.xonotic.org Git - voretournament/voretournament.git/blob - misc/mediasource/extra/netradiant-src/libs/gtkutil/messagebox.cpp
Include netRadiant source in this GIT
[voretournament/voretournament.git] / misc / mediasource / extra / netradiant-src / 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 {
40   GtkWidget* widget = gtk_alignment_new(0.0, 0.0, 0.0, 0.0);
41   gtk_widget_show(widget);
42   gtk_widget_set_size_request(widget, width, height);
43   return widget;
44 }
45
46 const char* messagebox_stock_icon(EMessageBoxIcon type)
47 {
48   switch(type)
49   {
50   default:
51   case eMB_ICONDEFAULT:
52     return GTK_STOCK_DIALOG_INFO;
53   case eMB_ICONERROR:
54     return GTK_STOCK_DIALOG_ERROR;
55   case eMB_ICONWARNING:
56     return GTK_STOCK_DIALOG_WARNING;
57   case eMB_ICONQUESTION:
58     return GTK_STOCK_DIALOG_QUESTION;
59   case eMB_ICONASTERISK:
60     return GTK_STOCK_DIALOG_INFO;
61   }
62 }
63
64 EMessageBoxReturn gtk_MessageBox (GtkWidget *parent, const char* text, const char* title, EMessageBoxType type, EMessageBoxIcon icon)
65 {
66   ModalDialog dialog;
67   ModalDialogButton ok_button(dialog, eIDOK);
68   ModalDialogButton cancel_button(dialog, eIDCANCEL);
69   ModalDialogButton yes_button(dialog, eIDYES);
70   ModalDialogButton no_button(dialog, eIDNO);
71
72   GtkWindow* parentWindow = parent != 0 ? GTK_WINDOW(parent) : 0;
73
74   GtkWindow* window = create_fixedsize_modal_dialog_window(parentWindow, title, dialog, 400, 100);
75
76   if(parentWindow != 0)
77   {
78     //g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(floating_window_delete_present), parent);
79     gtk_window_deiconify(parentWindow);
80   }  
81
82   GtkAccelGroup* accel = gtk_accel_group_new();
83   gtk_window_add_accel_group(window, accel);
84
85   GtkVBox* vbox = create_dialog_vbox(8, 8);
86   gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(vbox));
87
88
89   GtkHBox* hboxDummy = create_dialog_hbox(0, 0);
90   gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(hboxDummy), FALSE, FALSE, 0);
91
92   gtk_box_pack_start(GTK_BOX(hboxDummy), create_padding(0, 50), FALSE, FALSE, 0); // HACK to force minimum height
93
94   GtkHBox* iconBox = create_dialog_hbox(16, 0);
95   gtk_box_pack_start(GTK_BOX(hboxDummy), GTK_WIDGET(iconBox), FALSE, FALSE, 0);
96
97   GtkImage* image = GTK_IMAGE(gtk_image_new_from_stock(messagebox_stock_icon(icon), GTK_ICON_SIZE_DIALOG));
98   gtk_widget_show(GTK_WIDGET(image));
99   gtk_box_pack_start(GTK_BOX(iconBox), GTK_WIDGET(image), FALSE, FALSE, 0);
100
101   GtkLabel* label = GTK_LABEL(gtk_label_new(text));
102   gtk_widget_show(GTK_WIDGET(label));
103   gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
104   gtk_label_set_justify(label, GTK_JUSTIFY_LEFT);
105   gtk_label_set_line_wrap(label, TRUE);
106   gtk_box_pack_start(GTK_BOX(iconBox), GTK_WIDGET(label), TRUE, TRUE, 0);
107
108
109   GtkVBox* vboxDummy = create_dialog_vbox(0, 0);
110   gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(vboxDummy), FALSE, FALSE, 0);
111
112   GtkAlignment* alignment = GTK_ALIGNMENT(gtk_alignment_new(0.5, 0.0, 0.0, 0.0));
113   gtk_widget_show(GTK_WIDGET(alignment));
114   gtk_box_pack_start(GTK_BOX(vboxDummy), GTK_WIDGET(alignment), FALSE, FALSE, 0);
115
116   GtkHBox* hbox = create_dialog_hbox(8, 0);
117   gtk_container_add(GTK_CONTAINER(alignment), GTK_WIDGET(hbox));
118
119   gtk_box_pack_start(GTK_BOX(vboxDummy), create_padding(400, 0), FALSE, FALSE, 0); // HACK to force minimum width
120
121
122   if (type == eMB_OK)
123   {
124     GtkButton* button = create_modal_dialog_button("OK", ok_button);
125     gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(button), TRUE, FALSE, 0);
126     gtk_widget_add_accelerator(GTK_WIDGET(button), "clicked", accel, GDK_Escape, (GdkModifierType)0, (GtkAccelFlags)0);
127     gtk_widget_add_accelerator(GTK_WIDGET(button), "clicked", accel, GDK_Return, (GdkModifierType)0, (GtkAccelFlags)0);
128     widget_make_default(GTK_WIDGET(button));
129     gtk_widget_show(GTK_WIDGET(button));
130
131     dialog.ret = eIDOK;
132   }
133   else if (type ==  eMB_OKCANCEL)
134   {
135     {
136       GtkButton* button = create_modal_dialog_button("OK", ok_button);
137       gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(button), TRUE, FALSE, 0);
138       gtk_widget_add_accelerator(GTK_WIDGET(button), "clicked", accel, GDK_Return, (GdkModifierType)0, (GtkAccelFlags)0);
139       widget_make_default(GTK_WIDGET(button));
140       gtk_widget_show(GTK_WIDGET(button));
141     }
142
143     {
144       GtkButton* button = create_modal_dialog_button("OK", cancel_button);
145       gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(button), TRUE, FALSE, 0);
146       gtk_widget_add_accelerator(GTK_WIDGET(button), "clicked", accel, GDK_Escape, (GdkModifierType)0, (GtkAccelFlags)0);
147       gtk_widget_show(GTK_WIDGET(button));
148     }
149
150     dialog.ret = eIDCANCEL;
151   }
152   else if (type == eMB_YESNOCANCEL)
153   {
154     {
155       GtkButton* button = create_modal_dialog_button("Yes", yes_button);
156       gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(button), TRUE, FALSE, 0);
157       widget_make_default(GTK_WIDGET(button));
158       gtk_widget_show(GTK_WIDGET(button));
159     }
160
161     {
162       GtkButton* button = create_modal_dialog_button("No", no_button);
163       gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(button), TRUE, FALSE, 0);
164       gtk_widget_show(GTK_WIDGET(button));
165     }
166     {
167       GtkButton* button = create_modal_dialog_button("Cancel", cancel_button);
168       gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(button), TRUE, FALSE, 0);
169       gtk_widget_show(GTK_WIDGET(button));
170     }
171
172     dialog.ret = eIDCANCEL;
173   }
174   else if (type == eMB_NOYES)
175   {
176     {
177       GtkButton* button = create_modal_dialog_button("No", no_button);
178       gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(button), TRUE, FALSE, 0);
179       widget_make_default(GTK_WIDGET(button));
180       gtk_widget_show(GTK_WIDGET(button));
181     }
182     {
183       GtkButton* button = create_modal_dialog_button("Yes", yes_button);
184       gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(button), TRUE, FALSE, 0);
185       gtk_widget_show(GTK_WIDGET(button));
186     }
187
188     dialog.ret = eIDNO;
189   }
190   else /* if (type == eMB_YESNO) */
191   {
192     {
193       GtkButton* button = create_modal_dialog_button("Yes", yes_button);
194       gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(button), TRUE, FALSE, 0);
195       widget_make_default(GTK_WIDGET(button));
196       gtk_widget_show(GTK_WIDGET(button));
197     }
198  
199     {
200       GtkButton* button = create_modal_dialog_button("No", no_button);
201       gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(button), TRUE, FALSE, 0);
202       gtk_widget_show(GTK_WIDGET(button));
203     }
204     dialog.ret = eIDNO;
205   }
206
207   modal_dialog_show(window, dialog);
208
209   gtk_widget_destroy(GTK_WIDGET(window));
210
211   return dialog.ret;
212 }
213