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