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