]> icculus.org git repositories - divverent/netradiant.git/blob - contrib/bobtoolz/dialogs/dialogs-gtk.cpp
changes from OSXnetradiant
[divverent/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         
374                 radio1 = gtk_radio_button_new_with_label(NULL, "Use Whole Map");
375                 gtk_box_pack_start (GTK_BOX (vbox), radio1, FALSE, FALSE, 2);
376                 gtk_widget_show (radio1);
377
378                 radio2 = gtk_radio_button_new_with_label(((GtkRadioButton*)radio1)->group, "Use Selected Brushes");
379                 gtk_box_pack_start (GTK_BOX (vbox), radio2, FALSE, FALSE, 2);
380                 gtk_widget_show (radio2);
381         
382                 w = gtk_hseparator_new ();
383                 gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 2);
384                 gtk_widget_show (w);
385
386                 check1 = gtk_check_button_new_with_label("Include Detail Brushes");
387                 gtk_box_pack_start (GTK_BOX (vbox), check1, FALSE, FALSE, 0);
388                 gtk_widget_show (check1);               
389
390                 check2 = gtk_check_button_new_with_label("Select Duplicate Brushes Only");
391                 gtk_box_pack_start (GTK_BOX (vbox), check2, FALSE, FALSE, 0);
392                 gtk_widget_show (check2);               
393
394                 hbox = gtk_hbox_new (FALSE, 10);
395                 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 2);
396                 gtk_widget_show (hbox);
397         
398                 // ---- hbox ---- ok/cancel buttons
399
400                 w = gtk_button_new_with_label ("Ok");
401                 gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
402                 gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (eIDOK));
403
404                 GTK_WIDGET_SET_FLAGS (w, GTK_CAN_DEFAULT);
405                 gtk_widget_grab_default (w);
406                 gtk_widget_show (w);
407  
408                 w = gtk_button_new_with_label ("Cancel");
409                 gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
410                 gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (eIDCANCEL));
411                 gtk_widget_show (w);
412                 ret = eIDCANCEL;
413
414                 // ---- /hbox ----
415  
416         // ---- /vbox ----
417
418         gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
419         gtk_widget_show (window);
420         gtk_grab_add (window);
421  
422         while (loop)
423                 gtk_main_iteration ();
424
425         if(gtk_toggle_button_get_active((GtkToggleButton*)radio1))
426                 rs->nBrushOptions = BRUSH_OPT_WHOLE_MAP;
427         else if(gtk_toggle_button_get_active((GtkToggleButton*)radio2))
428                 rs->nBrushOptions = BRUSH_OPT_SELECTED;
429
430   rs->bUseDetail = gtk_toggle_button_get_active((GtkToggleButton*)check1) ? true : false;
431         rs->bDuplicateOnly = gtk_toggle_button_get_active((GtkToggleButton*)check2) ? true : false;
432  
433         gtk_grab_remove (window);
434         gtk_widget_destroy (window);
435
436         return ret;
437 }
438
439 EMessageBoxReturn DoPolygonBox (PolygonRS* rs)
440 {
441         GtkWidget *window, *w, *vbox, *hbox, *vbox2, *hbox2;
442
443         GtkWidget *check1, *check2, *check3;
444         GtkWidget *text1, *text2;
445
446         EMessageBoxReturn ret;
447   int loop = 1;
448  
449         window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
450         
451         gtk_signal_connect (GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
452         gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
453
454         gtk_window_set_title (GTK_WINDOW (window), "Polygon Builder");
455         gtk_container_border_width (GTK_CONTAINER (window), 10);
456
457         g_object_set_data (G_OBJECT (window), "loop", &loop);
458         g_object_set_data (G_OBJECT (window), "ret", &ret);
459
460         gtk_widget_realize (window);
461  
462
463         
464         vbox = gtk_vbox_new (FALSE, 10);
465         gtk_container_add (GTK_CONTAINER (window), vbox);
466         gtk_widget_show (vbox);
467  
468         // ---- vbox ----
469
470                 hbox = gtk_hbox_new (FALSE, 10);
471                 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 2);
472                 gtk_widget_show (hbox);
473         
474                 // ---- hbox ----
475
476         
477                         vbox2 = gtk_vbox_new (FALSE, 10);
478                         gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 2);
479                         gtk_widget_show (vbox2);
480  
481                         // ---- vbox2 ----
482
483                                 hbox2 = gtk_hbox_new (FALSE, 10);
484                                 gtk_box_pack_start (GTK_BOX (vbox2), hbox2, FALSE, FALSE, 2);
485                                 gtk_widget_show (hbox2);
486
487                                 // ---- hbox2 ----
488
489                                         text1 = gtk_entry_new_with_max_length(256);
490                                         gtk_entry_set_text((GtkEntry*)text1, "3");
491                                         gtk_box_pack_start (GTK_BOX (hbox2), text1, FALSE, FALSE, 2);
492                                         gtk_widget_show (text1);
493
494                                         w = gtk_label_new ("Number Of Sides");
495                                         gtk_box_pack_start (GTK_BOX (hbox2), w, FALSE, FALSE, 2);
496                                         gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_LEFT);
497                                         gtk_widget_show (w);
498
499                                 // ---- /hbox2 ----
500
501                                 hbox2 = gtk_hbox_new (FALSE, 10);
502                                 gtk_box_pack_start (GTK_BOX (vbox2), hbox2, FALSE, FALSE, 2);
503                                 gtk_widget_show (hbox2);
504
505                                 // ---- hbox2 ----
506
507                                         text2 = gtk_entry_new_with_max_length(256);
508                                         gtk_entry_set_text((GtkEntry*)text2, "8");
509                                         gtk_box_pack_start (GTK_BOX (hbox2), text2, FALSE, FALSE, 2);
510                                         gtk_widget_show (text2);
511
512                                         w = gtk_label_new ("Border Width");
513                                         gtk_box_pack_start (GTK_BOX (hbox2), w, FALSE, FALSE, 2);
514                                         gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_LEFT);
515                                         gtk_widget_show (w);
516                                 
517                                 // ---- /hbox2 ----
518
519                         // ---- /vbox2 ----
520
521
522                         
523                         vbox2 = gtk_vbox_new (FALSE, 10);
524                         gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 2);
525                         gtk_widget_show (vbox2);
526  
527                         // ---- vbox2 ----
528
529                                 check1 = gtk_check_button_new_with_label("Use Border");
530                                 gtk_box_pack_start (GTK_BOX (vbox2), check1, FALSE, FALSE, 0);
531                                 gtk_widget_show (check1);
532  
533
534                                 check2 = gtk_check_button_new_with_label("Inverse Polygon");
535                                 gtk_box_pack_start (GTK_BOX (vbox2), check2, FALSE, FALSE, 0);
536                                 gtk_widget_show (check2);
537  
538
539                                 check3 = gtk_check_button_new_with_label("Align Top Edge");
540                                 gtk_box_pack_start (GTK_BOX (vbox2), check3, FALSE, FALSE, 0);
541                                 gtk_widget_show (check3);
542  
543                         // ---- /vbox2 ----
544
545                 // ---- /hbox ----
546  
547                 hbox = gtk_hbox_new (FALSE, 10);
548                 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 2);
549                 gtk_widget_show (hbox);
550         
551                 // ---- hbox ----
552
553                         w = gtk_button_new_with_label ("Ok");
554                         gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
555                         gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (eIDOK));
556
557                         GTK_WIDGET_SET_FLAGS (w, GTK_CAN_DEFAULT);
558                         gtk_widget_grab_default (w);
559                         gtk_widget_show (w);
560  
561                         w = gtk_button_new_with_label ("Cancel");
562                         gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
563                         gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (eIDCANCEL));
564                         gtk_widget_show (w);
565                         ret = eIDCANCEL;
566
567                 // ---- /hbox ----
568         
569         // ---- /vbox ----
570
571         gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
572         gtk_widget_show (window);
573         gtk_grab_add (window);
574  
575         bool dialogError = TRUE;
576         while (dialogError)
577         {
578                 loop = 1;
579                 while (loop)
580                         gtk_main_iteration ();
581  
582                 dialogError = FALSE;
583
584                 if(ret == eIDOK)
585                 {
586                         rs->bUseBorder = gtk_toggle_button_get_active((GtkToggleButton*)check1) ? true : false;
587                         rs->bInverse = gtk_toggle_button_get_active((GtkToggleButton*)check2) ? true : false;
588                         rs->bAlignTop = gtk_toggle_button_get_active((GtkToggleButton*)check3) ? true : false;
589
590                         if(!ValidateTextIntRange(gtk_entry_get_text((GtkEntry*)text1), 3, 32, "Number Of Sides", &rs->nSides))
591                                 dialogError = TRUE;
592
593                         if(rs->bUseBorder)
594                         {
595                                 if(!ValidateTextIntRange(gtk_entry_get_text((GtkEntry*)text2), 8, 256, "Border Width", &rs->nBorderWidth))
596                                         dialogError = TRUE;
597                         }
598                 }
599         }
600
601         gtk_grab_remove (window);
602         gtk_widget_destroy (window);
603
604         return ret;
605 }
606
607 // mars
608 // for stair builder stuck as close as i could to the MFC version
609 // obviously feel free to change it at will :)
610 EMessageBoxReturn DoBuildStairsBox(BuildStairsRS* rs)
611 {
612         // i made widgets for just about everything ... i think that's what i need to do  dunno tho 
613         GtkWidget       *window, *w, *vbox, *hbox;
614         GtkWidget       *textStairHeight, *textRiserTex, *textMainTex;
615         GtkWidget       *radioNorth, *radioSouth, *radioEast, *radioWest;       // i'm guessing we can't just abuse 'w' for these if we're getting a value
616         GtkWidget       *radioOldStyle, *radioBobStyle, *radioCornerStyle;
617         GtkWidget       *checkUseDetail;
618         GSList          *radioDirection, *radioStyle;
619         EMessageBoxReturn ret;
620   int loop = 1;
621
622         char    *text = "Please set a value in the boxes below and press 'OK' to build the stairs";
623
624         window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
625         
626         gtk_signal_connect (GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
627         gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
628
629         gtk_window_set_title( GTK_WINDOW( window ), "Stair Builder" );
630         
631         gtk_container_border_width( GTK_CONTAINER( window ), 10 );
632
633         g_object_set_data (G_OBJECT (window), "loop", &loop);
634         g_object_set_data (G_OBJECT (window), "ret", &ret);
635
636         gtk_widget_realize (window);
637
638         // new vbox 
639         vbox = gtk_vbox_new( FALSE, 10 );
640         gtk_container_add( GTK_CONTAINER( window ), vbox );
641         gtk_widget_show( vbox );
642
643         hbox = gtk_hbox_new( FALSE, 10 );
644         gtk_container_add( GTK_CONTAINER( vbox ), hbox );
645         gtk_widget_show( hbox );
646         
647         // dunno if you want this text or not ...
648         w = gtk_label_new( text );
649         gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 ); // not entirely sure on all the parameters / what they do ...
650         gtk_widget_show( w );
651
652         w = gtk_hseparator_new();
653         gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 0 );
654         gtk_widget_show( w );
655         
656         // ------------------------- // indenting == good way of keeping track of lines :)
657
658                 // new hbox
659                 hbox = gtk_hbox_new( FALSE, 10 );
660                 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
661                 gtk_widget_show( hbox );
662         
663                 textStairHeight = gtk_entry_new_with_max_length( 256 ); 
664                 gtk_box_pack_start( GTK_BOX( hbox ), textStairHeight, FALSE, FALSE, 1 );
665                 gtk_widget_show( textStairHeight );
666
667                 w = gtk_label_new( "Stair Height" );
668                 gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 1 );
669                 gtk_widget_show( w );
670
671         // ------------------------- //
672
673         hbox = gtk_hbox_new( FALSE, 10 );
674         gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
675         gtk_widget_show( hbox );
676
677         w = gtk_label_new( "Direction:" );
678         gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 5 );
679         gtk_widget_show( w );
680
681         // -------------------------- //
682
683                 hbox = gtk_hbox_new( FALSE, 10 );
684                 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
685                 gtk_widget_show( hbox );
686                 
687                 // radio buttons confuse me ...
688                 // but this _looks_ right
689
690                 // djbob: actually it looks very nice :), slightly better than the way i did it
691                 // edit: actually it doesn't work :P, you must pass the last radio item each time, ugh
692
693                 radioNorth = gtk_radio_button_new_with_label( NULL, "North" );
694                 gtk_box_pack_start( GTK_BOX( hbox ), radioNorth, FALSE, FALSE, 3 );
695                 gtk_widget_show( radioNorth );
696
697                 radioDirection = gtk_radio_button_group( GTK_RADIO_BUTTON( radioNorth ) );
698                 
699                 radioSouth = gtk_radio_button_new_with_label( radioDirection, "South" );
700                 gtk_box_pack_start( GTK_BOX( hbox ), radioSouth, FALSE, FALSE, 2 );
701                 gtk_widget_show( radioSouth );
702
703                 radioDirection = gtk_radio_button_group( GTK_RADIO_BUTTON( radioSouth ) );
704
705                 radioEast = gtk_radio_button_new_with_label( radioDirection, "East" );
706                 gtk_box_pack_start( GTK_BOX( hbox ), radioEast, FALSE, FALSE, 1 );
707                 gtk_widget_show( radioEast );
708
709                 radioDirection = gtk_radio_button_group( GTK_RADIO_BUTTON( radioEast ) );
710
711                 radioWest = gtk_radio_button_new_with_label( radioDirection, "West" );
712                 gtk_box_pack_start( GTK_BOX( hbox ), radioWest, FALSE, FALSE, 0 );
713                 gtk_widget_show( radioWest );
714
715         // --------------------------- //
716
717         hbox = gtk_hbox_new( FALSE, 10 );
718         gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
719         gtk_widget_show( hbox );
720
721         w = gtk_label_new( "Style:" );
722         gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 5 );
723         gtk_widget_show( w );
724
725         // --------------------------- //
726
727                 hbox = gtk_hbox_new( FALSE, 10 );
728                 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
729                 gtk_widget_show( hbox );
730         
731                 radioOldStyle = gtk_radio_button_new_with_label( NULL, "Original" );
732                 gtk_box_pack_start( GTK_BOX( hbox ), radioOldStyle, FALSE, FALSE, 0 );
733                 gtk_widget_show( radioOldStyle );
734
735                 radioStyle = gtk_radio_button_group( GTK_RADIO_BUTTON( radioOldStyle ) );
736
737                 radioBobStyle = gtk_radio_button_new_with_label( radioStyle, "Bob's Style" );
738                 gtk_box_pack_start( GTK_BOX( hbox ), radioBobStyle, FALSE, FALSE, 0 );
739                 gtk_widget_show( radioBobStyle );
740         
741                 radioStyle = gtk_radio_button_group( GTK_RADIO_BUTTON( radioBobStyle ) );
742
743                 radioCornerStyle = gtk_radio_button_new_with_label( radioStyle, "Corner Style" );
744                 gtk_box_pack_start( GTK_BOX( hbox ), radioCornerStyle, FALSE, FALSE, 0 );
745                 gtk_widget_show( radioCornerStyle );
746         
747                 // err, the q3r has an if or something so you need bob style checked before this 
748                 // is "ungreyed out" but you'll need to do that, as i suck :)
749
750                 // djbob: er.... yeah um, im not at all sure how i'm gonna sort this
751                 // djbob: think we need some button callback functions or smuffin
752                 // FIXME: actually get around to doing what i suggested!!!!
753
754                 checkUseDetail = gtk_check_button_new_with_label( "Use Detail Brushes" );
755                 gtk_box_pack_start( GTK_BOX( hbox ), checkUseDetail, FALSE, FALSE, 0 );
756                 gtk_widget_show( checkUseDetail );
757
758         // --------------------------- // 
759
760         hbox = gtk_hbox_new( FALSE, 10 );
761         gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
762         gtk_widget_show( hbox );
763
764         textMainTex = gtk_entry_new_with_max_length( 512 );
765         gtk_entry_set_text(GTK_ENTRY(textMainTex), rs->mainTexture);
766         gtk_box_pack_start( GTK_BOX( hbox ), textMainTex, FALSE, FALSE, 0 );
767         gtk_widget_show( textMainTex );
768
769         w = gtk_label_new( "Main Texture" );
770         gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 1 );
771         gtk_widget_show( w );
772
773         // -------------------------- //
774
775         hbox = gtk_hbox_new( FALSE, 10 );
776         gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
777         gtk_widget_show( hbox );
778
779         textRiserTex = gtk_entry_new_with_max_length( 512 );
780         gtk_box_pack_start( GTK_BOX( hbox ), textRiserTex, FALSE, FALSE, 0 );
781         gtk_widget_show( textRiserTex );
782
783         w = gtk_label_new( "Riser Texture" );
784         gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 1 );
785         gtk_widget_show( w );
786
787         // -------------------------- //
788         w = gtk_hseparator_new();
789         gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 0 );
790         gtk_widget_show( w );
791
792         hbox = gtk_hbox_new( FALSE, 10 );
793         gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
794         gtk_widget_show( hbox );
795
796         w = gtk_button_new_with_label( "OK" );
797         gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0);
798         gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( dialog_button_callback ), GINT_TO_POINTER( eIDOK ) );
799         GTK_WIDGET_SET_FLAGS( w, GTK_CAN_DEFAULT );
800         gtk_widget_grab_default( w );
801         gtk_widget_show( w );
802                 
803         w = gtk_button_new_with_label( "Cancel" );
804         gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
805         gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( dialog_button_callback ), GINT_TO_POINTER( eIDCANCEL ) );
806         gtk_widget_show( w );
807                 
808         ret = eIDCANCEL;
809
810 // +djbob: need our "little" modal loop mars :P
811         gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
812         gtk_widget_show (window);
813         gtk_grab_add (window);
814  
815         bool dialogError = TRUE;
816         while (dialogError)
817         {
818                 loop = 1;
819                 while (loop)
820                         gtk_main_iteration ();
821  
822                 dialogError = FALSE;
823
824                 if(ret == eIDOK)
825                 {
826                         rs->bUseDetail = gtk_toggle_button_get_active((GtkToggleButton*)checkUseDetail) ? true : false;
827
828                         strcpy(rs->riserTexture, gtk_entry_get_text((GtkEntry*)textRiserTex));
829                         strcpy(rs->mainTexture, gtk_entry_get_text((GtkEntry*)textMainTex));
830
831                         if(gtk_toggle_button_get_active((GtkToggleButton*)radioNorth))
832                                 rs->direction = MOVE_NORTH;
833                         else if(gtk_toggle_button_get_active((GtkToggleButton*)radioSouth))
834                                 rs->direction = MOVE_SOUTH;
835                         else if(gtk_toggle_button_get_active((GtkToggleButton*)radioEast))
836                                 rs->direction = MOVE_EAST;
837                         else if(gtk_toggle_button_get_active((GtkToggleButton*)radioWest))
838                                 rs->direction = MOVE_WEST;
839
840                         if(!ValidateTextInt(gtk_entry_get_text((GtkEntry*)textStairHeight), "Stair Height", &rs->stairHeight))
841                                 dialogError = TRUE;
842
843                         if(gtk_toggle_button_get_active((GtkToggleButton*)radioOldStyle))
844                                 rs->style = STYLE_ORIGINAL;
845                         else if(gtk_toggle_button_get_active((GtkToggleButton*)radioBobStyle))
846                                 rs->style = STYLE_BOB;
847                         else if(gtk_toggle_button_get_active((GtkToggleButton*)radioCornerStyle))
848                                 rs->style = STYLE_CORNER;
849                 }
850         }
851
852         gtk_grab_remove (window);
853         gtk_widget_destroy (window);
854
855         return ret;
856 // -djbob
857         
858         // there we go, all done ... on my end at least, not bad for a night's work
859 }
860
861 EMessageBoxReturn DoDoorsBox(DoorRS* rs)
862 {
863         GtkWidget       *window, *hbox, *vbox, *w;
864         GtkWidget       *textFrontBackTex, *textTrimTex;
865         GtkWidget       *checkScaleMainH, *checkScaleMainV, *checkScaleTrimH, *checkScaleTrimV;
866         GtkWidget       *comboMain, *comboTrim;
867         GtkWidget       *buttonSetMain, *buttonSetTrim;
868         GtkWidget       *radioNS, *radioEW; 
869         GSList          *radioOrientation;
870         TwinWidget      tw1, tw2;
871         EMessageBoxReturn ret;
872   int loop = 1;
873         
874         window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
875         
876         gtk_signal_connect (GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
877         gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
878
879         gtk_window_set_title( GTK_WINDOW( window ), "Door Builder" );
880         
881         gtk_container_border_width( GTK_CONTAINER( window ), 10 );
882
883         g_object_set_data( G_OBJECT( window ), "loop", &loop );
884         g_object_set_data( G_OBJECT( window ), "ret", &ret );
885
886         gtk_widget_realize (window);
887         
888         char buffer[256];
889         GList           *listMainTextures = NULL;
890         GList           *listTrimTextures = NULL;
891         LoadGList(GetFilename(buffer, "plugins/bt/door-tex.txt"), &listMainTextures);
892         LoadGList(GetFilename(buffer, "plugins/bt/door-tex-trim.txt"), &listTrimTextures);
893         
894         vbox = gtk_vbox_new( FALSE, 10 );
895         gtk_container_add( GTK_CONTAINER( window ), vbox );
896         gtk_widget_show( vbox );
897
898         // -------------------------- //
899
900                 hbox = gtk_hbox_new( FALSE, 10 );
901                 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
902                 gtk_widget_show( hbox );
903
904                 textFrontBackTex = gtk_entry_new_with_max_length( 512 );
905                 gtk_entry_set_text( GTK_ENTRY( textFrontBackTex ), rs->mainTexture);
906                 gtk_box_pack_start( GTK_BOX( hbox ), textFrontBackTex, FALSE, FALSE, 0 );
907                 gtk_widget_show( textFrontBackTex );
908
909                 w = gtk_label_new( "Door Front/Back Texture" );
910                 gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
911                 gtk_widget_show( w );
912
913         // ------------------------ //
914
915                 hbox = gtk_hbox_new( FALSE, 10 );
916                 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
917                 gtk_widget_show( hbox );
918
919                 textTrimTex = gtk_entry_new_with_max_length( 512 );
920                 gtk_box_pack_start( GTK_BOX( hbox ), textTrimTex, FALSE, FALSE, 0 );
921                 gtk_widget_show( textTrimTex );
922
923                 w = gtk_label_new( "Door Trim Texture" );
924                 gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
925                 gtk_widget_show( w );
926
927         // ----------------------- //
928
929                 hbox = gtk_hbox_new( FALSE, 10 );
930                 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
931                 gtk_widget_show( hbox );
932
933                 // sp: horizontally ????
934                 // djbob: yes mars, u can spell :]
935                 checkScaleMainH = gtk_check_button_new_with_label( "Scale Main Texture Horizontally" );
936                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON( checkScaleMainH ), TRUE);
937                 gtk_box_pack_start( GTK_BOX( hbox ), checkScaleMainH, FALSE, FALSE, 0 );
938                 gtk_widget_show( checkScaleMainH );
939
940                 checkScaleTrimH = gtk_check_button_new_with_label( "Scale Trim Texture Horizontally" );
941                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON( checkScaleTrimH ), TRUE);
942                 gtk_box_pack_start( GTK_BOX( hbox ), checkScaleTrimH, FALSE, FALSE, 0 );
943                 gtk_widget_show( checkScaleTrimH );
944
945         // ---------------------- //
946
947                 hbox = gtk_hbox_new( FALSE, 10 );
948                 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
949                 gtk_widget_show( hbox );
950
951                 checkScaleMainV = gtk_check_button_new_with_label( "Scale Main Texture Vertically" );
952                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON( checkScaleMainV ), TRUE);
953                 gtk_box_pack_start( GTK_BOX( hbox ), checkScaleMainV, FALSE, FALSE, 0 );
954                 gtk_widget_show( checkScaleMainV );
955
956                 checkScaleTrimV = gtk_check_button_new_with_label( "Scale Trim Texture Vertically" );
957                 gtk_box_pack_start( GTK_BOX( hbox ), checkScaleTrimV, FALSE, FALSE, 0 );
958                 gtk_widget_show( checkScaleTrimV );
959                         
960         // --------------------- // 
961
962                 hbox = gtk_hbox_new( FALSE, 10 );
963                 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
964                 gtk_widget_show( hbox );
965
966                 // djbob: lists added
967
968                 comboMain = gtk_combo_new();
969                 gtk_box_pack_start( GTK_BOX( hbox ), comboMain, FALSE, FALSE, 0 );
970                 gtk_combo_set_popdown_strings( GTK_COMBO( comboMain ), listMainTextures );
971                 gtk_combo_set_use_arrows( GTK_COMBO( comboMain ), 1 );
972                 gtk_widget_show( comboMain );
973
974                 tw1.one = textFrontBackTex;
975                 tw1.two = comboMain;
976
977                 buttonSetMain = gtk_button_new_with_label( "Set As Main Texture" );
978                 gtk_signal_connect( GTK_OBJECT( buttonSetMain ), "clicked", GTK_SIGNAL_FUNC( dialog_button_callback_settex ), &tw1 );
979                 gtk_box_pack_start( GTK_BOX( hbox ), buttonSetMain, FALSE, FALSE, 0 );
980                 gtk_widget_show( buttonSetMain );
981
982         // ------------------- //
983                 
984                 hbox = gtk_hbox_new( FALSE, 10 );
985                 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
986                 gtk_widget_show( hbox );
987
988                 comboTrim = gtk_combo_new();
989                 gtk_box_pack_start( GTK_BOX( hbox ), comboTrim, FALSE, FALSE, 0 );
990                 gtk_combo_set_popdown_strings( GTK_COMBO( comboTrim ), listTrimTextures );
991                 gtk_combo_set_use_arrows( GTK_COMBO( comboMain ), 1 );
992                 gtk_widget_show( comboTrim );
993
994                 tw2.one = textTrimTex;
995                 tw2.two = comboTrim;
996
997                 buttonSetTrim = gtk_button_new_with_label( "Set As Trim Texture" );
998                 gtk_signal_connect( GTK_OBJECT( buttonSetTrim ), "clicked", GTK_SIGNAL_FUNC( dialog_button_callback_settex ), &tw2 );
999                 gtk_box_pack_start( GTK_BOX( hbox ), buttonSetTrim, FALSE, FALSE, 0 );
1000                 gtk_widget_show( buttonSetTrim );
1001
1002         // ------------------ //
1003
1004                 hbox = gtk_hbox_new( FALSE, 10 );
1005                 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
1006                 gtk_widget_show( hbox );
1007
1008                 w = gtk_label_new( "Orientation" );
1009                 gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
1010                 gtk_widget_show( w );
1011
1012                 // argh more radio buttons! 
1013                 radioNS = gtk_radio_button_new_with_label( NULL, "North - South" );
1014                 gtk_box_pack_start( GTK_BOX( hbox ), radioNS, FALSE, FALSE, 0 );
1015                 gtk_widget_show( radioNS );
1016
1017                 radioOrientation = gtk_radio_button_group( GTK_RADIO_BUTTON( radioNS ) );
1018
1019                 radioEW = gtk_radio_button_new_with_label( radioOrientation, "East - West" );
1020                 gtk_box_pack_start( GTK_BOX( hbox ), radioEW, FALSE, FALSE, 0 );
1021                 gtk_widget_show( radioEW );
1022
1023         // ----------------- //
1024
1025                 w = gtk_hseparator_new();
1026                 gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 0 );
1027                 gtk_widget_show( w );
1028
1029         // ----------------- //
1030
1031                 hbox = gtk_hbox_new( FALSE, 10 );
1032                 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
1033                 gtk_widget_show( hbox );
1034
1035                 w = gtk_button_new_with_label( "OK" );
1036                 gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0);
1037                 gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( dialog_button_callback ), GINT_TO_POINTER( eIDOK ) );
1038                 GTK_WIDGET_SET_FLAGS( w, GTK_CAN_DEFAULT );
1039                 gtk_widget_grab_default( w );
1040                 gtk_widget_show( w );
1041                 
1042                 w = gtk_button_new_with_label( "Cancel" );
1043                 gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
1044                 gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( dialog_button_callback ), GINT_TO_POINTER( eIDCANCEL ) );
1045                 gtk_widget_show( w );
1046                 ret = eIDCANCEL;
1047
1048         // ----------------- //
1049
1050 //+djbob
1051         gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
1052         gtk_widget_show (window);
1053         gtk_grab_add (window);
1054  
1055         while (loop)
1056                 gtk_main_iteration ();
1057
1058         strcpy(rs->mainTexture, gtk_entry_get_text( GTK_ENTRY( textFrontBackTex ) ));
1059         strcpy(rs->trimTexture, gtk_entry_get_text( GTK_ENTRY( textTrimTex ) ));
1060
1061         rs->bScaleMainH = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkScaleMainH)) ? true : false;
1062         rs->bScaleMainV = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkScaleMainV)) ? true : false;
1063         rs->bScaleTrimH = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkScaleTrimH)) ? true : false;
1064         rs->bScaleTrimV = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkScaleTrimV)) ? true : false;
1065
1066         if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radioNS)))
1067                 rs->nOrientation = DIRECTION_NS;
1068         else if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radioEW)))
1069                 rs->nOrientation = DIRECTION_EW;
1070  
1071         gtk_grab_remove (window);
1072         gtk_widget_destroy (window);
1073
1074         return ret;
1075 //-djbob
1076 }
1077
1078 EMessageBoxReturn DoPathPlotterBox(PathPlotterRS* rs)
1079 {
1080         GtkWidget *window, *w, *vbox, *hbox;
1081
1082         GtkWidget *text1, *text2, *text3;
1083         GtkWidget *check1, *check2;
1084
1085         EMessageBoxReturn ret;
1086   int loop = 1;
1087  
1088         window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1089         
1090         gtk_signal_connect (GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
1091         gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
1092
1093         gtk_window_set_title (GTK_WINDOW (window), "Texture Reset");
1094         gtk_container_border_width (GTK_CONTAINER (window), 10);
1095
1096         g_object_set_data (G_OBJECT (window), "loop", &loop);
1097         g_object_set_data (G_OBJECT (window), "ret", &ret);
1098
1099         gtk_widget_realize (window);
1100  
1101
1102         
1103         vbox = gtk_vbox_new (FALSE, 10);
1104         gtk_container_add (GTK_CONTAINER (window), vbox);
1105         gtk_widget_show (vbox);
1106  
1107         // ---- vbox ----
1108
1109                 hbox = gtk_hbox_new (FALSE, 10);
1110                 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 2);
1111                 gtk_widget_show (hbox);
1112         
1113                 // ---- hbox ----
1114
1115                         text1 = gtk_entry_new_with_max_length(256);
1116                         gtk_entry_set_text((GtkEntry*)text1, "25");
1117                         gtk_box_pack_start (GTK_BOX (hbox), text1, FALSE, FALSE, 2);
1118                         gtk_widget_show (text1);
1119
1120                         w = gtk_label_new ("Number Of Points");
1121                         gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 2);
1122                         gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_LEFT);
1123                         gtk_widget_show (w);
1124
1125                 // ---- /hbox ----
1126
1127                 hbox = gtk_hbox_new (FALSE, 10);
1128                 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 2);
1129                 gtk_widget_show (hbox);
1130         
1131                 // ---- hbox ----
1132
1133                         text2 = gtk_entry_new_with_max_length(256);
1134                         gtk_entry_set_text((GtkEntry*)text2, "3");
1135                         gtk_box_pack_start (GTK_BOX (hbox), text2, FALSE, FALSE, 2);
1136                         gtk_widget_show (text2);
1137
1138                         w = gtk_label_new ("Multipler");
1139                         gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 2);
1140                         gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_LEFT);
1141                         gtk_widget_show (w);
1142
1143                 // ---- /hbox ----
1144
1145                 w = gtk_label_new ("Path Distance = dist(start -> apex) * multiplier");
1146                 gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 0);
1147                 gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_LEFT);
1148                 gtk_widget_show (w);
1149
1150                 hbox = gtk_hbox_new (FALSE, 10);
1151                 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 2);
1152                 gtk_widget_show (hbox);
1153         
1154                 // ---- hbox ----
1155
1156                         text3 = gtk_entry_new_with_max_length(256);
1157                         gtk_entry_set_text((GtkEntry*)text3, "-800");
1158                         gtk_box_pack_start (GTK_BOX (hbox), text3, FALSE, FALSE, 2);
1159                         gtk_widget_show (text3);
1160
1161                         w = gtk_label_new ("Gravity");
1162                         gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 2);
1163                         gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_LEFT);
1164                         gtk_widget_show (w);
1165
1166                 // ---- /hbox ----
1167         
1168                 w = gtk_hseparator_new();
1169                 gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 0 );
1170                 gtk_widget_show( w );
1171
1172                 check1 = gtk_check_button_new_with_label( "No Dynamic Update" );
1173                 gtk_box_pack_start( GTK_BOX( vbox ), check1, FALSE, FALSE, 0 );
1174                 gtk_widget_show( check1 );
1175
1176                 check2 = gtk_check_button_new_with_label( "Show Bounding Lines" );
1177                 gtk_box_pack_start( GTK_BOX( vbox ), check2, FALSE, FALSE, 0 );
1178                 gtk_widget_show( check2 );
1179
1180         // ---- /vbox ----
1181
1182
1183         // ----------------- //
1184
1185                 w = gtk_hseparator_new();
1186                 gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 0 );
1187                 gtk_widget_show( w );
1188
1189         // ----------------- //
1190
1191                 hbox = gtk_hbox_new( FALSE, 10 );
1192                 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
1193                 gtk_widget_show( hbox );
1194
1195                 w = gtk_button_new_with_label( "Enable" );
1196                 gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0);
1197                 gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( dialog_button_callback ), GINT_TO_POINTER( eIDYES ) );
1198                 gtk_widget_show( w );
1199                 
1200                 GTK_WIDGET_SET_FLAGS( w, GTK_CAN_DEFAULT );
1201                 gtk_widget_grab_default( w );
1202
1203                 w = gtk_button_new_with_label( "Disable" );
1204                 gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0);
1205                 gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( dialog_button_callback ), GINT_TO_POINTER( eIDNO ) );
1206                 gtk_widget_show( w );
1207                 
1208                 w = gtk_button_new_with_label( "Cancel" );
1209                 gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
1210                 gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( dialog_button_callback ), GINT_TO_POINTER( eIDCANCEL ) );
1211                 gtk_widget_show( w );
1212                 
1213                 ret = eIDCANCEL;
1214
1215         // ----------------- //
1216
1217         gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
1218         gtk_widget_show (window);
1219         gtk_grab_add (window);
1220  
1221         bool dialogError = TRUE;
1222         while (dialogError)
1223         {
1224                 loop = 1;
1225                 while (loop)
1226                         gtk_main_iteration ();
1227  
1228                 dialogError = FALSE;
1229
1230                 if(ret == eIDYES)
1231                 {
1232                         if(!ValidateTextIntRange(gtk_entry_get_text(GTK_ENTRY(text1)), 1, 200, "Number Of Points", &rs->nPoints))
1233                                 dialogError = TRUE;
1234
1235                         if(!ValidateTextFloatRange(gtk_entry_get_text(GTK_ENTRY(text2)), 1.0f, 10.0f, "Multiplier", &rs->fMultiplier))
1236                                 dialogError = TRUE;
1237
1238                         if(!ValidateTextFloatRange(gtk_entry_get_text(GTK_ENTRY(text3)), -10000.0f, -1.0f, "Gravity", &rs->fGravity))
1239                                 dialogError = TRUE;
1240
1241                         rs->bNoUpdate = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check1)) ? true : false;
1242                         rs->bShowExtra = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check2)) ? true : false;
1243                 }
1244         }
1245
1246         gtk_grab_remove (window);
1247         gtk_widget_destroy (window);
1248
1249         return ret;
1250 }
1251
1252 EMessageBoxReturn DoCTFColourChangeBox ()
1253 {
1254         GtkWidget *window, *w, *vbox, *hbox;
1255         EMessageBoxReturn ret;
1256   int loop = 1;
1257  
1258         window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1259         
1260         gtk_signal_connect (GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
1261         gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
1262
1263         gtk_window_set_title (GTK_WINDOW (window), "CTF Colour Changer");
1264         gtk_container_border_width (GTK_CONTAINER (window), 10);
1265
1266         g_object_set_data (G_OBJECT (window), "loop", &loop);
1267         g_object_set_data (G_OBJECT (window), "ret", &ret);
1268
1269         gtk_widget_realize (window);
1270  
1271
1272         
1273         vbox = gtk_vbox_new (FALSE, 10);
1274         gtk_container_add (GTK_CONTAINER (window), vbox);
1275         gtk_widget_show (vbox);
1276  
1277         // ---- vbox ----
1278
1279                 hbox = gtk_hbox_new( FALSE, 10 );
1280                 gtk_box_pack_start( GTK_BOX( vbox ), hbox, TRUE, TRUE, 0 );
1281                 gtk_widget_show( hbox );
1282
1283                 // ---- hbox ---- ok/cancel buttons
1284
1285                 w = gtk_button_new_with_label ("Red->Blue");
1286                 gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
1287                 gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (eIDOK));
1288
1289                 GTK_WIDGET_SET_FLAGS (w, GTK_CAN_DEFAULT);
1290                 gtk_widget_grab_default (w);
1291                 gtk_widget_show (w);
1292  
1293                 w = gtk_button_new_with_label ("Blue->Red");
1294                 gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
1295                 gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (eIDYES));
1296                 gtk_widget_show (w);
1297
1298                 w = gtk_button_new_with_label ("Cancel");
1299                 gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
1300                 gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (eIDCANCEL));
1301                 gtk_widget_show (w);
1302                 ret = eIDCANCEL;
1303
1304                 // ---- /hbox ----
1305  
1306         // ---- /vbox ----
1307
1308         gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
1309         gtk_widget_show (window);
1310         gtk_grab_add (window);
1311  
1312         while (loop)
1313                 gtk_main_iteration ();
1314
1315         gtk_grab_remove (window);
1316         gtk_widget_destroy (window);
1317
1318         return ret;
1319 }
1320
1321 EMessageBoxReturn DoResetTextureBox (ResetTextureRS* rs)
1322 {
1323         Str texSelected;
1324
1325         GtkWidget *window, *w, *vbox, *hbox, *frame, *table;
1326
1327         EMessageBoxReturn ret;
1328   int loop = 1;
1329
1330         window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1331         
1332         gtk_signal_connect (GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
1333         gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
1334
1335         gtk_window_set_title (GTK_WINDOW (window), "Texture Reset");
1336         gtk_container_border_width (GTK_CONTAINER (window), 10);
1337
1338         g_object_set_data (G_OBJECT (window), "loop", &loop);
1339         g_object_set_data (G_OBJECT (window), "ret", &ret);
1340
1341         gtk_widget_realize (window);
1342         
1343         vbox = gtk_vbox_new (FALSE, 10);
1344         gtk_container_add (GTK_CONTAINER (window), vbox);
1345         gtk_widget_show (vbox);
1346  
1347         // ---- vbox ----
1348
1349         hbox = gtk_hbox_new (FALSE, 10);
1350         gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 2);
1351         gtk_widget_show (hbox);
1352         
1353         // ---- hbox ----
1354
1355         texSelected = "Currently Selected Texture:   ";
1356   texSelected += GetCurrentTexture();
1357
1358         w = gtk_label_new (texSelected);
1359         gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 2);
1360         gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_LEFT);
1361         gtk_widget_show (w);
1362
1363         // ---- /hbox ----
1364
1365         frame = gtk_frame_new ("Reset Texture Names");
1366     gtk_widget_show (frame);
1367     gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
1368
1369     table = gtk_table_new (2, 3, TRUE);
1370     gtk_widget_show (table);
1371     gtk_container_add (GTK_CONTAINER (frame), table);
1372     gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1373     gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1374     gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1375
1376         // ---- frame ----
1377
1378         dlgTexReset.cbTexChange = gtk_check_button_new_with_label("Enabled");
1379         gtk_signal_connect (GTK_OBJECT (dlgTexReset.cbTexChange), "toggled", GTK_SIGNAL_FUNC (dialog_button_callback_texreset_update), NULL);
1380         gtk_widget_show (dlgTexReset.cbTexChange);
1381         gtk_table_attach (GTK_TABLE (table), dlgTexReset.cbTexChange, 0, 1, 0, 1,
1382                         (GtkAttachOptions) (GTK_FILL),
1383                         (GtkAttachOptions) (0), 0, 0);
1384
1385         w = gtk_label_new ("Old Name: ");
1386         gtk_table_attach (GTK_TABLE (table), w, 1, 2, 0, 1,
1387                                 (GtkAttachOptions) (GTK_FILL),
1388                         (GtkAttachOptions) (0), 0, 0);
1389         gtk_widget_show (w);
1390
1391         dlgTexReset.editTexOld = gtk_entry_new_with_max_length(256);
1392         gtk_entry_set_text(GTK_ENTRY(dlgTexReset.editTexOld), rs->textureName);
1393     gtk_table_attach (GTK_TABLE (table), dlgTexReset.editTexOld, 2, 3, 0, 1,
1394                                 (GtkAttachOptions) (GTK_FILL),
1395                         (GtkAttachOptions) (0), 0, 0);
1396         gtk_widget_show (dlgTexReset.editTexOld);
1397
1398         w = gtk_label_new ("New Name: ");
1399         gtk_table_attach (GTK_TABLE (table), w, 1, 2, 1, 2,
1400                         (GtkAttachOptions) (GTK_FILL),
1401                         (GtkAttachOptions) (0), 0, 0);
1402         gtk_widget_show (w);
1403
1404         dlgTexReset.editTexNew = gtk_entry_new_with_max_length(256);
1405         gtk_entry_set_text(GTK_ENTRY(dlgTexReset.editTexNew), rs->textureName);
1406         gtk_table_attach (GTK_TABLE (table), dlgTexReset.editTexNew, 2, 3, 1, 2,
1407                         (GtkAttachOptions) (GTK_FILL),
1408                         (GtkAttachOptions) (0), 0, 0);
1409         gtk_widget_show (dlgTexReset.editTexNew);
1410
1411         // ---- /frame ----
1412
1413     frame = gtk_frame_new ("Reset Scales");
1414     gtk_widget_show (frame);
1415     gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
1416
1417     table = gtk_table_new (2, 3, TRUE);
1418     gtk_widget_show (table);
1419     gtk_container_add (GTK_CONTAINER (frame), table);
1420     gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1421     gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1422     gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1423
1424         // ---- frame ----
1425
1426         dlgTexReset.cbScaleHor = gtk_check_button_new_with_label("Enabled");
1427         gtk_signal_connect (GTK_OBJECT (dlgTexReset.cbScaleHor), "toggled", GTK_SIGNAL_FUNC (dialog_button_callback_texreset_update), NULL);
1428         gtk_widget_show (dlgTexReset.cbScaleHor);
1429         gtk_table_attach (GTK_TABLE (table), dlgTexReset.cbScaleHor, 0, 1, 0, 1,
1430                         (GtkAttachOptions) (GTK_FILL),
1431                         (GtkAttachOptions) (0), 0, 0);
1432
1433         w = gtk_label_new ("New Horizontal Scale: ");
1434         gtk_table_attach (GTK_TABLE (table), w, 1, 2, 0, 1,
1435                         (GtkAttachOptions) (GTK_FILL),
1436                         (GtkAttachOptions) (0), 0, 0);
1437         gtk_widget_show (w);
1438
1439         dlgTexReset.editScaleHor = gtk_entry_new_with_max_length(256);
1440         gtk_entry_set_text(GTK_ENTRY(dlgTexReset.editScaleHor), "0.5");
1441         gtk_table_attach (GTK_TABLE (table), dlgTexReset.editScaleHor, 2, 3, 0, 1,
1442                         (GtkAttachOptions) (GTK_FILL),
1443                         (GtkAttachOptions) (0), 0, 0);
1444         gtk_widget_show (dlgTexReset.editScaleHor);
1445
1446
1447         dlgTexReset.cbScaleVert = gtk_check_button_new_with_label("Enabled");
1448         gtk_signal_connect (GTK_OBJECT (dlgTexReset.cbScaleVert), "toggled", GTK_SIGNAL_FUNC (dialog_button_callback_texreset_update), NULL);
1449         gtk_widget_show (dlgTexReset.cbScaleVert);
1450         gtk_table_attach (GTK_TABLE (table), dlgTexReset.cbScaleVert, 0, 1, 1, 2,
1451                         (GtkAttachOptions) (GTK_FILL),
1452                         (GtkAttachOptions) (0), 0, 0);
1453
1454         w = gtk_label_new ("New Vertical Scale: ");
1455         gtk_table_attach (GTK_TABLE (table), w, 1, 2, 1, 2,
1456                         (GtkAttachOptions) (GTK_FILL),
1457                         (GtkAttachOptions) (0), 0, 0);
1458         gtk_widget_show (w);
1459
1460         dlgTexReset.editScaleVert = gtk_entry_new_with_max_length(256);
1461         gtk_entry_set_text(GTK_ENTRY(dlgTexReset.editScaleVert), "0.5");
1462         gtk_table_attach (GTK_TABLE (table), dlgTexReset.editScaleVert, 2, 3, 1, 2,
1463                         (GtkAttachOptions) (GTK_FILL),
1464                         (GtkAttachOptions) (0), 0, 0);
1465         gtk_widget_show (dlgTexReset.editScaleVert);
1466
1467         // ---- /frame ----
1468
1469     frame = gtk_frame_new ("Reset Shift");
1470     gtk_widget_show (frame);
1471     gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
1472
1473     table = gtk_table_new (2, 3, TRUE);
1474     gtk_widget_show (table);
1475     gtk_container_add (GTK_CONTAINER (frame), table);
1476     gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1477     gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1478     gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1479
1480                 // ---- frame ----
1481
1482         dlgTexReset.cbShiftHor = gtk_check_button_new_with_label("Enabled");
1483         gtk_signal_connect (GTK_OBJECT (dlgTexReset.cbShiftHor), "toggled", GTK_SIGNAL_FUNC (dialog_button_callback_texreset_update), NULL);
1484         gtk_widget_show (dlgTexReset.cbShiftHor);
1485         gtk_table_attach (GTK_TABLE (table), dlgTexReset.cbShiftHor, 0, 1, 0, 1,
1486                         (GtkAttachOptions) (GTK_FILL),
1487                         (GtkAttachOptions) (0), 0, 0);
1488
1489         w = gtk_label_new ("New Horizontal Shift: ");
1490         gtk_table_attach (GTK_TABLE (table), w, 1, 2, 0, 1,
1491                         (GtkAttachOptions) (GTK_FILL),
1492                         (GtkAttachOptions) (0), 0, 0);
1493         gtk_widget_show (w);
1494
1495         dlgTexReset.editShiftHor = gtk_entry_new_with_max_length(256);
1496         gtk_entry_set_text(GTK_ENTRY(dlgTexReset.editShiftHor), "0");
1497         gtk_table_attach (GTK_TABLE (table), dlgTexReset.editShiftHor, 2, 3, 0, 1,
1498                         (GtkAttachOptions) (GTK_FILL),
1499                         (GtkAttachOptions) (0), 0, 0);
1500         gtk_widget_show (dlgTexReset.editShiftHor);
1501
1502
1503         dlgTexReset.cbShiftVert = gtk_check_button_new_with_label("Enabled");
1504         gtk_signal_connect (GTK_OBJECT (dlgTexReset.cbShiftVert), "toggled", GTK_SIGNAL_FUNC (dialog_button_callback_texreset_update), NULL);
1505         gtk_widget_show (dlgTexReset.cbShiftVert);
1506         gtk_table_attach (GTK_TABLE (table), dlgTexReset.cbShiftVert, 0, 1, 1, 2,
1507                         (GtkAttachOptions) (GTK_FILL),
1508                         (GtkAttachOptions) (0), 0, 0);
1509
1510         w = gtk_label_new ("New Vertical Shift: ");
1511         gtk_table_attach (GTK_TABLE (table), w, 1, 2, 1, 2,
1512                         (GtkAttachOptions) (GTK_FILL),
1513                         (GtkAttachOptions) (0), 0, 0);
1514         gtk_widget_show (w);
1515
1516         dlgTexReset.editShiftVert = gtk_entry_new_with_max_length(256);
1517         gtk_entry_set_text(GTK_ENTRY(dlgTexReset.editShiftVert), "0");
1518         gtk_table_attach (GTK_TABLE (table), dlgTexReset.editShiftVert, 2, 3, 1, 2,
1519                         (GtkAttachOptions) (GTK_FILL),
1520                         (GtkAttachOptions) (0), 0, 0);
1521         gtk_widget_show (dlgTexReset.editShiftVert);
1522
1523         // ---- /frame ----
1524
1525     frame = gtk_frame_new ("Reset Rotation");
1526     gtk_widget_show (frame);
1527     gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
1528
1529     table = gtk_table_new (1, 3, TRUE);
1530     gtk_widget_show (table);
1531     gtk_container_add (GTK_CONTAINER (frame), table);
1532     gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1533     gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1534     gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1535
1536                 // ---- frame ----
1537
1538         dlgTexReset.cbRotation = gtk_check_button_new_with_label("Enabled");
1539         gtk_widget_show (dlgTexReset.cbRotation);
1540         gtk_table_attach (GTK_TABLE (table), dlgTexReset.cbRotation, 0, 1, 0, 1,
1541                         (GtkAttachOptions) (GTK_FILL),
1542                         (GtkAttachOptions) (0), 0, 0);
1543
1544         w = gtk_label_new ("New Rotation Value: ");
1545         gtk_table_attach (GTK_TABLE (table), w, 1, 2, 0, 1,
1546                         (GtkAttachOptions) (GTK_FILL),
1547                         (GtkAttachOptions) (0), 0, 0);
1548         gtk_widget_show (w);
1549
1550         dlgTexReset.editRotation = gtk_entry_new_with_max_length(256);
1551         gtk_entry_set_text(GTK_ENTRY(dlgTexReset.editRotation), "0");
1552         gtk_table_attach (GTK_TABLE (table), dlgTexReset.editRotation, 2, 3, 0, 1,
1553                         (GtkAttachOptions) (GTK_FILL),
1554                         (GtkAttachOptions) (0), 0, 0);
1555         gtk_widget_show (dlgTexReset.editRotation);
1556
1557         // ---- /frame ----
1558
1559         hbox = gtk_hbox_new (FALSE, 10);
1560         gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 2);
1561         gtk_widget_show (hbox);
1562         
1563         // ---- hbox ----
1564
1565         w = gtk_button_new_with_label ("Use Selected Brushes");
1566         gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
1567         gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (eIDOK));
1568
1569         GTK_WIDGET_SET_FLAGS (w, GTK_CAN_DEFAULT);
1570         gtk_widget_grab_default (w);
1571         gtk_widget_show (w);
1572  
1573         w = gtk_button_new_with_label ("Use All Brushes");
1574         gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
1575         gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (eIDYES));
1576         gtk_widget_show (w);
1577
1578         w = gtk_button_new_with_label ("Cancel");
1579         gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
1580         gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (eIDCANCEL));
1581         gtk_widget_show (w);
1582         ret = eIDCANCEL;
1583
1584         // ---- /hbox ----
1585         
1586         // ---- /vbox ----
1587
1588         gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
1589         gtk_widget_show (window);
1590         gtk_grab_add (window);
1591  
1592         Update_TextureReseter();
1593
1594         bool dialogError = TRUE;
1595         while (dialogError)
1596         {
1597                 loop = 1;
1598                 while (loop)
1599                         gtk_main_iteration ();
1600  
1601                 dialogError = FALSE;
1602
1603                 if(ret != eIDCANCEL)
1604                 {
1605                         rs->bResetRotation =  gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( dlgTexReset.cbRotation ));
1606                         if(rs->bResetRotation)
1607                                 if(!ValidateTextInt(gtk_entry_get_text(GTK_ENTRY(dlgTexReset.editRotation)), "Rotation", &rs->rotation))
1608                                         dialogError = TRUE;
1609
1610                         rs->bResetScale[0] =  gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( dlgTexReset.cbScaleHor ));
1611                         if(rs->bResetScale[0])
1612                                 if(!ValidateTextFloat(gtk_entry_get_text(GTK_ENTRY(dlgTexReset.editScaleHor)), "Horizontal Scale", &rs->fScale[0]))
1613                                         dialogError = TRUE;
1614
1615                         rs->bResetScale[1] =  gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( dlgTexReset.cbScaleVert ));
1616                         if(rs->bResetScale[1])
1617                                 if(!ValidateTextFloat(gtk_entry_get_text(GTK_ENTRY(dlgTexReset.editScaleVert)), "Vertical Scale", &rs->fScale[1]))
1618                                         dialogError = TRUE;
1619
1620                         rs->bResetShift[0] =  gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( dlgTexReset.cbShiftHor ));
1621                         if(rs->bResetShift[0])
1622                                 if(!ValidateTextFloat(gtk_entry_get_text(GTK_ENTRY(dlgTexReset.editShiftHor)), "Horizontal Shift", &rs->fShift[0]))
1623                                         dialogError = TRUE;
1624
1625                         rs->bResetShift[1] =  gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( dlgTexReset.cbShiftVert ));
1626                         if(rs->bResetShift[1])
1627                                 if(!ValidateTextFloat(gtk_entry_get_text(GTK_ENTRY(dlgTexReset.editShiftVert)), "Vertical Shift", &rs->fShift[1]))
1628                                         dialogError = TRUE;
1629
1630                         rs->bResetTextureName =  gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( dlgTexReset.cbTexChange ));
1631                         if(rs->bResetTextureName)
1632                         {
1633                                 strcpy(rs->textureName,     gtk_entry_get_text(GTK_ENTRY( dlgTexReset.editTexOld )));
1634                                 strcpy(rs->newTextureName,  gtk_entry_get_text(GTK_ENTRY( dlgTexReset.editTexNew )));
1635                         }
1636                 }
1637         }
1638
1639         gtk_grab_remove (window);
1640         gtk_widget_destroy (window);
1641
1642         return ret;
1643 }
1644
1645 EMessageBoxReturn DoTrainThingBox (TrainThingRS* rs)
1646 {
1647         Str texSelected;
1648
1649         GtkWidget *window, *w, *vbox, *hbox, *frame, *table;
1650
1651         GtkWidget *radiusX, *radiusY;
1652         GtkWidget *angleStart, *angleEnd;
1653         GtkWidget *heightStart, *heightEnd;
1654         GtkWidget *numPoints;
1655
1656         EMessageBoxReturn ret;
1657   int loop = 1;
1658  
1659         window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1660         
1661         gtk_signal_connect (GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
1662         gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
1663
1664         gtk_window_set_title (GTK_WINDOW (window), "Train Thing");
1665         gtk_container_border_width (GTK_CONTAINER (window), 10);
1666
1667         gtk_object_set_data (GTK_OBJECT (window), "loop", &loop);
1668         gtk_object_set_data (GTK_OBJECT (window), "ret", &ret);
1669
1670         gtk_widget_realize (window);
1671         
1672         vbox = gtk_vbox_new (FALSE, 10);
1673         gtk_container_add (GTK_CONTAINER (window), vbox);
1674         gtk_widget_show (vbox);
1675  
1676         // ---- vbox ----
1677
1678         hbox = gtk_hbox_new (FALSE, 10);
1679         gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 2);
1680         gtk_widget_show (hbox);
1681
1682         // ---- /hbox ----
1683
1684         frame = gtk_frame_new ("Radii");
1685     gtk_widget_show (frame);
1686     gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
1687
1688     table = gtk_table_new (2, 3, TRUE);
1689     gtk_widget_show (table);
1690     gtk_container_add (GTK_CONTAINER (frame), table);
1691     gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1692     gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1693     gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1694
1695         // ---- frame ----
1696
1697         w = gtk_label_new ("X: ");
1698         gtk_table_attach (GTK_TABLE (table), w, 0, 1, 0, 1,
1699                                 (GtkAttachOptions) (GTK_FILL),
1700                         (GtkAttachOptions) (0), 0, 0);
1701         gtk_widget_show (w);
1702
1703         radiusX = gtk_entry_new_with_max_length(256);
1704         gtk_entry_set_text(GTK_ENTRY(radiusX), "100");
1705     gtk_table_attach (GTK_TABLE (table), radiusX, 1, 2, 0, 1,
1706                                 (GtkAttachOptions) (GTK_FILL),
1707                         (GtkAttachOptions) (0), 0, 0);
1708         gtk_widget_show (radiusX);
1709
1710
1711
1712         w = gtk_label_new ("Y: ");
1713         gtk_table_attach (GTK_TABLE (table), w, 0, 1, 1, 2,
1714                         (GtkAttachOptions) (GTK_FILL),
1715                         (GtkAttachOptions) (0), 0, 0);
1716         gtk_widget_show (w);
1717
1718         radiusY = gtk_entry_new_with_max_length(256);
1719         gtk_entry_set_text(GTK_ENTRY(radiusY), "100");
1720         gtk_table_attach (GTK_TABLE (table), radiusY, 1, 2, 1, 2,
1721                         (GtkAttachOptions) (GTK_FILL),
1722                         (GtkAttachOptions) (0), 0, 0);
1723         gtk_widget_show (radiusY);
1724
1725
1726
1727         frame = gtk_frame_new ("Angles");
1728     gtk_widget_show (frame);
1729     gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
1730
1731     table = gtk_table_new (2, 3, TRUE);
1732     gtk_widget_show (table);
1733     gtk_container_add (GTK_CONTAINER (frame), table);
1734     gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1735     gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1736     gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1737
1738         // ---- frame ----
1739
1740         w = gtk_label_new ("Start: ");
1741         gtk_table_attach (GTK_TABLE (table), w, 0, 1, 0, 1,
1742                                 (GtkAttachOptions) (GTK_FILL),
1743                         (GtkAttachOptions) (0), 0, 0);
1744         gtk_widget_show (w);
1745
1746         angleStart = gtk_entry_new_with_max_length(256);
1747         gtk_entry_set_text(GTK_ENTRY(angleStart), "0");
1748     gtk_table_attach (GTK_TABLE (table), angleStart, 1, 2, 0, 1,
1749                                 (GtkAttachOptions) (GTK_FILL),
1750                         (GtkAttachOptions) (0), 0, 0);
1751         gtk_widget_show (angleStart);
1752
1753
1754
1755         w = gtk_label_new ("End: ");
1756         gtk_table_attach (GTK_TABLE (table), w, 0, 1, 1, 2,
1757                         (GtkAttachOptions) (GTK_FILL),
1758                         (GtkAttachOptions) (0), 0, 0);
1759         gtk_widget_show (w);
1760
1761         angleEnd = gtk_entry_new_with_max_length(256);
1762         gtk_entry_set_text(GTK_ENTRY(angleEnd), "90");
1763         gtk_table_attach (GTK_TABLE (table), angleEnd, 1, 2, 1, 2,
1764                         (GtkAttachOptions) (GTK_FILL),
1765                         (GtkAttachOptions) (0), 0, 0);
1766         gtk_widget_show (angleEnd);
1767
1768
1769         frame = gtk_frame_new ("Height");
1770     gtk_widget_show (frame);
1771     gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
1772
1773     table = gtk_table_new (2, 3, TRUE);
1774     gtk_widget_show (table);
1775     gtk_container_add (GTK_CONTAINER (frame), table);
1776     gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1777     gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1778     gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1779
1780         // ---- frame ----
1781
1782         w = gtk_label_new ("Start: ");
1783         gtk_table_attach (GTK_TABLE (table), w, 0, 1, 0, 1,
1784                                 (GtkAttachOptions) (GTK_FILL),
1785                         (GtkAttachOptions) (0), 0, 0);
1786         gtk_widget_show (w);
1787
1788         heightStart = gtk_entry_new_with_max_length(256);
1789         gtk_entry_set_text(GTK_ENTRY(heightStart), "0");
1790     gtk_table_attach (GTK_TABLE (table), heightStart, 1, 2, 0, 1,
1791                                 (GtkAttachOptions) (GTK_FILL),
1792                         (GtkAttachOptions) (0), 0, 0);
1793         gtk_widget_show (heightStart);
1794
1795
1796
1797         w = gtk_label_new ("End: ");
1798         gtk_table_attach (GTK_TABLE (table), w, 0, 1, 1, 2,
1799                         (GtkAttachOptions) (GTK_FILL),
1800                         (GtkAttachOptions) (0), 0, 0);
1801         gtk_widget_show (w);
1802
1803         heightEnd = gtk_entry_new_with_max_length(256);
1804         gtk_entry_set_text(GTK_ENTRY(heightEnd), "0");
1805         gtk_table_attach (GTK_TABLE (table), heightEnd, 1, 2, 1, 2,
1806                         (GtkAttachOptions) (GTK_FILL),
1807                         (GtkAttachOptions) (0), 0, 0);
1808         gtk_widget_show (heightEnd);
1809
1810
1811
1812         frame = gtk_frame_new ("Points");
1813     gtk_widget_show (frame);
1814     gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
1815
1816     table = gtk_table_new (2, 3, TRUE);
1817     gtk_widget_show (table);
1818     gtk_container_add (GTK_CONTAINER (frame), table);
1819     gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1820     gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1821     gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1822
1823         // ---- frame ----
1824
1825         w = gtk_label_new ("Number: ");
1826         gtk_table_attach (GTK_TABLE (table), w, 0, 1, 0, 1,
1827                                 (GtkAttachOptions) (GTK_FILL),
1828                         (GtkAttachOptions) (0), 0, 0);
1829         gtk_widget_show (w);
1830
1831         numPoints = gtk_entry_new_with_max_length(256);
1832         gtk_entry_set_text(GTK_ENTRY(numPoints), "0");
1833     gtk_table_attach (GTK_TABLE (table), numPoints, 1, 2, 0, 1,
1834                                 (GtkAttachOptions) (GTK_FILL),
1835                         (GtkAttachOptions) (0), 0, 0);
1836         gtk_widget_show (numPoints);
1837
1838
1839                 hbox = gtk_hbox_new (FALSE, 10);
1840                 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 2);
1841                 gtk_widget_show (hbox);
1842         
1843                 // ---- hbox ----
1844
1845                         w = gtk_button_new_with_label ("Ok");
1846                         gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
1847                         gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (eIDOK));
1848
1849                         GTK_WIDGET_SET_FLAGS (w, GTK_CAN_DEFAULT);
1850                         gtk_widget_grab_default (w);
1851                         gtk_widget_show (w);
1852  
1853                         w = gtk_button_new_with_label ("Cancel");
1854                         gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
1855                         gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (eIDCANCEL));
1856                         gtk_widget_show (w);
1857                         ret = eIDCANCEL;
1858
1859                 // ---- /hbox ----
1860         
1861
1862
1863         gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
1864         gtk_widget_show (window);
1865         gtk_grab_add (window);
1866  
1867         bool dialogError = TRUE;
1868         while (dialogError)
1869         {
1870                 loop = 1;
1871                 while (loop)
1872                         gtk_main_iteration ();
1873  
1874                 dialogError = FALSE;
1875
1876                 if(ret != eIDCANCEL)
1877                 {
1878                         if(!ValidateTextFloat(gtk_entry_get_text(GTK_ENTRY(radiusX)), "Radius (X)", &rs->fRadiusX))
1879                                 dialogError = TRUE;
1880
1881                         if(!ValidateTextFloat(gtk_entry_get_text(GTK_ENTRY(radiusY)), "Radius (Y)", &rs->fRadiusY))
1882                                 dialogError = TRUE;
1883
1884                         if(!ValidateTextFloat(gtk_entry_get_text(GTK_ENTRY(angleStart)), "Angle (Start)", &rs->fStartAngle))
1885                                 dialogError = TRUE;
1886
1887                         if(!ValidateTextFloat(gtk_entry_get_text(GTK_ENTRY(angleEnd)), "Angle (End)", &rs->fEndAngle))
1888                                 dialogError = TRUE;
1889
1890                         if(!ValidateTextFloat(gtk_entry_get_text(GTK_ENTRY(heightStart)), "Height (Start)", &rs->fStartHeight))
1891                                 dialogError = TRUE;
1892
1893                         if(!ValidateTextFloat(gtk_entry_get_text(GTK_ENTRY(heightEnd)), "Height (End)", &rs->fEndHeight))
1894                                 dialogError = TRUE;
1895
1896                         if(!ValidateTextInt(gtk_entry_get_text(GTK_ENTRY(numPoints)), "Num Points", &rs->iNumPoints))
1897                                 dialogError = TRUE;
1898                 }
1899         }
1900
1901         gtk_grab_remove (window);
1902         gtk_widget_destroy (window);
1903
1904         return ret;
1905 }
1906 // ailmanki
1907 // add a simple input for the MakeChain thing..
1908 EMessageBoxReturn DoMakeChainBox(MakeChainRS* rs)
1909 {
1910         GtkWidget       *window, *w, *vbox, *hbox;
1911         GtkWidget       *textlinkNum, *textlinkName;
1912         EMessageBoxReturn ret;
1913         int loop = 1;
1914         
1915         char    *text = "Please set a value in the boxes below and press 'OK' to make a chain";
1916         
1917         window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
1918         
1919         gtk_signal_connect (GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
1920         gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
1921         
1922         gtk_window_set_title( GTK_WINDOW( window ), "Make Chain" );
1923         
1924         gtk_container_border_width( GTK_CONTAINER( window ), 10 );
1925         
1926         g_object_set_data (G_OBJECT (window), "loop", &loop);
1927         g_object_set_data (G_OBJECT (window), "ret", &ret);
1928         
1929         gtk_widget_realize (window);
1930         
1931         // new vbox 
1932         vbox = gtk_vbox_new( FALSE, 10 );
1933         gtk_container_add( GTK_CONTAINER( window ), vbox );
1934         gtk_widget_show( vbox );
1935         
1936         hbox = gtk_hbox_new( FALSE, 10 );
1937         gtk_container_add( GTK_CONTAINER( vbox ), hbox );
1938         gtk_widget_show( hbox );
1939         
1940         // dunno if you want this text or not ...
1941         w = gtk_label_new( text );
1942         gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
1943         gtk_widget_show( w );
1944         
1945         w = gtk_hseparator_new();
1946         gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 0 );
1947         gtk_widget_show( w );
1948         
1949         // ------------------------- // 
1950         
1951         // new hbox
1952         hbox = gtk_hbox_new( FALSE, 10 );
1953         gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
1954         gtk_widget_show( hbox );
1955         
1956         textlinkNum = gtk_entry_new_with_max_length( 256 ); 
1957         gtk_box_pack_start( GTK_BOX( hbox ), textlinkNum, FALSE, FALSE, 1 );
1958         gtk_widget_show( textlinkNum );
1959         
1960         w = gtk_label_new( "Number of elements in chain" );
1961         gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 1 );
1962         gtk_widget_show( w );
1963         
1964         // -------------------------- //
1965         
1966         hbox = gtk_hbox_new( FALSE, 10 );
1967         gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
1968         gtk_widget_show( hbox );
1969         
1970         textlinkName = gtk_entry_new_with_max_length( 256 );
1971         gtk_box_pack_start( GTK_BOX( hbox ), textlinkName, FALSE, FALSE, 0 );
1972         gtk_widget_show( textlinkName );
1973         
1974         w = gtk_label_new( "Basename for chain's targetnames." );
1975         gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 1 );
1976         gtk_widget_show( w );
1977         
1978         
1979         w = gtk_button_new_with_label( "OK" );
1980         gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0);
1981         gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( dialog_button_callback ), GINT_TO_POINTER( eIDOK ) );
1982         GTK_WIDGET_SET_FLAGS( w, GTK_CAN_DEFAULT );
1983         gtk_widget_grab_default( w );
1984         gtk_widget_show( w );
1985         
1986         w = gtk_button_new_with_label( "Cancel" );
1987         gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
1988         gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( dialog_button_callback ), GINT_TO_POINTER( eIDCANCEL ) );
1989         gtk_widget_show( w );
1990         
1991         ret = eIDCANCEL;
1992
1993         gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
1994         gtk_widget_show (window);
1995         gtk_grab_add (window);
1996         
1997         bool dialogError = TRUE;
1998         while (dialogError)
1999         {
2000                 loop = 1;
2001                 while (loop)
2002                         gtk_main_iteration ();
2003                 
2004                 dialogError = FALSE;
2005                 
2006                 if(ret == eIDOK)
2007                 {
2008                         strcpy(rs->linkName, gtk_entry_get_text((GtkEntry*)textlinkName));
2009                         if(!ValidateTextInt(gtk_entry_get_text((GtkEntry*)textlinkNum), "Elements", &rs->linkNum))
2010                                 dialogError = TRUE;
2011                 }
2012         }
2013         
2014         gtk_grab_remove (window);
2015         gtk_widget_destroy (window);
2016         
2017         return ret;
2018 }