]> de.git.xonotic.org Git - xonotic/netradiant.git/blob - contrib/bobtoolz/dialogs/dialogs-gtk.cpp
fixed memleak
[xonotic/netradiant.git] / contrib / bobtoolz / dialogs / dialogs-gtk.cpp
1 /*
2 BobToolz plugin for GtkRadiant
3 Copyright (C) 2001 Gordon Biggans
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with this library; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18 */
19
20 #include "dialogs-gtk.h"
21 #include "../funchandlers.h"
22
23 #include "str.h"
24 #include <list>
25
26 #include "../lists.h"
27 #include "../misc.h"
28
29
30 /*--------------------------------
31                 Callback Functions
32 ---------------------------------*/
33
34 typedef struct {
35         GtkWidget *cbTexChange;
36         GtkWidget *editTexOld, *editTexNew;
37
38   GtkWidget *cbScaleHor, *cbScaleVert;
39         GtkWidget *editScaleHor, *editScaleVert;
40
41   GtkWidget *cbShiftHor, *cbShiftVert;
42         GtkWidget *editShiftHor, *editShiftVert;
43
44         GtkWidget *cbRotation;
45         GtkWidget *editRotation;
46 }dlg_texReset_t;
47
48 dlg_texReset_t dlgTexReset;
49
50 void Update_TextureReseter();
51
52 static void dialog_button_callback_texreset_update (GtkWidget *widget, gpointer data)
53 {
54   Update_TextureReseter();
55 }
56
57 void Update_TextureReseter()
58 {
59   gboolean check;
60
61   check = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( dlgTexReset.cbTexChange ));
62   gtk_entry_set_editable (GTK_ENTRY (dlgTexReset.editTexNew), check);
63   gtk_entry_set_editable (GTK_ENTRY (dlgTexReset.editTexOld), check);
64
65   check = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( dlgTexReset.cbScaleHor ));
66   gtk_entry_set_editable (GTK_ENTRY (dlgTexReset.editScaleHor), check);
67
68   check = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( dlgTexReset.cbScaleVert ));
69   gtk_entry_set_editable (GTK_ENTRY (dlgTexReset.editScaleVert), check);
70
71   check = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( dlgTexReset.cbShiftHor ));
72   gtk_entry_set_editable (GTK_ENTRY (dlgTexReset.editShiftHor), check);
73
74   check = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( dlgTexReset.cbShiftVert ));
75   gtk_entry_set_editable (GTK_ENTRY (dlgTexReset.editShiftVert), check);
76
77   check = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( dlgTexReset.cbRotation ));
78   gtk_entry_set_editable (GTK_ENTRY (dlgTexReset.editRotation), check);
79 }
80
81 static void dialog_button_callback (GtkWidget *widget, gpointer data)
82 {
83         GtkWidget *parent;
84         int *loop;
85   EMessageBoxReturn *ret;
86  
87         parent = gtk_widget_get_toplevel (widget);
88         loop = (int*)g_object_get_data (G_OBJECT (parent), "loop");
89         ret = (EMessageBoxReturn*)g_object_get_data (G_OBJECT (parent), "ret");
90  
91         *loop = 0;
92         *ret = (EMessageBoxReturn)GPOINTER_TO_INT(data);
93 }
94  
95 static gint dialog_delete_callback (GtkWidget *widget, GdkEvent* event, gpointer data)
96 {
97         int *loop;
98  
99         gtk_widget_hide (widget);
100         loop = (int*)g_object_get_data (G_OBJECT (widget), "loop");
101         *loop = 0;
102
103         return TRUE;
104 }
105
106 static void dialog_button_callback_settex (GtkWidget *widget, gpointer data)
107 {
108         TwinWidget* tw = (TwinWidget*)data;
109
110         GtkEntry* entry = GTK_ENTRY( tw->one );
111         GtkCombo* combo = GTK_COMBO( tw->two );
112
113         const gchar* tex = gtk_entry_get_text(GTK_ENTRY( combo->entry ));
114         gtk_entry_set_text( entry, tex);
115 }
116
117 /*--------------------------------
118         Data validation Routines
119 ---------------------------------*/
120
121 bool ValidateTextFloat(const char* pData, char* error_title, float* value)
122 {
123         if(pData)
124         {
125                 float testNum = (float)atof(pData);
126
127                 if((testNum == 0.0f) && strcmp(pData, "0"))
128                 {
129                         DoMessageBox("Please Enter A Floating Point Number", error_title, eMB_OK);
130                         return FALSE;
131                 }
132                 else
133                 {
134                         *value = testNum;
135                         return TRUE;
136                 }
137         }
138
139         DoMessageBox("Please Enter A Floating Point Number", error_title, eMB_OK);
140         return FALSE;
141 }
142
143 bool ValidateTextFloatRange(const char* pData, float min, float max, char* error_title, float* value)
144 {
145         char error_buffer[256];
146         sprintf(error_buffer, "Please Enter A Floating Point Number Between %.3f and %.3f", min, max);
147
148         if(pData)
149         {
150                 float testNum = (float)atof(pData);
151
152                 if((testNum < min) || (testNum > max))
153                 {
154                         DoMessageBox(error_buffer, error_title, eMB_OK);
155                         return FALSE;
156                 }
157                 else
158                 {
159                         *value = testNum;
160                         return TRUE;
161                 }
162         }
163
164         DoMessageBox(error_buffer, error_title, eMB_OK);
165         return FALSE;
166 }
167
168 bool ValidateTextIntRange(const char* pData, int min, int max, char* error_title, int* value)
169 {
170         char error_buffer[256];
171         sprintf(error_buffer, "Please Enter An Integer Between %i and %i", min, max);
172
173         if(pData)
174         {
175                 int testNum = atoi(pData);
176
177                 if((testNum < min) || (testNum > max))
178                 {
179                         DoMessageBox(error_buffer, error_title, eMB_OK);
180                         return FALSE;
181                 }
182                 else
183                 {
184                         *value = testNum;
185                         return TRUE;
186                 }
187         }
188
189         DoMessageBox(error_buffer, error_title, eMB_OK);
190         return FALSE;
191 }
192
193 bool ValidateTextInt(const char* pData, char* error_title, int* value)
194 {
195         if(pData)
196         {
197                 int testNum = atoi(pData);
198
199                 if((testNum == 0) && strcmp(pData, "0"))
200                 {
201                         DoMessageBox("Please Enter An Integer", error_title, eMB_OK);
202                         return FALSE;
203                 }
204                 else
205                 {
206                         *value = testNum;
207                         return TRUE;
208                 }
209         }
210
211         DoMessageBox("Please Enter An Integer", error_title, eMB_OK);
212         return FALSE;
213 }
214
215 /*--------------------------------
216                 Modal Dialog Boxes
217 ---------------------------------*/
218
219 /*
220
221   Major clean up of variable names etc required, excluding Mars's ones,
222   which are nicely done :)
223
224 */
225
226 EMessageBoxReturn DoMessageBox (const char* lpText, const char* lpCaption, EMessageBoxType type)
227 {
228         GtkWidget *window, *w, *vbox, *hbox;
229         EMessageBoxReturn ret;
230   int loop = 1;
231  
232         window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
233         gtk_signal_connect (GTK_OBJECT (window), "delete_event",
234                       GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
235         gtk_signal_connect (GTK_OBJECT (window), "destroy",
236                       GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
237         gtk_window_set_title (GTK_WINDOW (window), lpCaption);
238         gtk_container_border_width (GTK_CONTAINER (window), 10);
239         g_object_set_data (G_OBJECT (window), "loop", &loop);
240         g_object_set_data (G_OBJECT (window), "ret", &ret);
241         gtk_widget_realize (window);
242  
243         vbox = gtk_vbox_new (FALSE, 10);
244         gtk_container_add (GTK_CONTAINER (window), vbox);
245         gtk_widget_show (vbox);
246  
247         w = gtk_label_new (lpText);
248         gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 2);
249         gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_LEFT);
250         gtk_widget_show (w);
251  
252         w = gtk_hseparator_new ();
253         gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 2);
254         gtk_widget_show (w);
255  
256         hbox = gtk_hbox_new (FALSE, 10);
257         gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 2);
258         gtk_widget_show (hbox);
259  
260         if (type == eMB_OK)
261         {
262                 w = gtk_button_new_with_label ("Ok");
263                 gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
264                 gtk_signal_connect (GTK_OBJECT (w), "clicked",
265                         GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (eIDOK));
266                 GTK_WIDGET_SET_FLAGS (w, GTK_CAN_DEFAULT);
267                 gtk_widget_grab_default (w);
268                 gtk_widget_show (w);
269                 ret = eIDOK;
270         }
271         else if (type ==  eMB_OKCANCEL)
272         {
273                 w = gtk_button_new_with_label ("Ok");
274                 gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
275                 gtk_signal_connect (GTK_OBJECT (w), "clicked",
276                         GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (eIDOK));
277                 GTK_WIDGET_SET_FLAGS (w, GTK_CAN_DEFAULT);
278                 gtk_widget_grab_default (w);
279                 gtk_widget_show (w);
280  
281                 w = gtk_button_new_with_label ("Cancel");
282                 gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
283                 gtk_signal_connect (GTK_OBJECT (w), "clicked",
284                         GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (eIDCANCEL));
285                 gtk_widget_show (w);
286                 ret = eIDCANCEL;
287         }
288         else if (type == eMB_YESNOCANCEL)
289         {
290                 w = gtk_button_new_with_label ("Yes");
291                 gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
292                 gtk_signal_connect (GTK_OBJECT (w), "clicked",
293                         GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (eIDYES));
294                 GTK_WIDGET_SET_FLAGS (w, GTK_CAN_DEFAULT);
295                 gtk_widget_grab_default (w);
296                 gtk_widget_show (w);
297  
298                 w = gtk_button_new_with_label ("No");
299                 gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
300                 gtk_signal_connect (GTK_OBJECT (w), "clicked",
301                         GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (eIDNO));
302                 gtk_widget_show (w);
303  
304                 w = gtk_button_new_with_label ("Cancel");
305                 gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
306                 gtk_signal_connect (GTK_OBJECT (w), "clicked",
307                         GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (eIDCANCEL));
308                 gtk_widget_show (w);
309                 ret = eIDCANCEL;
310         }
311         else /* if (mode == MB_YESNO) */
312         {
313                 w = gtk_button_new_with_label ("Yes");
314                 gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
315                 gtk_signal_connect (GTK_OBJECT (w), "clicked",
316                         GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (eIDYES));
317                 GTK_WIDGET_SET_FLAGS (w, GTK_CAN_DEFAULT);
318                 gtk_widget_grab_default (w);
319                 gtk_widget_show (w);
320  
321                 w = gtk_button_new_with_label ("No");
322                 gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
323                 gtk_signal_connect (GTK_OBJECT (w), "clicked",
324                         GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (eIDNO));
325                 gtk_widget_show (w);
326                 ret = eIDNO;
327         }
328  
329         gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
330         gtk_widget_show (window);
331         gtk_grab_add (window);
332  
333         while (loop)
334                 gtk_main_iteration ();
335  
336         gtk_grab_remove (window);
337         gtk_widget_destroy (window);
338  
339         return ret;
340 }
341
342 EMessageBoxReturn DoIntersectBox (IntersectRS* rs)
343 {
344         GtkWidget *window, *w, *vbox, *hbox;
345         GtkWidget *radio1, *radio2;
346         GtkWidget *check1, *check2;
347         EMessageBoxReturn ret;
348   int loop = 1;
349  
350         window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
351         
352         gtk_signal_connect (GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
353         gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
354
355         gtk_window_set_title (GTK_WINDOW (window), "Intersect");
356         gtk_container_border_width (GTK_CONTAINER (window), 10);
357
358         g_object_set_data (G_OBJECT (window), "loop", &loop);
359         g_object_set_data (G_OBJECT (window), "ret", &ret);
360
361         gtk_widget_realize (window);
362  
363
364         
365         vbox = gtk_vbox_new (FALSE, 10);
366         gtk_container_add (GTK_CONTAINER (window), vbox);
367         gtk_widget_show (vbox);
368  
369         // ---- vbox ----
370
371                 radio1 = gtk_radio_button_new_with_label(NULL, "Use Whole Map");
372                 gtk_box_pack_start (GTK_BOX (vbox), radio1, FALSE, FALSE, 2);
373                 gtk_widget_show (radio1);
374
375                 radio2 = gtk_radio_button_new_with_label(((GtkRadioButton*)radio1)->group, "Use Selected Brushes");
376                 gtk_box_pack_start (GTK_BOX (vbox), radio2, FALSE, FALSE, 2);
377                 gtk_widget_show (radio2);
378
379                 w = gtk_hseparator_new ();
380                 gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 2);
381                 gtk_widget_show (w);
382
383                 check1 = gtk_check_button_new_with_label("Include Detail Brushes");
384                 gtk_box_pack_start (GTK_BOX (vbox), check1, FALSE, FALSE, 0);
385                 gtk_widget_show (check1);               
386
387                 check2 = gtk_check_button_new_with_label("Select Duplicate Brushes Only");
388                 gtk_box_pack_start (GTK_BOX (vbox), check2, FALSE, FALSE, 0);
389                 gtk_widget_show (check2);               
390
391                 hbox = gtk_hbox_new (FALSE, 10);
392                 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 2);
393                 gtk_widget_show (hbox);
394         
395                 // ---- hbox ---- ok/cancel buttons
396
397                 w = gtk_button_new_with_label ("Ok");
398                 gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
399                 gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (eIDOK));
400
401                 GTK_WIDGET_SET_FLAGS (w, GTK_CAN_DEFAULT);
402                 gtk_widget_grab_default (w);
403                 gtk_widget_show (w);
404  
405                 w = gtk_button_new_with_label ("Cancel");
406                 gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
407                 gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (eIDCANCEL));
408                 gtk_widget_show (w);
409                 ret = eIDCANCEL;
410
411                 // ---- /hbox ----
412  
413         // ---- /vbox ----
414
415         gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
416         gtk_widget_show (window);
417         gtk_grab_add (window);
418  
419         while (loop)
420                 gtk_main_iteration ();
421
422         if(gtk_toggle_button_get_active((GtkToggleButton*)radio1))
423                 rs->nBrushOptions = BRUSH_OPT_WHOLE_MAP;
424         else if(gtk_toggle_button_get_active((GtkToggleButton*)radio2))
425                 rs->nBrushOptions = BRUSH_OPT_SELECTED;
426
427   rs->bUseDetail = gtk_toggle_button_get_active((GtkToggleButton*)check1) ? true : false;
428         rs->bDuplicateOnly = gtk_toggle_button_get_active((GtkToggleButton*)check2) ? true : false;
429  
430         gtk_grab_remove (window);
431         gtk_widget_destroy (window);
432
433         return ret;
434 }
435
436 EMessageBoxReturn DoPolygonBox (PolygonRS* rs)
437 {
438         GtkWidget *window, *w, *vbox, *hbox, *vbox2, *hbox2;
439
440         GtkWidget *check1, *check2, *check3;
441         GtkWidget *text1, *text2;
442
443         EMessageBoxReturn ret;
444   int loop = 1;
445  
446         window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
447         
448         gtk_signal_connect (GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
449         gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
450
451         gtk_window_set_title (GTK_WINDOW (window), "Polygon Builder");
452         gtk_container_border_width (GTK_CONTAINER (window), 10);
453
454         g_object_set_data (G_OBJECT (window), "loop", &loop);
455         g_object_set_data (G_OBJECT (window), "ret", &ret);
456
457         gtk_widget_realize (window);
458  
459
460         
461         vbox = gtk_vbox_new (FALSE, 10);
462         gtk_container_add (GTK_CONTAINER (window), vbox);
463         gtk_widget_show (vbox);
464  
465         // ---- vbox ----
466
467                 hbox = gtk_hbox_new (FALSE, 10);
468                 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 2);
469                 gtk_widget_show (hbox);
470         
471                 // ---- hbox ----
472
473         
474                         vbox2 = gtk_vbox_new (FALSE, 10);
475                         gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 2);
476                         gtk_widget_show (vbox2);
477  
478                         // ---- vbox2 ----
479
480                                 hbox2 = gtk_hbox_new (FALSE, 10);
481                                 gtk_box_pack_start (GTK_BOX (vbox2), hbox2, FALSE, FALSE, 2);
482                                 gtk_widget_show (hbox2);
483
484                                 // ---- hbox2 ----
485
486                                         text1 = gtk_entry_new_with_max_length(256);
487                                         gtk_entry_set_text((GtkEntry*)text1, "3");
488                                         gtk_box_pack_start (GTK_BOX (hbox2), text1, FALSE, FALSE, 2);
489                                         gtk_widget_show (text1);
490
491                                         w = gtk_label_new ("Number Of Sides");
492                                         gtk_box_pack_start (GTK_BOX (hbox2), w, FALSE, FALSE, 2);
493                                         gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_LEFT);
494                                         gtk_widget_show (w);
495
496                                 // ---- /hbox2 ----
497
498                                 hbox2 = gtk_hbox_new (FALSE, 10);
499                                 gtk_box_pack_start (GTK_BOX (vbox2), hbox2, FALSE, FALSE, 2);
500                                 gtk_widget_show (hbox2);
501
502                                 // ---- hbox2 ----
503
504                                         text2 = gtk_entry_new_with_max_length(256);
505                                         gtk_entry_set_text((GtkEntry*)text2, "8");
506                                         gtk_box_pack_start (GTK_BOX (hbox2), text2, FALSE, FALSE, 2);
507                                         gtk_widget_show (text2);
508
509                                         w = gtk_label_new ("Border Width");
510                                         gtk_box_pack_start (GTK_BOX (hbox2), w, FALSE, FALSE, 2);
511                                         gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_LEFT);
512                                         gtk_widget_show (w);
513                                 
514                                 // ---- /hbox2 ----
515
516                         // ---- /vbox2 ----
517
518
519                         
520                         vbox2 = gtk_vbox_new (FALSE, 10);
521                         gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 2);
522                         gtk_widget_show (vbox2);
523  
524                         // ---- vbox2 ----
525
526                                 check1 = gtk_check_button_new_with_label("Use Border");
527                                 gtk_box_pack_start (GTK_BOX (vbox2), check1, FALSE, FALSE, 0);
528                                 gtk_widget_show (check1);
529  
530
531                                 check2 = gtk_check_button_new_with_label("Inverse Polygon");
532                                 gtk_box_pack_start (GTK_BOX (vbox2), check2, FALSE, FALSE, 0);
533                                 gtk_widget_show (check2);
534  
535
536                                 check3 = gtk_check_button_new_with_label("Align Top Edge");
537                                 gtk_box_pack_start (GTK_BOX (vbox2), check3, FALSE, FALSE, 0);
538                                 gtk_widget_show (check3);
539  
540                         // ---- /vbox2 ----
541
542                 // ---- /hbox ----
543  
544                 hbox = gtk_hbox_new (FALSE, 10);
545                 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 2);
546                 gtk_widget_show (hbox);
547         
548                 // ---- hbox ----
549
550                         w = gtk_button_new_with_label ("Ok");
551                         gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
552                         gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (eIDOK));
553
554                         GTK_WIDGET_SET_FLAGS (w, GTK_CAN_DEFAULT);
555                         gtk_widget_grab_default (w);
556                         gtk_widget_show (w);
557  
558                         w = gtk_button_new_with_label ("Cancel");
559                         gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
560                         gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (eIDCANCEL));
561                         gtk_widget_show (w);
562                         ret = eIDCANCEL;
563
564                 // ---- /hbox ----
565         
566         // ---- /vbox ----
567
568         gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
569         gtk_widget_show (window);
570         gtk_grab_add (window);
571  
572         bool dialogError = TRUE;
573         while (dialogError)
574         {
575                 loop = 1;
576                 while (loop)
577                         gtk_main_iteration ();
578  
579                 dialogError = FALSE;
580
581                 if(ret == eIDOK)
582                 {
583                         rs->bUseBorder = gtk_toggle_button_get_active((GtkToggleButton*)check1) ? true : false;
584                         rs->bInverse = gtk_toggle_button_get_active((GtkToggleButton*)check2) ? true : false;
585                         rs->bAlignTop = gtk_toggle_button_get_active((GtkToggleButton*)check3) ? true : false;
586
587                         if(!ValidateTextIntRange(gtk_entry_get_text((GtkEntry*)text1), 3, 32, "Number Of Sides", &rs->nSides))
588                                 dialogError = TRUE;
589
590                         if(rs->bUseBorder)
591                         {
592                                 if(!ValidateTextIntRange(gtk_entry_get_text((GtkEntry*)text2), 8, 256, "Border Width", &rs->nBorderWidth))
593                                         dialogError = TRUE;
594                         }
595                 }
596         }
597
598         gtk_grab_remove (window);
599         gtk_widget_destroy (window);
600
601         return ret;
602 }
603
604 // mars
605 // for stair builder stuck as close as i could to the MFC version
606 // obviously feel free to change it at will :)
607 EMessageBoxReturn DoBuildStairsBox(BuildStairsRS* rs)
608 {
609         // i made widgets for just about everything ... i think that's what i need to do  dunno tho 
610         GtkWidget       *window, *w, *vbox, *hbox;
611         GtkWidget       *textStairHeight, *textRiserTex, *textMainTex;
612         GtkWidget       *radioNorth, *radioSouth, *radioEast, *radioWest;       // i'm guessing we can't just abuse 'w' for these if we're getting a value
613         GtkWidget       *radioOldStyle, *radioBobStyle, *radioCornerStyle;
614         GtkWidget       *checkUseDetail;
615         GSList          *radioDirection, *radioStyle;
616         EMessageBoxReturn ret;
617   int loop = 1;
618
619         char    *text = "Please set a value in the boxes below and press 'OK' to build the stairs";
620
621         window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
622         
623         gtk_signal_connect (GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
624         gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
625
626         gtk_window_set_title( GTK_WINDOW( window ), "Stair Builder" );
627         
628         gtk_container_border_width( GTK_CONTAINER( window ), 10 );
629
630         g_object_set_data (G_OBJECT (window), "loop", &loop);
631         g_object_set_data (G_OBJECT (window), "ret", &ret);
632
633         gtk_widget_realize (window);
634
635         // new vbox 
636         vbox = gtk_vbox_new( FALSE, 10 );
637         gtk_container_add( GTK_CONTAINER( window ), vbox );
638         gtk_widget_show( vbox );
639
640         hbox = gtk_hbox_new( FALSE, 10 );
641         gtk_container_add( GTK_CONTAINER( vbox ), hbox );
642         gtk_widget_show( hbox );
643         
644         // dunno if you want this text or not ...
645         w = gtk_label_new( text );
646         gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 ); // not entirely sure on all the parameters / what they do ...
647         gtk_widget_show( w );
648
649         w = gtk_hseparator_new();
650         gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 0 );
651         gtk_widget_show( w );
652         
653         // ------------------------- // indenting == good way of keeping track of lines :)
654
655                 // new hbox
656                 hbox = gtk_hbox_new( FALSE, 10 );
657                 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
658                 gtk_widget_show( hbox );
659         
660                 textStairHeight = gtk_entry_new_with_max_length( 256 ); 
661                 gtk_box_pack_start( GTK_BOX( hbox ), textStairHeight, FALSE, FALSE, 1 );
662                 gtk_widget_show( textStairHeight );
663
664                 w = gtk_label_new( "Stair Height" );
665                 gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 1 );
666                 gtk_widget_show( w );
667
668         // ------------------------- //
669
670         hbox = gtk_hbox_new( FALSE, 10 );
671         gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
672         gtk_widget_show( hbox );
673
674         w = gtk_label_new( "Direction:" );
675         gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 5 );
676         gtk_widget_show( w );
677
678         // -------------------------- //
679
680                 hbox = gtk_hbox_new( FALSE, 10 );
681                 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
682                 gtk_widget_show( hbox );
683                 
684                 // radio buttons confuse me ...
685                 // but this _looks_ right
686
687                 // djbob: actually it looks very nice :), slightly better than the way i did it
688                 // edit: actually it doesn't work :P, you must pass the last radio item each time, ugh
689
690                 radioNorth = gtk_radio_button_new_with_label( NULL, "North" );
691                 gtk_box_pack_start( GTK_BOX( hbox ), radioNorth, FALSE, FALSE, 3 );
692                 gtk_widget_show( radioNorth );
693
694                 radioDirection = gtk_radio_button_group( GTK_RADIO_BUTTON( radioNorth ) );
695                 
696                 radioSouth = gtk_radio_button_new_with_label( radioDirection, "South" );
697                 gtk_box_pack_start( GTK_BOX( hbox ), radioSouth, FALSE, FALSE, 2 );
698                 gtk_widget_show( radioSouth );
699
700                 radioDirection = gtk_radio_button_group( GTK_RADIO_BUTTON( radioSouth ) );
701
702                 radioEast = gtk_radio_button_new_with_label( radioDirection, "East" );
703                 gtk_box_pack_start( GTK_BOX( hbox ), radioEast, FALSE, FALSE, 1 );
704                 gtk_widget_show( radioEast );
705
706                 radioDirection = gtk_radio_button_group( GTK_RADIO_BUTTON( radioEast ) );
707
708                 radioWest = gtk_radio_button_new_with_label( radioDirection, "West" );
709                 gtk_box_pack_start( GTK_BOX( hbox ), radioWest, FALSE, FALSE, 0 );
710                 gtk_widget_show( radioWest );
711
712         // --------------------------- //
713
714         hbox = gtk_hbox_new( FALSE, 10 );
715         gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
716         gtk_widget_show( hbox );
717
718         w = gtk_label_new( "Style:" );
719         gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 5 );
720         gtk_widget_show( w );
721
722         // --------------------------- //
723
724                 hbox = gtk_hbox_new( FALSE, 10 );
725                 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
726                 gtk_widget_show( hbox );
727         
728                 radioOldStyle = gtk_radio_button_new_with_label( NULL, "Original" );
729                 gtk_box_pack_start( GTK_BOX( hbox ), radioOldStyle, FALSE, FALSE, 0 );
730                 gtk_widget_show( radioOldStyle );
731
732                 radioStyle = gtk_radio_button_group( GTK_RADIO_BUTTON( radioOldStyle ) );
733
734                 radioBobStyle = gtk_radio_button_new_with_label( radioStyle, "Bob's Style" );
735                 gtk_box_pack_start( GTK_BOX( hbox ), radioBobStyle, FALSE, FALSE, 0 );
736                 gtk_widget_show( radioBobStyle );
737         
738                 radioStyle = gtk_radio_button_group( GTK_RADIO_BUTTON( radioBobStyle ) );
739
740                 radioCornerStyle = gtk_radio_button_new_with_label( radioStyle, "Corner Style" );
741                 gtk_box_pack_start( GTK_BOX( hbox ), radioCornerStyle, FALSE, FALSE, 0 );
742                 gtk_widget_show( radioCornerStyle );
743         
744                 // err, the q3r has an if or something so you need bob style checked before this 
745                 // is "ungreyed out" but you'll need to do that, as i suck :)
746
747                 // djbob: er.... yeah um, im not at all sure how i'm gonna sort this
748                 // djbob: think we need some button callback functions or smuffin
749                 // FIXME: actually get around to doing what i suggested!!!!
750
751                 checkUseDetail = gtk_check_button_new_with_label( "Use Detail Brushes" );
752                 gtk_box_pack_start( GTK_BOX( hbox ), checkUseDetail, FALSE, FALSE, 0 );
753                 gtk_widget_show( checkUseDetail );
754
755         // --------------------------- // 
756
757         hbox = gtk_hbox_new( FALSE, 10 );
758         gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
759         gtk_widget_show( hbox );
760
761         textMainTex = gtk_entry_new_with_max_length( 512 );
762         gtk_entry_set_text(GTK_ENTRY(textMainTex), rs->mainTexture);
763         gtk_box_pack_start( GTK_BOX( hbox ), textMainTex, FALSE, FALSE, 0 );
764         gtk_widget_show( textMainTex );
765
766         w = gtk_label_new( "Main Texture" );
767         gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 1 );
768         gtk_widget_show( w );
769
770         // -------------------------- //
771
772         hbox = gtk_hbox_new( FALSE, 10 );
773         gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
774         gtk_widget_show( hbox );
775
776         textRiserTex = gtk_entry_new_with_max_length( 512 );
777         gtk_box_pack_start( GTK_BOX( hbox ), textRiserTex, FALSE, FALSE, 0 );
778         gtk_widget_show( textRiserTex );
779
780         w = gtk_label_new( "Riser Texture" );
781         gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 1 );
782         gtk_widget_show( w );
783
784         // -------------------------- //
785         w = gtk_hseparator_new();
786         gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 0 );
787         gtk_widget_show( w );
788
789         hbox = gtk_hbox_new( FALSE, 10 );
790         gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
791         gtk_widget_show( hbox );
792
793         w = gtk_button_new_with_label( "OK" );
794         gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0);
795         gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( dialog_button_callback ), GINT_TO_POINTER( eIDOK ) );
796         GTK_WIDGET_SET_FLAGS( w, GTK_CAN_DEFAULT );
797         gtk_widget_grab_default( w );
798         gtk_widget_show( w );
799                 
800         w = gtk_button_new_with_label( "Cancel" );
801         gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
802         gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( dialog_button_callback ), GINT_TO_POINTER( eIDCANCEL ) );
803         gtk_widget_show( w );
804                 
805         ret = eIDCANCEL;
806
807 // +djbob: need our "little" modal loop mars :P
808         gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
809         gtk_widget_show (window);
810         gtk_grab_add (window);
811  
812         bool dialogError = TRUE;
813         while (dialogError)
814         {
815                 loop = 1;
816                 while (loop)
817                         gtk_main_iteration ();
818  
819                 dialogError = FALSE;
820
821                 if(ret == eIDOK)
822                 {
823                         rs->bUseDetail = gtk_toggle_button_get_active((GtkToggleButton*)checkUseDetail) ? true : false;
824
825                         strcpy(rs->riserTexture, gtk_entry_get_text((GtkEntry*)textRiserTex));
826                         strcpy(rs->mainTexture, gtk_entry_get_text((GtkEntry*)textMainTex));
827
828                         if(gtk_toggle_button_get_active((GtkToggleButton*)radioNorth))
829                                 rs->direction = MOVE_NORTH;
830                         else if(gtk_toggle_button_get_active((GtkToggleButton*)radioSouth))
831                                 rs->direction = MOVE_SOUTH;
832                         else if(gtk_toggle_button_get_active((GtkToggleButton*)radioEast))
833                                 rs->direction = MOVE_EAST;
834                         else if(gtk_toggle_button_get_active((GtkToggleButton*)radioWest))
835                                 rs->direction = MOVE_WEST;
836
837                         if(!ValidateTextInt(gtk_entry_get_text((GtkEntry*)textStairHeight), "Stair Height", &rs->stairHeight))
838                                 dialogError = TRUE;
839
840                         if(gtk_toggle_button_get_active((GtkToggleButton*)radioOldStyle))
841                                 rs->style = STYLE_ORIGINAL;
842                         else if(gtk_toggle_button_get_active((GtkToggleButton*)radioBobStyle))
843                                 rs->style = STYLE_BOB;
844                         else if(gtk_toggle_button_get_active((GtkToggleButton*)radioCornerStyle))
845                                 rs->style = STYLE_CORNER;
846                 }
847         }
848
849         gtk_grab_remove (window);
850         gtk_widget_destroy (window);
851
852         return ret;
853 // -djbob
854         
855         // there we go, all done ... on my end at least, not bad for a night's work
856 }
857
858 EMessageBoxReturn DoDoorsBox(DoorRS* rs)
859 {
860         GtkWidget       *window, *hbox, *vbox, *w;
861         GtkWidget       *textFrontBackTex, *textTrimTex;
862         GtkWidget       *checkScaleMainH, *checkScaleMainV, *checkScaleTrimH, *checkScaleTrimV;
863         GtkWidget       *comboMain, *comboTrim;
864         GtkWidget       *buttonSetMain, *buttonSetTrim;
865         GtkWidget       *radioNS, *radioEW; 
866         GSList          *radioOrientation;
867         TwinWidget      tw1, tw2;
868         EMessageBoxReturn ret;
869   int loop = 1;
870         
871         window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
872         
873         gtk_signal_connect (GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
874         gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
875
876         gtk_window_set_title( GTK_WINDOW( window ), "Door Builder" );
877         
878         gtk_container_border_width( GTK_CONTAINER( window ), 10 );
879
880         g_object_set_data( G_OBJECT( window ), "loop", &loop );
881         g_object_set_data( G_OBJECT( window ), "ret", &ret );
882
883         gtk_widget_realize (window);
884         
885         char buffer[256];
886         GList           *listMainTextures = NULL;
887         GList           *listTrimTextures = NULL;
888         LoadGList(GetFilename(buffer, "plugins/bt/door-tex.txt"), &listMainTextures);
889         LoadGList(GetFilename(buffer, "plugins/bt/door-tex-trim.txt"), &listTrimTextures);
890         
891         vbox = gtk_vbox_new( FALSE, 10 );
892         gtk_container_add( GTK_CONTAINER( window ), vbox );
893         gtk_widget_show( vbox );
894
895         // -------------------------- //
896
897                 hbox = gtk_hbox_new( FALSE, 10 );
898                 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
899                 gtk_widget_show( hbox );
900
901                 textFrontBackTex = gtk_entry_new_with_max_length( 512 );
902                 gtk_entry_set_text( GTK_ENTRY( textFrontBackTex ), rs->mainTexture);
903                 gtk_box_pack_start( GTK_BOX( hbox ), textFrontBackTex, FALSE, FALSE, 0 );
904                 gtk_widget_show( textFrontBackTex );
905
906                 w = gtk_label_new( "Door Front/Back Texture" );
907                 gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
908                 gtk_widget_show( w );
909
910         // ------------------------ //
911
912                 hbox = gtk_hbox_new( FALSE, 10 );
913                 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
914                 gtk_widget_show( hbox );
915
916                 textTrimTex = gtk_entry_new_with_max_length( 512 );
917                 gtk_box_pack_start( GTK_BOX( hbox ), textTrimTex, FALSE, FALSE, 0 );
918                 gtk_widget_show( textTrimTex );
919
920                 w = gtk_label_new( "Door Trim Texture" );
921                 gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
922                 gtk_widget_show( w );
923
924         // ----------------------- //
925
926                 hbox = gtk_hbox_new( FALSE, 10 );
927                 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
928                 gtk_widget_show( hbox );
929
930                 // sp: horizontally ????
931                 // djbob: yes mars, u can spell :]
932                 checkScaleMainH = gtk_check_button_new_with_label( "Scale Main Texture Horizontally" );
933                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON( checkScaleMainH ), TRUE);
934                 gtk_box_pack_start( GTK_BOX( hbox ), checkScaleMainH, FALSE, FALSE, 0 );
935                 gtk_widget_show( checkScaleMainH );
936
937                 checkScaleTrimH = gtk_check_button_new_with_label( "Scale Trim Texture Horizontally" );
938                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON( checkScaleTrimH ), TRUE);
939                 gtk_box_pack_start( GTK_BOX( hbox ), checkScaleTrimH, FALSE, FALSE, 0 );
940                 gtk_widget_show( checkScaleTrimH );
941
942         // ---------------------- //
943
944                 hbox = gtk_hbox_new( FALSE, 10 );
945                 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
946                 gtk_widget_show( hbox );
947
948                 checkScaleMainV = gtk_check_button_new_with_label( "Scale Main Texture Vertically" );
949                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON( checkScaleMainV ), TRUE);
950                 gtk_box_pack_start( GTK_BOX( hbox ), checkScaleMainV, FALSE, FALSE, 0 );
951                 gtk_widget_show( checkScaleMainV );
952
953                 checkScaleTrimV = gtk_check_button_new_with_label( "Scale Trim Texture Vertically" );
954                 gtk_box_pack_start( GTK_BOX( hbox ), checkScaleTrimV, FALSE, FALSE, 0 );
955                 gtk_widget_show( checkScaleTrimV );
956                         
957         // --------------------- // 
958
959                 hbox = gtk_hbox_new( FALSE, 10 );
960                 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
961                 gtk_widget_show( hbox );
962
963                 // djbob: lists added
964
965                 comboMain = gtk_combo_new();
966                 gtk_box_pack_start( GTK_BOX( hbox ), comboMain, FALSE, FALSE, 0 );
967                 gtk_combo_set_popdown_strings( GTK_COMBO( comboMain ), listMainTextures );
968                 gtk_combo_set_use_arrows( GTK_COMBO( comboMain ), 1 );
969                 gtk_widget_show( comboMain );
970
971                 tw1.one = textFrontBackTex;
972                 tw1.two = comboMain;
973
974                 buttonSetMain = gtk_button_new_with_label( "Set As Main Texture" );
975                 gtk_signal_connect( GTK_OBJECT( buttonSetMain ), "clicked", GTK_SIGNAL_FUNC( dialog_button_callback_settex ), &tw1 );
976                 gtk_box_pack_start( GTK_BOX( hbox ), buttonSetMain, FALSE, FALSE, 0 );
977                 gtk_widget_show( buttonSetMain );
978
979         // ------------------- //
980                 
981                 hbox = gtk_hbox_new( FALSE, 10 );
982                 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
983                 gtk_widget_show( hbox );
984
985                 comboTrim = gtk_combo_new();
986                 gtk_box_pack_start( GTK_BOX( hbox ), comboTrim, FALSE, FALSE, 0 );
987                 gtk_combo_set_popdown_strings( GTK_COMBO( comboTrim ), listTrimTextures );
988                 gtk_combo_set_use_arrows( GTK_COMBO( comboMain ), 1 );
989                 gtk_widget_show( comboTrim );
990
991                 tw2.one = textTrimTex;
992                 tw2.two = comboTrim;
993
994                 buttonSetTrim = gtk_button_new_with_label( "Set As Trim Texture" );
995                 gtk_signal_connect( GTK_OBJECT( buttonSetTrim ), "clicked", GTK_SIGNAL_FUNC( dialog_button_callback_settex ), &tw2 );
996                 gtk_box_pack_start( GTK_BOX( hbox ), buttonSetTrim, FALSE, FALSE, 0 );
997                 gtk_widget_show( buttonSetTrim );
998
999         // ------------------ //
1000
1001                 hbox = gtk_hbox_new( FALSE, 10 );
1002                 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
1003                 gtk_widget_show( hbox );
1004
1005                 w = gtk_label_new( "Orientation" );
1006                 gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
1007                 gtk_widget_show( w );
1008
1009                 // argh more radio buttons! 
1010                 radioNS = gtk_radio_button_new_with_label( NULL, "North - South" );
1011                 gtk_box_pack_start( GTK_BOX( hbox ), radioNS, FALSE, FALSE, 0 );
1012                 gtk_widget_show( radioNS );
1013
1014                 radioOrientation = gtk_radio_button_group( GTK_RADIO_BUTTON( radioNS ) );
1015
1016                 radioEW = gtk_radio_button_new_with_label( radioOrientation, "East - West" );
1017                 gtk_box_pack_start( GTK_BOX( hbox ), radioEW, FALSE, FALSE, 0 );
1018                 gtk_widget_show( radioEW );
1019
1020         // ----------------- //
1021
1022                 w = gtk_hseparator_new();
1023                 gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 0 );
1024                 gtk_widget_show( w );
1025
1026         // ----------------- //
1027
1028                 hbox = gtk_hbox_new( FALSE, 10 );
1029                 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
1030                 gtk_widget_show( hbox );
1031
1032                 w = gtk_button_new_with_label( "OK" );
1033                 gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0);
1034                 gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( dialog_button_callback ), GINT_TO_POINTER( eIDOK ) );
1035                 GTK_WIDGET_SET_FLAGS( w, GTK_CAN_DEFAULT );
1036                 gtk_widget_grab_default( w );
1037                 gtk_widget_show( w );
1038                 
1039                 w = gtk_button_new_with_label( "Cancel" );
1040                 gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
1041                 gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( dialog_button_callback ), GINT_TO_POINTER( eIDCANCEL ) );
1042                 gtk_widget_show( w );
1043                 ret = eIDCANCEL;
1044
1045         // ----------------- //
1046
1047 //+djbob
1048         gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
1049         gtk_widget_show (window);
1050         gtk_grab_add (window);
1051  
1052         while (loop)
1053                 gtk_main_iteration ();
1054
1055         strcpy(rs->mainTexture, gtk_entry_get_text( GTK_ENTRY( textFrontBackTex ) ));
1056         strcpy(rs->trimTexture, gtk_entry_get_text( GTK_ENTRY( textTrimTex ) ));
1057
1058         rs->bScaleMainH = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkScaleMainH)) ? true : false;
1059         rs->bScaleMainV = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkScaleMainV)) ? true : false;
1060         rs->bScaleTrimH = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkScaleTrimH)) ? true : false;
1061         rs->bScaleTrimV = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkScaleTrimV)) ? true : false;
1062
1063         if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radioNS)))
1064                 rs->nOrientation = DIRECTION_NS;
1065         else if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radioEW)))
1066                 rs->nOrientation = DIRECTION_EW;
1067  
1068         gtk_grab_remove (window);
1069         gtk_widget_destroy (window);
1070
1071         return ret;
1072 //-djbob
1073 }
1074
1075 EMessageBoxReturn DoPathPlotterBox(PathPlotterRS* rs)
1076 {
1077         GtkWidget *window, *w, *vbox, *hbox;
1078
1079         GtkWidget *text1, *text2, *text3;
1080         GtkWidget *check1, *check2;
1081
1082         EMessageBoxReturn ret;
1083   int loop = 1;
1084  
1085         window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1086         
1087         gtk_signal_connect (GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
1088         gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
1089
1090         gtk_window_set_title (GTK_WINDOW (window), "Texture Reset");
1091         gtk_container_border_width (GTK_CONTAINER (window), 10);
1092
1093         g_object_set_data (G_OBJECT (window), "loop", &loop);
1094         g_object_set_data (G_OBJECT (window), "ret", &ret);
1095
1096         gtk_widget_realize (window);
1097  
1098
1099         
1100         vbox = gtk_vbox_new (FALSE, 10);
1101         gtk_container_add (GTK_CONTAINER (window), vbox);
1102         gtk_widget_show (vbox);
1103  
1104         // ---- vbox ----
1105
1106                 hbox = gtk_hbox_new (FALSE, 10);
1107                 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 2);
1108                 gtk_widget_show (hbox);
1109         
1110                 // ---- hbox ----
1111
1112                         text1 = gtk_entry_new_with_max_length(256);
1113                         gtk_entry_set_text((GtkEntry*)text1, "25");
1114                         gtk_box_pack_start (GTK_BOX (hbox), text1, FALSE, FALSE, 2);
1115                         gtk_widget_show (text1);
1116
1117                         w = gtk_label_new ("Number Of Points");
1118                         gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 2);
1119                         gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_LEFT);
1120                         gtk_widget_show (w);
1121
1122                 // ---- /hbox ----
1123
1124                 hbox = gtk_hbox_new (FALSE, 10);
1125                 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 2);
1126                 gtk_widget_show (hbox);
1127         
1128                 // ---- hbox ----
1129
1130                         text2 = gtk_entry_new_with_max_length(256);
1131                         gtk_entry_set_text((GtkEntry*)text2, "3");
1132                         gtk_box_pack_start (GTK_BOX (hbox), text2, FALSE, FALSE, 2);
1133                         gtk_widget_show (text2);
1134
1135                         w = gtk_label_new ("Multipler");
1136                         gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 2);
1137                         gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_LEFT);
1138                         gtk_widget_show (w);
1139
1140                 // ---- /hbox ----
1141
1142                 w = gtk_label_new ("Path Distance = dist(start -> apex) * multiplier");
1143                 gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 0);
1144                 gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_LEFT);
1145                 gtk_widget_show (w);
1146
1147                 hbox = gtk_hbox_new (FALSE, 10);
1148                 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 2);
1149                 gtk_widget_show (hbox);
1150         
1151                 // ---- hbox ----
1152
1153                         text3 = gtk_entry_new_with_max_length(256);
1154                         gtk_entry_set_text((GtkEntry*)text3, "-800");
1155                         gtk_box_pack_start (GTK_BOX (hbox), text3, FALSE, FALSE, 2);
1156                         gtk_widget_show (text3);
1157
1158                         w = gtk_label_new ("Gravity");
1159                         gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 2);
1160                         gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_LEFT);
1161                         gtk_widget_show (w);
1162
1163                 // ---- /hbox ----
1164         
1165                 w = gtk_hseparator_new();
1166                 gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 0 );
1167                 gtk_widget_show( w );
1168
1169                 check1 = gtk_check_button_new_with_label( "No Dynamic Update" );
1170                 gtk_box_pack_start( GTK_BOX( vbox ), check1, FALSE, FALSE, 0 );
1171                 gtk_widget_show( check1 );
1172
1173                 check2 = gtk_check_button_new_with_label( "Show Bounding Lines" );
1174                 gtk_box_pack_start( GTK_BOX( vbox ), check2, FALSE, FALSE, 0 );
1175                 gtk_widget_show( check2 );
1176
1177         // ---- /vbox ----
1178
1179
1180         // ----------------- //
1181
1182                 w = gtk_hseparator_new();
1183                 gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 0 );
1184                 gtk_widget_show( w );
1185
1186         // ----------------- //
1187
1188                 hbox = gtk_hbox_new( FALSE, 10 );
1189                 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
1190                 gtk_widget_show( hbox );
1191
1192                 w = gtk_button_new_with_label( "Enable" );
1193                 gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0);
1194                 gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( dialog_button_callback ), GINT_TO_POINTER( eIDYES ) );
1195                 gtk_widget_show( w );
1196                 
1197                 GTK_WIDGET_SET_FLAGS( w, GTK_CAN_DEFAULT );
1198                 gtk_widget_grab_default( w );
1199
1200                 w = gtk_button_new_with_label( "Disable" );
1201                 gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0);
1202                 gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( dialog_button_callback ), GINT_TO_POINTER( eIDNO ) );
1203                 gtk_widget_show( w );
1204                 
1205                 w = gtk_button_new_with_label( "Cancel" );
1206                 gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
1207                 gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( dialog_button_callback ), GINT_TO_POINTER( eIDCANCEL ) );
1208                 gtk_widget_show( w );
1209                 
1210                 ret = eIDCANCEL;
1211
1212         // ----------------- //
1213
1214         gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
1215         gtk_widget_show (window);
1216         gtk_grab_add (window);
1217  
1218         bool dialogError = TRUE;
1219         while (dialogError)
1220         {
1221                 loop = 1;
1222                 while (loop)
1223                         gtk_main_iteration ();
1224  
1225                 dialogError = FALSE;
1226
1227                 if(ret == eIDYES)
1228                 {
1229                         if(!ValidateTextIntRange(gtk_entry_get_text(GTK_ENTRY(text1)), 1, 200, "Number Of Points", &rs->nPoints))
1230                                 dialogError = TRUE;
1231
1232                         if(!ValidateTextFloatRange(gtk_entry_get_text(GTK_ENTRY(text2)), 1.0f, 10.0f, "Multiplier", &rs->fMultiplier))
1233                                 dialogError = TRUE;
1234
1235                         if(!ValidateTextFloatRange(gtk_entry_get_text(GTK_ENTRY(text3)), -10000.0f, -1.0f, "Gravity", &rs->fGravity))
1236                                 dialogError = TRUE;
1237
1238                         rs->bNoUpdate = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check1)) ? true : false;
1239                         rs->bShowExtra = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check2)) ? true : false;
1240                 }
1241         }
1242
1243         gtk_grab_remove (window);
1244         gtk_widget_destroy (window);
1245
1246         return ret;
1247 }
1248
1249 EMessageBoxReturn DoCTFColourChangeBox ()
1250 {
1251         GtkWidget *window, *w, *vbox, *hbox;
1252         EMessageBoxReturn ret;
1253   int loop = 1;
1254  
1255         window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1256         
1257         gtk_signal_connect (GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
1258         gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
1259
1260         gtk_window_set_title (GTK_WINDOW (window), "CTF Colour Changer");
1261         gtk_container_border_width (GTK_CONTAINER (window), 10);
1262
1263         g_object_set_data (G_OBJECT (window), "loop", &loop);
1264         g_object_set_data (G_OBJECT (window), "ret", &ret);
1265
1266         gtk_widget_realize (window);
1267  
1268
1269         
1270         vbox = gtk_vbox_new (FALSE, 10);
1271         gtk_container_add (GTK_CONTAINER (window), vbox);
1272         gtk_widget_show (vbox);
1273  
1274         // ---- vbox ----
1275
1276                 hbox = gtk_hbox_new( FALSE, 10 );
1277                 gtk_box_pack_start( GTK_BOX( vbox ), hbox, TRUE, TRUE, 0 );
1278                 gtk_widget_show( hbox );
1279
1280                 // ---- hbox ---- ok/cancel buttons
1281
1282                 w = gtk_button_new_with_label ("Red->Blue");
1283                 gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
1284                 gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (eIDOK));
1285
1286                 GTK_WIDGET_SET_FLAGS (w, GTK_CAN_DEFAULT);
1287                 gtk_widget_grab_default (w);
1288                 gtk_widget_show (w);
1289  
1290                 w = gtk_button_new_with_label ("Blue->Red");
1291                 gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
1292                 gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (eIDYES));
1293                 gtk_widget_show (w);
1294
1295                 w = gtk_button_new_with_label ("Cancel");
1296                 gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
1297                 gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (eIDCANCEL));
1298                 gtk_widget_show (w);
1299                 ret = eIDCANCEL;
1300
1301                 // ---- /hbox ----
1302  
1303         // ---- /vbox ----
1304
1305         gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
1306         gtk_widget_show (window);
1307         gtk_grab_add (window);
1308  
1309         while (loop)
1310                 gtk_main_iteration ();
1311
1312         gtk_grab_remove (window);
1313         gtk_widget_destroy (window);
1314
1315         return ret;
1316 }
1317
1318 EMessageBoxReturn DoResetTextureBox (ResetTextureRS* rs)
1319 {
1320         Str texSelected;
1321
1322         GtkWidget *window, *w, *vbox, *hbox, *frame, *table;
1323
1324         EMessageBoxReturn ret;
1325   int loop = 1;
1326
1327         window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1328         
1329         gtk_signal_connect (GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
1330         gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
1331
1332         gtk_window_set_title (GTK_WINDOW (window), "Texture Reset");
1333         gtk_container_border_width (GTK_CONTAINER (window), 10);
1334
1335         g_object_set_data (G_OBJECT (window), "loop", &loop);
1336         g_object_set_data (G_OBJECT (window), "ret", &ret);
1337
1338         gtk_widget_realize (window);
1339         
1340         vbox = gtk_vbox_new (FALSE, 10);
1341         gtk_container_add (GTK_CONTAINER (window), vbox);
1342         gtk_widget_show (vbox);
1343  
1344         // ---- vbox ----
1345
1346         hbox = gtk_hbox_new (FALSE, 10);
1347         gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 2);
1348         gtk_widget_show (hbox);
1349         
1350         // ---- hbox ----
1351
1352         texSelected = "Currently Selected Face:   ";
1353 #if 0
1354         if(g_SelectedFaceTable.m_pfnGetSelectedFaceCount() == 1) {
1355                 texSelected += GetCurrentTexture();
1356         }
1357 #endif
1358
1359         w = gtk_label_new (texSelected);
1360         gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 2);
1361         gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_LEFT);
1362         gtk_widget_show (w);
1363
1364         // ---- /hbox ----
1365
1366         frame = gtk_frame_new ("Reset Texture Names");
1367     gtk_widget_show (frame);
1368     gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
1369
1370     table = gtk_table_new (2, 3, TRUE);
1371     gtk_widget_show (table);
1372     gtk_container_add (GTK_CONTAINER (frame), table);
1373     gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1374     gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1375     gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1376
1377         // ---- frame ----
1378
1379         dlgTexReset.cbTexChange = gtk_check_button_new_with_label("Enabled");
1380         gtk_signal_connect (GTK_OBJECT (dlgTexReset.cbTexChange), "toggled", GTK_SIGNAL_FUNC (dialog_button_callback_texreset_update), NULL);
1381         gtk_widget_show (dlgTexReset.cbTexChange);
1382         gtk_table_attach (GTK_TABLE (table), dlgTexReset.cbTexChange, 0, 1, 0, 1,
1383                         (GtkAttachOptions) (GTK_FILL),
1384                         (GtkAttachOptions) (0), 0, 0);
1385
1386         w = gtk_label_new ("Old Name: ");
1387         gtk_table_attach (GTK_TABLE (table), w, 1, 2, 0, 1,
1388                                 (GtkAttachOptions) (GTK_FILL),
1389                         (GtkAttachOptions) (0), 0, 0);
1390         gtk_widget_show (w);
1391
1392         dlgTexReset.editTexOld = gtk_entry_new_with_max_length(256);
1393         gtk_entry_set_text(GTK_ENTRY(dlgTexReset.editTexOld), rs->textureName);
1394     gtk_table_attach (GTK_TABLE (table), dlgTexReset.editTexOld, 2, 3, 0, 1,
1395                                 (GtkAttachOptions) (GTK_FILL),
1396                         (GtkAttachOptions) (0), 0, 0);
1397         gtk_widget_show (dlgTexReset.editTexOld);
1398
1399         w = gtk_label_new ("New Name: ");
1400         gtk_table_attach (GTK_TABLE (table), w, 1, 2, 1, 2,
1401                         (GtkAttachOptions) (GTK_FILL),
1402                         (GtkAttachOptions) (0), 0, 0);
1403         gtk_widget_show (w);
1404
1405         dlgTexReset.editTexNew = gtk_entry_new_with_max_length(256);
1406         gtk_entry_set_text(GTK_ENTRY(dlgTexReset.editTexNew), rs->textureName);
1407         gtk_table_attach (GTK_TABLE (table), dlgTexReset.editTexNew, 2, 3, 1, 2,
1408                         (GtkAttachOptions) (GTK_FILL),
1409                         (GtkAttachOptions) (0), 0, 0);
1410         gtk_widget_show (dlgTexReset.editTexNew);
1411
1412         // ---- /frame ----
1413
1414     frame = gtk_frame_new ("Reset Scales");
1415     gtk_widget_show (frame);
1416     gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
1417
1418     table = gtk_table_new (2, 3, TRUE);
1419     gtk_widget_show (table);
1420     gtk_container_add (GTK_CONTAINER (frame), table);
1421     gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1422     gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1423     gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1424
1425         // ---- frame ----
1426
1427         dlgTexReset.cbScaleHor = gtk_check_button_new_with_label("Enabled");
1428         gtk_signal_connect (GTK_OBJECT (dlgTexReset.cbScaleHor), "toggled", GTK_SIGNAL_FUNC (dialog_button_callback_texreset_update), NULL);
1429         gtk_widget_show (dlgTexReset.cbScaleHor);
1430         gtk_table_attach (GTK_TABLE (table), dlgTexReset.cbScaleHor, 0, 1, 0, 1,
1431                         (GtkAttachOptions) (GTK_FILL),
1432                         (GtkAttachOptions) (0), 0, 0);
1433
1434         w = gtk_label_new ("New Horizontal Scale: ");
1435         gtk_table_attach (GTK_TABLE (table), w, 1, 2, 0, 1,
1436                         (GtkAttachOptions) (GTK_FILL),
1437                         (GtkAttachOptions) (0), 0, 0);
1438         gtk_widget_show (w);
1439
1440         dlgTexReset.editScaleHor = gtk_entry_new_with_max_length(256);
1441         gtk_entry_set_text(GTK_ENTRY(dlgTexReset.editScaleHor), "0.5");
1442         gtk_table_attach (GTK_TABLE (table), dlgTexReset.editScaleHor, 2, 3, 0, 1,
1443                         (GtkAttachOptions) (GTK_FILL),
1444                         (GtkAttachOptions) (0), 0, 0);
1445         gtk_widget_show (dlgTexReset.editScaleHor);
1446
1447
1448         dlgTexReset.cbScaleVert = gtk_check_button_new_with_label("Enabled");
1449         gtk_signal_connect (GTK_OBJECT (dlgTexReset.cbScaleVert), "toggled", GTK_SIGNAL_FUNC (dialog_button_callback_texreset_update), NULL);
1450         gtk_widget_show (dlgTexReset.cbScaleVert);
1451         gtk_table_attach (GTK_TABLE (table), dlgTexReset.cbScaleVert, 0, 1, 1, 2,
1452                         (GtkAttachOptions) (GTK_FILL),
1453                         (GtkAttachOptions) (0), 0, 0);
1454
1455         w = gtk_label_new ("New Vertical Scale: ");
1456         gtk_table_attach (GTK_TABLE (table), w, 1, 2, 1, 2,
1457                         (GtkAttachOptions) (GTK_FILL),
1458                         (GtkAttachOptions) (0), 0, 0);
1459         gtk_widget_show (w);
1460
1461         dlgTexReset.editScaleVert = gtk_entry_new_with_max_length(256);
1462         gtk_entry_set_text(GTK_ENTRY(dlgTexReset.editScaleVert), "0.5");
1463         gtk_table_attach (GTK_TABLE (table), dlgTexReset.editScaleVert, 2, 3, 1, 2,
1464                         (GtkAttachOptions) (GTK_FILL),
1465                         (GtkAttachOptions) (0), 0, 0);
1466         gtk_widget_show (dlgTexReset.editScaleVert);
1467
1468         // ---- /frame ----
1469
1470     frame = gtk_frame_new ("Reset Shift");
1471     gtk_widget_show (frame);
1472     gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
1473
1474     table = gtk_table_new (2, 3, TRUE);
1475     gtk_widget_show (table);
1476     gtk_container_add (GTK_CONTAINER (frame), table);
1477     gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1478     gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1479     gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1480
1481                 // ---- frame ----
1482
1483         dlgTexReset.cbShiftHor = gtk_check_button_new_with_label("Enabled");
1484         gtk_signal_connect (GTK_OBJECT (dlgTexReset.cbShiftHor), "toggled", GTK_SIGNAL_FUNC (dialog_button_callback_texreset_update), NULL);
1485         gtk_widget_show (dlgTexReset.cbShiftHor);
1486         gtk_table_attach (GTK_TABLE (table), dlgTexReset.cbShiftHor, 0, 1, 0, 1,
1487                         (GtkAttachOptions) (GTK_FILL),
1488                         (GtkAttachOptions) (0), 0, 0);
1489
1490         w = gtk_label_new ("New Horizontal Shift: ");
1491         gtk_table_attach (GTK_TABLE (table), w, 1, 2, 0, 1,
1492                         (GtkAttachOptions) (GTK_FILL),
1493                         (GtkAttachOptions) (0), 0, 0);
1494         gtk_widget_show (w);
1495
1496         dlgTexReset.editShiftHor = gtk_entry_new_with_max_length(256);
1497         gtk_entry_set_text(GTK_ENTRY(dlgTexReset.editShiftHor), "0");
1498         gtk_table_attach (GTK_TABLE (table), dlgTexReset.editShiftHor, 2, 3, 0, 1,
1499                         (GtkAttachOptions) (GTK_FILL),
1500                         (GtkAttachOptions) (0), 0, 0);
1501         gtk_widget_show (dlgTexReset.editShiftHor);
1502
1503
1504         dlgTexReset.cbShiftVert = gtk_check_button_new_with_label("Enabled");
1505         gtk_signal_connect (GTK_OBJECT (dlgTexReset.cbShiftVert), "toggled", GTK_SIGNAL_FUNC (dialog_button_callback_texreset_update), NULL);
1506         gtk_widget_show (dlgTexReset.cbShiftVert);
1507         gtk_table_attach (GTK_TABLE (table), dlgTexReset.cbShiftVert, 0, 1, 1, 2,
1508                         (GtkAttachOptions) (GTK_FILL),
1509                         (GtkAttachOptions) (0), 0, 0);
1510
1511         w = gtk_label_new ("New Vertical Shift: ");
1512         gtk_table_attach (GTK_TABLE (table), w, 1, 2, 1, 2,
1513                         (GtkAttachOptions) (GTK_FILL),
1514                         (GtkAttachOptions) (0), 0, 0);
1515         gtk_widget_show (w);
1516
1517         dlgTexReset.editShiftVert = gtk_entry_new_with_max_length(256);
1518         gtk_entry_set_text(GTK_ENTRY(dlgTexReset.editShiftVert), "0");
1519         gtk_table_attach (GTK_TABLE (table), dlgTexReset.editShiftVert, 2, 3, 1, 2,
1520                         (GtkAttachOptions) (GTK_FILL),
1521                         (GtkAttachOptions) (0), 0, 0);
1522         gtk_widget_show (dlgTexReset.editShiftVert);
1523
1524         // ---- /frame ----
1525
1526     frame = gtk_frame_new ("Reset Rotation");
1527     gtk_widget_show (frame);
1528     gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
1529
1530     table = gtk_table_new (1, 3, TRUE);
1531     gtk_widget_show (table);
1532     gtk_container_add (GTK_CONTAINER (frame), table);
1533     gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1534     gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1535     gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1536
1537                 // ---- frame ----
1538
1539         dlgTexReset.cbRotation = gtk_check_button_new_with_label("Enabled");
1540         gtk_widget_show (dlgTexReset.cbRotation);
1541         gtk_table_attach (GTK_TABLE (table), dlgTexReset.cbRotation, 0, 1, 0, 1,
1542                         (GtkAttachOptions) (GTK_FILL),
1543                         (GtkAttachOptions) (0), 0, 0);
1544
1545         w = gtk_label_new ("New Rotation Value: ");
1546         gtk_table_attach (GTK_TABLE (table), w, 1, 2, 0, 1,
1547                         (GtkAttachOptions) (GTK_FILL),
1548                         (GtkAttachOptions) (0), 0, 0);
1549         gtk_widget_show (w);
1550
1551         dlgTexReset.editRotation = gtk_entry_new_with_max_length(256);
1552         gtk_entry_set_text(GTK_ENTRY(dlgTexReset.editRotation), "0");
1553         gtk_table_attach (GTK_TABLE (table), dlgTexReset.editRotation, 2, 3, 0, 1,
1554                         (GtkAttachOptions) (GTK_FILL),
1555                         (GtkAttachOptions) (0), 0, 0);
1556         gtk_widget_show (dlgTexReset.editRotation);
1557
1558         // ---- /frame ----
1559
1560         hbox = gtk_hbox_new (FALSE, 10);
1561         gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 2);
1562         gtk_widget_show (hbox);
1563         
1564         // ---- hbox ----
1565
1566         w = gtk_button_new_with_label ("Use Selected Brushes");
1567         gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
1568         gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (eIDOK));
1569
1570         GTK_WIDGET_SET_FLAGS (w, GTK_CAN_DEFAULT);
1571         gtk_widget_grab_default (w);
1572         gtk_widget_show (w);
1573  
1574         w = gtk_button_new_with_label ("Use All Brushes");
1575         gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
1576         gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (eIDYES));
1577         gtk_widget_show (w);
1578
1579         w = gtk_button_new_with_label ("Cancel");
1580         gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
1581         gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (eIDCANCEL));
1582         gtk_widget_show (w);
1583         ret = eIDCANCEL;
1584
1585         // ---- /hbox ----
1586         
1587         // ---- /vbox ----
1588
1589         gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
1590         gtk_widget_show (window);
1591         gtk_grab_add (window);
1592  
1593         Update_TextureReseter();
1594
1595         bool dialogError = TRUE;
1596         while (dialogError)
1597         {
1598                 loop = 1;
1599                 while (loop)
1600                         gtk_main_iteration ();
1601  
1602                 dialogError = FALSE;
1603
1604                 if(ret != eIDCANCEL)
1605                 {
1606                         rs->bResetRotation =  gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( dlgTexReset.cbRotation ));
1607                         if(rs->bResetRotation)
1608                                 if(!ValidateTextInt(gtk_entry_get_text(GTK_ENTRY(dlgTexReset.editRotation)), "Rotation", &rs->rotation))
1609                                         dialogError = TRUE;
1610
1611                         rs->bResetScale[0] =  gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( dlgTexReset.cbScaleHor ));
1612                         if(rs->bResetScale[0])
1613                                 if(!ValidateTextFloat(gtk_entry_get_text(GTK_ENTRY(dlgTexReset.editScaleHor)), "Horizontal Scale", &rs->fScale[0]))
1614                                         dialogError = TRUE;
1615
1616                         rs->bResetScale[1] =  gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( dlgTexReset.cbScaleVert ));
1617                         if(rs->bResetScale[1])
1618                                 if(!ValidateTextFloat(gtk_entry_get_text(GTK_ENTRY(dlgTexReset.editScaleVert)), "Vertical Scale", &rs->fScale[1]))
1619                                         dialogError = TRUE;
1620
1621                         rs->bResetShift[0] =  gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( dlgTexReset.cbShiftHor ));
1622                         if(rs->bResetShift[0])
1623                                 if(!ValidateTextFloat(gtk_entry_get_text(GTK_ENTRY(dlgTexReset.editShiftHor)), "Horizontal Shift", &rs->fShift[0]))
1624                                         dialogError = TRUE;
1625
1626                         rs->bResetShift[1] =  gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( dlgTexReset.cbShiftVert ));
1627                         if(rs->bResetShift[1])
1628                                 if(!ValidateTextFloat(gtk_entry_get_text(GTK_ENTRY(dlgTexReset.editShiftVert)), "Vertical Shift", &rs->fShift[1]))
1629                                         dialogError = TRUE;
1630
1631                         rs->bResetTextureName =  gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( dlgTexReset.cbTexChange ));
1632                         if(rs->bResetTextureName)
1633                         {
1634                                 strcpy(rs->textureName,     gtk_entry_get_text(GTK_ENTRY( dlgTexReset.editTexOld )));
1635                                 strcpy(rs->newTextureName,  gtk_entry_get_text(GTK_ENTRY( dlgTexReset.editTexNew )));
1636                         }
1637                 }
1638         }
1639
1640         gtk_grab_remove (window);
1641         gtk_widget_destroy (window);
1642
1643         return ret;
1644 }
1645
1646 EMessageBoxReturn DoTrainThingBox (TrainThingRS* rs)
1647 {
1648         Str texSelected;
1649
1650         GtkWidget *window, *w, *vbox, *hbox, *frame, *table;
1651
1652         GtkWidget *radiusX, *radiusY;
1653         GtkWidget *angleStart, *angleEnd;
1654         GtkWidget *heightStart, *heightEnd;
1655         GtkWidget *numPoints;
1656
1657         EMessageBoxReturn ret;
1658   int loop = 1;
1659  
1660         window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1661         
1662         gtk_signal_connect (GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
1663         gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
1664
1665         gtk_window_set_title (GTK_WINDOW (window), "Train Thing");
1666         gtk_container_border_width (GTK_CONTAINER (window), 10);
1667
1668         gtk_object_set_data (GTK_OBJECT (window), "loop", &loop);
1669         gtk_object_set_data (GTK_OBJECT (window), "ret", &ret);
1670
1671         gtk_widget_realize (window);
1672         
1673         vbox = gtk_vbox_new (FALSE, 10);
1674         gtk_container_add (GTK_CONTAINER (window), vbox);
1675         gtk_widget_show (vbox);
1676  
1677         // ---- vbox ----
1678
1679         hbox = gtk_hbox_new (FALSE, 10);
1680         gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 2);
1681         gtk_widget_show (hbox);
1682
1683         // ---- /hbox ----
1684
1685         frame = gtk_frame_new ("Radii");
1686     gtk_widget_show (frame);
1687     gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
1688
1689     table = gtk_table_new (2, 3, TRUE);
1690     gtk_widget_show (table);
1691     gtk_container_add (GTK_CONTAINER (frame), table);
1692     gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1693     gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1694     gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1695
1696         // ---- frame ----
1697
1698         w = gtk_label_new ("X: ");
1699         gtk_table_attach (GTK_TABLE (table), w, 0, 1, 0, 1,
1700                                 (GtkAttachOptions) (GTK_FILL),
1701                         (GtkAttachOptions) (0), 0, 0);
1702         gtk_widget_show (w);
1703
1704         radiusX = gtk_entry_new_with_max_length(256);
1705         gtk_entry_set_text(GTK_ENTRY(radiusX), "100");
1706     gtk_table_attach (GTK_TABLE (table), radiusX, 1, 2, 0, 1,
1707                                 (GtkAttachOptions) (GTK_FILL),
1708                         (GtkAttachOptions) (0), 0, 0);
1709         gtk_widget_show (radiusX);
1710
1711
1712
1713         w = gtk_label_new ("Y: ");
1714         gtk_table_attach (GTK_TABLE (table), w, 0, 1, 1, 2,
1715                         (GtkAttachOptions) (GTK_FILL),
1716                         (GtkAttachOptions) (0), 0, 0);
1717         gtk_widget_show (w);
1718
1719         radiusY = gtk_entry_new_with_max_length(256);
1720         gtk_entry_set_text(GTK_ENTRY(radiusY), "100");
1721         gtk_table_attach (GTK_TABLE (table), radiusY, 1, 2, 1, 2,
1722                         (GtkAttachOptions) (GTK_FILL),
1723                         (GtkAttachOptions) (0), 0, 0);
1724         gtk_widget_show (radiusY);
1725
1726
1727
1728         frame = gtk_frame_new ("Angles");
1729     gtk_widget_show (frame);
1730     gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
1731
1732     table = gtk_table_new (2, 3, TRUE);
1733     gtk_widget_show (table);
1734     gtk_container_add (GTK_CONTAINER (frame), table);
1735     gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1736     gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1737     gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1738
1739         // ---- frame ----
1740
1741         w = gtk_label_new ("Start: ");
1742         gtk_table_attach (GTK_TABLE (table), w, 0, 1, 0, 1,
1743                                 (GtkAttachOptions) (GTK_FILL),
1744                         (GtkAttachOptions) (0), 0, 0);
1745         gtk_widget_show (w);
1746
1747         angleStart = gtk_entry_new_with_max_length(256);
1748         gtk_entry_set_text(GTK_ENTRY(angleStart), "0");
1749     gtk_table_attach (GTK_TABLE (table), angleStart, 1, 2, 0, 1,
1750                                 (GtkAttachOptions) (GTK_FILL),
1751                         (GtkAttachOptions) (0), 0, 0);
1752         gtk_widget_show (angleStart);
1753
1754
1755
1756         w = gtk_label_new ("End: ");
1757         gtk_table_attach (GTK_TABLE (table), w, 0, 1, 1, 2,
1758                         (GtkAttachOptions) (GTK_FILL),
1759                         (GtkAttachOptions) (0), 0, 0);
1760         gtk_widget_show (w);
1761
1762         angleEnd = gtk_entry_new_with_max_length(256);
1763         gtk_entry_set_text(GTK_ENTRY(angleEnd), "90");
1764         gtk_table_attach (GTK_TABLE (table), angleEnd, 1, 2, 1, 2,
1765                         (GtkAttachOptions) (GTK_FILL),
1766                         (GtkAttachOptions) (0), 0, 0);
1767         gtk_widget_show (angleEnd);
1768
1769
1770         frame = gtk_frame_new ("Height");
1771     gtk_widget_show (frame);
1772     gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
1773
1774     table = gtk_table_new (2, 3, TRUE);
1775     gtk_widget_show (table);
1776     gtk_container_add (GTK_CONTAINER (frame), table);
1777     gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1778     gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1779     gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1780
1781         // ---- frame ----
1782
1783         w = gtk_label_new ("Start: ");
1784         gtk_table_attach (GTK_TABLE (table), w, 0, 1, 0, 1,
1785                                 (GtkAttachOptions) (GTK_FILL),
1786                         (GtkAttachOptions) (0), 0, 0);
1787         gtk_widget_show (w);
1788
1789         heightStart = gtk_entry_new_with_max_length(256);
1790         gtk_entry_set_text(GTK_ENTRY(heightStart), "0");
1791     gtk_table_attach (GTK_TABLE (table), heightStart, 1, 2, 0, 1,
1792                                 (GtkAttachOptions) (GTK_FILL),
1793                         (GtkAttachOptions) (0), 0, 0);
1794         gtk_widget_show (heightStart);
1795
1796
1797
1798         w = gtk_label_new ("End: ");
1799         gtk_table_attach (GTK_TABLE (table), w, 0, 1, 1, 2,
1800                         (GtkAttachOptions) (GTK_FILL),
1801                         (GtkAttachOptions) (0), 0, 0);
1802         gtk_widget_show (w);
1803
1804         heightEnd = gtk_entry_new_with_max_length(256);
1805         gtk_entry_set_text(GTK_ENTRY(heightEnd), "0");
1806         gtk_table_attach (GTK_TABLE (table), heightEnd, 1, 2, 1, 2,
1807                         (GtkAttachOptions) (GTK_FILL),
1808                         (GtkAttachOptions) (0), 0, 0);
1809         gtk_widget_show (heightEnd);
1810
1811
1812
1813         frame = gtk_frame_new ("Points");
1814     gtk_widget_show (frame);
1815     gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
1816
1817     table = gtk_table_new (2, 3, TRUE);
1818     gtk_widget_show (table);
1819     gtk_container_add (GTK_CONTAINER (frame), table);
1820     gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1821     gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1822     gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1823
1824         // ---- frame ----
1825
1826         w = gtk_label_new ("Number: ");
1827         gtk_table_attach (GTK_TABLE (table), w, 0, 1, 0, 1,
1828                                 (GtkAttachOptions) (GTK_FILL),
1829                         (GtkAttachOptions) (0), 0, 0);
1830         gtk_widget_show (w);
1831
1832         numPoints = gtk_entry_new_with_max_length(256);
1833         gtk_entry_set_text(GTK_ENTRY(numPoints), "0");
1834     gtk_table_attach (GTK_TABLE (table), numPoints, 1, 2, 0, 1,
1835                                 (GtkAttachOptions) (GTK_FILL),
1836                         (GtkAttachOptions) (0), 0, 0);
1837         gtk_widget_show (numPoints);
1838
1839
1840                 hbox = gtk_hbox_new (FALSE, 10);
1841                 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 2);
1842                 gtk_widget_show (hbox);
1843         
1844                 // ---- hbox ----
1845
1846                         w = gtk_button_new_with_label ("Ok");
1847                         gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
1848                         gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (eIDOK));
1849
1850                         GTK_WIDGET_SET_FLAGS (w, GTK_CAN_DEFAULT);
1851                         gtk_widget_grab_default (w);
1852                         gtk_widget_show (w);
1853  
1854                         w = gtk_button_new_with_label ("Cancel");
1855                         gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
1856                         gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (eIDCANCEL));
1857                         gtk_widget_show (w);
1858                         ret = eIDCANCEL;
1859
1860                 // ---- /hbox ----
1861         
1862
1863
1864         gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
1865         gtk_widget_show (window);
1866         gtk_grab_add (window);
1867  
1868         bool dialogError = TRUE;
1869         while (dialogError)
1870         {
1871                 loop = 1;
1872                 while (loop)
1873                         gtk_main_iteration ();
1874  
1875                 dialogError = FALSE;
1876
1877                 if(ret != eIDCANCEL)
1878                 {
1879                         if(!ValidateTextFloat(gtk_entry_get_text(GTK_ENTRY(radiusX)), "Radius (X)", &rs->fRadiusX))
1880                                 dialogError = TRUE;
1881
1882                         if(!ValidateTextFloat(gtk_entry_get_text(GTK_ENTRY(radiusY)), "Radius (Y)", &rs->fRadiusY))
1883                                 dialogError = TRUE;
1884
1885                         if(!ValidateTextFloat(gtk_entry_get_text(GTK_ENTRY(angleStart)), "Angle (Start)", &rs->fStartAngle))
1886                                 dialogError = TRUE;
1887
1888                         if(!ValidateTextFloat(gtk_entry_get_text(GTK_ENTRY(angleEnd)), "Angle (End)", &rs->fEndAngle))
1889                                 dialogError = TRUE;
1890
1891                         if(!ValidateTextFloat(gtk_entry_get_text(GTK_ENTRY(heightStart)), "Height (Start)", &rs->fStartHeight))
1892                                 dialogError = TRUE;
1893
1894                         if(!ValidateTextFloat(gtk_entry_get_text(GTK_ENTRY(heightEnd)), "Height (End)", &rs->fEndHeight))
1895                                 dialogError = TRUE;
1896
1897                         if(!ValidateTextInt(gtk_entry_get_text(GTK_ENTRY(numPoints)), "Num Points", &rs->iNumPoints))
1898                                 dialogError = TRUE;
1899                 }
1900         }
1901
1902         gtk_grab_remove (window);
1903         gtk_widget_destroy (window);
1904
1905         return ret;
1906 }