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