1 #ifdef HAVE_CONFIG_H
2 #  include <config.h>
3 #endif
4 
5 #include <gtk/gtk.h>
6 #include <stdlib.h>
7 #include <string.h>
8 
9 #include "callbacks.h"
10 #include "interface.h"
11 #include "support.h"
12 #include "parser.h"
13 #include "misc.h"
14 
15 extern GtkWidget *window;
16 
17 extern List *unitlib[2][CLASS_COUNT];
18 extern List *trplib[2];
19 extern List *reinf[2][SCEN_COUNT];
20 extern int cur_scen, cur_player, cur_class, cur_unit, cur_trp;
21 extern int cur_pin, cur_reinf;
22 extern char *unit_classes[];
23 extern char *scenarios[];
24 
25 void
on_file_activate(GtkMenuItem * menuitem,gpointer user_data)26 on_file_activate                       (GtkMenuItem     *menuitem,
27                                         gpointer         user_data)
28 {
29 
30 }
31 
32 
33 void
on_load_activate(GtkMenuItem * menuitem,gpointer user_data)34 on_load_activate                       (GtkMenuItem     *menuitem,
35                                         gpointer         user_data)
36 {
37     load_reinf();
38 }
39 
40 
41 void
on_save_activate(GtkMenuItem * menuitem,gpointer user_data)42 on_save_activate                       (GtkMenuItem     *menuitem,
43                                         gpointer         user_data)
44 {
45     save_reinf();
46 }
47 
48 
49 void
on_build_activate(GtkMenuItem * menuitem,gpointer user_data)50 on_build_activate                      (GtkMenuItem     *menuitem,
51                                         gpointer         user_data)
52 {
53     save_reinf();
54     build_reinf();
55 }
56 
57 
58 void
on_quit_activate(GtkMenuItem * menuitem,gpointer user_data)59 on_quit_activate                       (GtkMenuItem     *menuitem,
60                                         gpointer         user_data)
61 {
62     finalize();
63     gtk_exit( 0 );
64 }
65 
66 
67 void
on_scenarios_select_row(GtkCList * clist,gint row,gint column,GdkEvent * event,gpointer user_data)68 on_scenarios_select_row                (GtkCList        *clist,
69                                         gint             row,
70                                         gint             column,
71                                         GdkEvent        *event,
72                                         gpointer         user_data)
73 {
74     gchar aux[64];
75     GtkWidget *widget = lookup_widget( window, "add_label" );
76     if ( widget ) {
77         snprintf( aux, 64, "Add Unit For %s", scenarios[row] );
78         gtk_label_set_text( GTK_LABEL(widget), aux );
79     }
80     cur_scen = row; cur_reinf = -1;
81     update_reinf_list( cur_scen, cur_player );
82 }
83 
84 
85 void
on_players_changed(GtkEditable * editable,gpointer user_data)86 on_players_changed                     (GtkEditable     *editable,
87                                         gpointer         user_data)
88 {
89     gchar *text = gtk_editable_get_chars( editable, 0, -1 );
90     if ( STRCMP( text, "Axis" ) )
91         cur_player = AXIS;
92     else
93         cur_player = ALLIES;
94     cur_reinf = -1; cur_unit = -1; cur_trp = -1;
95     update_unit_list( cur_player, cur_class );
96     update_trp_list( cur_player );
97     update_reinf_list( cur_scen, cur_player );
98     g_free( text );
99 }
100 
101 
102 void
on_classes_changed(GtkEditable * editable,gpointer user_data)103 on_classes_changed                     (GtkEditable     *editable,
104                                         gpointer         user_data)
105 {
106     int i;
107     gchar *text = gtk_editable_get_chars( editable, 0, -1 );
108     for ( i = 0; i < CLASS_COUNT; i++ )
109         if ( STRCMP( text, unit_classes[i * 2 + 1] ) ) {
110             cur_class = i;
111             cur_unit = -1;
112             update_unit_list( cur_player, cur_class );
113         }
114     g_free( text );
115 }
116 
117 
118 void
on_units_select_row(GtkCList * clist,gint row,gint column,GdkEvent * event,gpointer user_data)119 on_units_select_row                    (GtkCList        *clist,
120                                         gint             row,
121                                         gint             column,
122                                         GdkEvent        *event,
123                                         gpointer         user_data)
124 {
125     cur_unit = row;
126 }
127 
128 
129 void
on_transporters_select_row(GtkCList * clist,gint row,gint column,GdkEvent * event,gpointer user_data)130 on_transporters_select_row             (GtkCList        *clist,
131                                         gint             row,
132                                         gint             column,
133                                         GdkEvent        *event,
134                                         gpointer         user_data)
135 {
136     cur_trp = row;
137 }
138 
139 void
on_add_clicked(GtkButton * button,gpointer user_data)140 on_add_clicked                         (GtkButton       *button,
141                                         gpointer         user_data)
142 {
143     GtkWidget *widget;
144     GtkEditable *editable;
145     gchar *text;
146     UnitLib_Entry *entry, *trp_entry = 0;
147     Unit *unit;
148     if ( cur_unit == -1 )
149         return;
150     unit = calloc( 1, sizeof( Unit ) );
151     if ( unit ) {
152         unit->delay = 1; unit->str = 10; unit->exp = 0;
153         /* pin */
154         unit->pin = cur_pin++;
155         /* id */
156         entry = list_get( unitlib[cur_player][cur_class], cur_unit );
157         unit->uid = entry->nid;
158         strcpy_lt( unit->id, entry->id, 7 );
159         /* trsp id */
160         if ( cur_trp > 0 ) {
161             trp_entry = list_get( trplib[cur_player], cur_trp );
162             unit->tid = trp_entry->nid;
163             strcpy_lt( unit->trp, trp_entry->id, 7 );
164         }
165         else {
166             unit->tid = -1;
167             strcpy( unit->trp, "none" );
168         }
169         /* delay */
170         if ( ( widget = lookup_widget( window, "delay" ) ) )
171             unit->delay = gtk_spin_button_get_value_as_int( GTK_SPIN_BUTTON( widget ) );
172         /* strength */
173         if ( ( widget = lookup_widget( window, "strength" ) ) ) {
174             editable = GTK_EDITABLE( GTK_COMBO(widget)->entry );
175             text = gtk_editable_get_chars( editable, 0, -1 );
176             unit->str = atoi( text );
177             g_free( text );
178         }
179         /* experience */
180         if ( ( widget = lookup_widget( window, "exp" ) ) ) {
181             editable = GTK_EDITABLE( GTK_COMBO(widget)->entry );
182             text = gtk_editable_get_chars( editable, 0, -1 );
183             unit->exp = atoi( text );
184             g_free( text );
185         }
186         /* nation (-1 == auto) */
187         unit->nation = -1;
188         /* build info string */
189         build_unit_info( unit, cur_player );
190         /* save list settings to restore from reinf list */
191         unit->class_id = cur_class;
192         unit->unit_id = cur_unit;
193         unit->trp_id = cur_trp;
194         /* add */
195         insert_reinf_unit( unit, cur_player, cur_scen );
196         update_reinf_list( cur_scen, cur_player );
197     }
198 }
199 
200 
201 void
on_remove_clicked(GtkButton * button,gpointer user_data)202 on_remove_clicked                      (GtkButton       *button,
203                                         gpointer         user_data)
204 {
205     if ( cur_reinf == -1 ) return;
206     list_delete_pos( reinf[cur_player][cur_scen], cur_reinf );
207     update_reinf_list( cur_scen, cur_player );
208     cur_reinf = -1;
209 }
210 
211 void
on_reinforcements_select_row(GtkCList * clist,gint row,gint column,GdkEvent * event,gpointer user_data)212 on_reinforcements_select_row           (GtkCList        *clist,
213                                         gint             row,
214                                         gint             column,
215                                         GdkEvent        *event,
216                                         gpointer         user_data)
217 {
218     GtkWidget *widget;
219     Unit *unit;
220     int pin, i;
221     gchar *text, *hash;
222     gchar aux[16];
223     gtk_clist_get_text( clist, row, 0, &text );
224     hash = strrchr( text, '#' ); hash++;
225     pin = atoi( hash ); i = 0; cur_reinf = -1;
226     list_reset( reinf[cur_player][cur_scen] );
227     while ( ( unit = list_next( reinf[cur_player][cur_scen] ) ) ) {
228         if ( unit->pin == pin ) {
229             cur_reinf = i;
230             /* set unit class */
231             if ( ( widget = lookup_widget( window, "classes" ) ) ) {
232                 cur_class = unit->class_id;
233                 gtk_entry_set_text(
234                     GTK_ENTRY( GTK_COMBO(widget)->entry ),
235                     unit_classes[unit->class_id * 2 + 1] );
236                 update_unit_list( cur_player, cur_class );
237             }
238             /* set unit type */
239             if ( ( widget = lookup_widget( window, "units" ) ) )
240                 gtk_clist_select_row( GTK_CLIST(widget), unit->unit_id, 0 );
241             /* set transporter type */
242             if ( unit->trp_id == -1 ) unit->trp_id = 0;
243             if ( ( widget = lookup_widget( window, "transporters" ) ) )
244                 gtk_clist_select_row( GTK_CLIST(widget), unit->trp_id, 0 );
245             /* set delay, strength ,experience */
246             if ( ( widget = lookup_widget( window, "delay" ) ) ) {
247                 gtk_spin_button_set_value( GTK_SPIN_BUTTON(widget), unit->delay );
248             }
249             if ( ( widget = lookup_widget( window, "strength" ) ) ) {
250                 sprintf( aux, "%i", unit->str );
251                 gtk_entry_set_text(
252                     GTK_ENTRY( GTK_COMBO(widget)->entry ), aux );
253             }
254             if ( ( widget = lookup_widget( window, "exp" ) ) ) {
255                 sprintf( aux, "%i", unit->exp );
256                 gtk_entry_set_text(
257                     GTK_ENTRY( GTK_COMBO(widget)->entry ), aux );
258             }
259             break;
260         }
261         i++;
262     }
263 }
264 
265 gboolean
on_reinforcements_key_press_event(GtkWidget * widget,GdkEventKey * event,gpointer user_data)266 on_reinforcements_key_press_event      (GtkWidget       *widget,
267                                         GdkEventKey     *event,
268                                         gpointer         user_data)
269 {
270     if ( cur_reinf == -1 ) return FALSE;
271     list_delete_pos( reinf[cur_player][cur_scen], cur_reinf );
272     update_reinf_list( cur_scen, cur_player );
273     cur_reinf = -1;
274     return FALSE;
275 }
276 
277 
278 void
on_replace_clicked(GtkButton * button,gpointer user_data)279 on_replace_clicked                     (GtkButton       *button,
280                                         gpointer         user_data)
281 {
282     if ( cur_reinf == -1 ) return;
283     list_delete_pos( reinf[cur_player][cur_scen], cur_reinf );
284     on_add_clicked( 0, 0 );
285     update_reinf_list( cur_scen, cur_player );
286     cur_reinf = -1;
287 }
288 
289 void
on_window_destroy(GtkObject * object,gpointer user_data)290 on_window_destroy                      (GtkObject       *object,
291                                         gpointer         user_data)
292 {
293     finalize();
294     gtk_exit( 0 );
295 }
296