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