1 /**********************************************************************
2 Freeciv - Copyright (C) 1996 - A Kjeldberg, L Gregersen, P Unold
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License as published by
5 the Free Software Foundation; either version 2, or (at your option)
6 any later version.
7
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 GNU General Public License for more details.
12 ***********************************************************************/
13
14 #ifdef HAVE_CONFIG_H
15 #include <fc_config.h>
16 #endif
17
18 #include <stdio.h>
19 #include <stdlib.h>
20
21 #include <X11/Intrinsic.h>
22 #include <X11/StringDefs.h>
23 #include <X11/Xaw/Form.h>
24 #include <X11/Xaw/Label.h>
25 #include <X11/Xaw/Command.h>
26 #include <X11/Xaw/SimpleMenu.h>
27 #include <X11/Xaw/Scrollbar.h>
28 #include <X11/Xaw/Toggle.h>
29
30 /* common & utility */
31 #include "fcintl.h"
32 #include "government.h"
33 #include "packets.h"
34 #include "player.h"
35 #include "shared.h"
36 #include "support.h"
37
38 /* client */
39 #include "client_main.h"
40
41 #include "gui_main.h"
42 #include "gui_stuff.h"
43 #include "mapview.h"
44
45 #include "ratesdlg.h"
46
47 /******************************************************************/
48 static Widget rates_dialog_shell;
49 static Widget rates_gov_label;
50 static Widget rates_tax_label, rates_tax_scroll, rates_tax_toggle;
51 static Widget rates_lux_label, rates_lux_scroll, rates_lux_toggle;
52 static Widget rates_sci_label, rates_sci_scroll, rates_sci_toggle;
53 /******************************************************************/
54
55 static int rates_tax_value, rates_lux_value, rates_sci_value;
56
57 void create_rates_dialog(void);
58
59 void rates_cancel_command_callback(Widget w, XtPointer client_data,
60 XtPointer call_data);
61 void rates_ok_command_callback(Widget w, XtPointer client_data,
62 XtPointer call_data);
63
64
65
66 void rates_scroll_jump_callback(Widget w, XtPointer client_data,
67 XtPointer percent_ptr);
68 void rates_scroll_scroll_callback(Widget w, XtPointer client_data,
69 XtPointer position_val);
70
71 void rates_set_values(int tax, int no_tax_scroll,
72 int lux, int no_lux_scroll,
73 int sci, int no_sci_scroll);
74
75 /****************************************************************
76 ...
77 *****************************************************************/
popup_rates_dialog(void)78 void popup_rates_dialog(void)
79 {
80 Position x, y;
81 Dimension width, height;
82 char buf[64];
83
84 if (!can_client_issue_orders()) {
85 return;
86 }
87
88 XtSetSensitive(main_form, FALSE);
89
90 create_rates_dialog();
91
92 XtVaGetValues(toplevel, XtNwidth, &width, XtNheight, &height, NULL);
93
94 XtTranslateCoords(toplevel, (Position) width/10, (Position) height/10,
95 &x, &y);
96 XtVaSetValues(rates_dialog_shell, XtNx, x, XtNy, y, NULL);
97
98 fc_snprintf(buf, sizeof(buf), _("%s max rate: %d%%"),
99 government_name_for_player(client.conn.playing),
100 get_player_bonus(client.conn.playing, EFT_MAX_RATES));
101 xaw_set_label(rates_gov_label, buf);
102
103 XtPopup(rates_dialog_shell, XtGrabNone);
104 }
105
106
107 /****************************************************************
108 ...
109 *****************************************************************/
create_rates_dialog(void)110 void create_rates_dialog(void)
111 {
112 Widget rates_form;
113 Widget rates_ok_command, rates_cancel_command;
114
115 if (!can_client_issue_orders()) {
116 return;
117 }
118
119 rates_dialog_shell =
120 I_T(XtCreatePopupShell("ratespopup", transientShellWidgetClass,
121 toplevel, NULL, 0));
122
123 rates_form = XtVaCreateManagedWidget("ratesform",
124 formWidgetClass,
125 rates_dialog_shell, NULL);
126
127 I_L(XtVaCreateManagedWidget("rateslabel", labelWidgetClass,
128 rates_form, NULL));
129
130 rates_gov_label = XtVaCreateManagedWidget("ratesgovlabel",
131 labelWidgetClass,
132 rates_form, NULL);
133
134 rates_tax_label = XtVaCreateManagedWidget("ratestaxlabel",
135 labelWidgetClass,
136 rates_form, NULL);
137
138 rates_tax_scroll = XtVaCreateManagedWidget("ratestaxscroll",
139 scrollbarWidgetClass,
140 rates_form,
141 NULL);
142
143 rates_tax_toggle = I_L(XtVaCreateManagedWidget("ratestaxtoggle",
144 toggleWidgetClass,
145 rates_form,
146 NULL));
147
148 rates_lux_label = XtVaCreateManagedWidget("ratesluxlabel",
149 labelWidgetClass,
150 rates_form, NULL);
151
152 rates_lux_scroll = XtVaCreateManagedWidget("ratesluxscroll",
153 scrollbarWidgetClass,
154 rates_form,
155 NULL);
156
157 rates_lux_toggle = I_L(XtVaCreateManagedWidget("ratesluxtoggle",
158 toggleWidgetClass,
159 rates_form,
160 NULL));
161
162 rates_sci_label = XtVaCreateManagedWidget("ratesscilabel",
163 labelWidgetClass,
164 rates_form, NULL);
165
166 rates_sci_scroll = XtVaCreateManagedWidget("ratessciscroll",
167 scrollbarWidgetClass,
168 rates_form,
169 NULL);
170
171 rates_sci_toggle = I_L(XtVaCreateManagedWidget("ratesscitoggle",
172 toggleWidgetClass,
173 rates_form,
174 NULL));
175
176 rates_ok_command = I_L(XtVaCreateManagedWidget("ratesokcommand",
177 commandWidgetClass,
178 rates_form,
179 NULL));
180
181 rates_cancel_command = I_L(XtVaCreateManagedWidget("ratescancelcommand",
182 commandWidgetClass,
183 rates_form,
184 NULL));
185
186 XtAddCallback(rates_ok_command, XtNcallback,
187 rates_ok_command_callback, NULL);
188 XtAddCallback(rates_cancel_command, XtNcallback,
189 rates_cancel_command_callback, NULL);
190
191 XtAddCallback(rates_tax_scroll, XtNjumpProc,
192 rates_scroll_jump_callback, NULL);
193 XtAddCallback(rates_tax_scroll, XtNscrollProc,
194 rates_scroll_scroll_callback, NULL);
195
196
197 XtAddCallback(rates_lux_scroll, XtNjumpProc,
198 rates_scroll_jump_callback, NULL);
199 XtAddCallback(rates_lux_scroll, XtNscrollProc,
200 rates_scroll_scroll_callback, NULL);
201
202
203 XtAddCallback(rates_sci_scroll, XtNjumpProc,
204 rates_scroll_jump_callback, NULL);
205 XtAddCallback(rates_sci_scroll, XtNscrollProc,
206 rates_scroll_scroll_callback, NULL);
207
208 XtRealizeWidget(rates_dialog_shell);
209
210
211 rates_tax_value=-1;
212 rates_lux_value=-1;
213 rates_sci_value=-1;
214
215 rates_set_values(client.conn.playing->economic.tax, 0,
216 client.conn.playing->economic.luxury, 0,
217 client.conn.playing->economic.science, 0);
218 }
219
220
221
222
223
224 /**************************************************************************
225 ...
226 **************************************************************************/
rates_ok_command_callback(Widget w,XtPointer client_data,XtPointer call_data)227 void rates_ok_command_callback(Widget w, XtPointer client_data,
228 XtPointer call_data)
229 {
230 XtSetSensitive(main_form, TRUE);
231 XtDestroyWidget(rates_dialog_shell);
232
233 dsend_packet_player_rates(&client.conn, rates_tax_value, rates_lux_value,
234 rates_sci_value);
235 }
236
237 /**************************************************************************
238 ...
239 **************************************************************************/
rates_cancel_command_callback(Widget w,XtPointer client_data,XtPointer call_data)240 void rates_cancel_command_callback(Widget w, XtPointer client_data,
241 XtPointer call_data)
242 {
243 XtSetSensitive(main_form, TRUE);
244
245 XtDestroyWidget(rates_dialog_shell);
246 }
247
248
249
250
251 /**************************************************************************
252 ...
253 **************************************************************************/
rates_set_values(int tax,int no_tax_scroll,int lux,int no_lux_scroll,int sci,int no_sci_scroll)254 void rates_set_values(int tax, int no_tax_scroll,
255 int lux, int no_lux_scroll,
256 int sci, int no_sci_scroll)
257 {
258 char buf[64];
259 Boolean tax_lock, lux_lock, sci_lock;
260 int maxrate;
261
262 if (!can_client_issue_orders()) {
263 return;
264 }
265
266 XtVaGetValues(rates_tax_toggle, XtNstate, &tax_lock, NULL);
267 XtVaGetValues(rates_lux_toggle, XtNstate, &lux_lock, NULL);
268 XtVaGetValues(rates_sci_toggle, XtNstate, &sci_lock, NULL);
269
270 maxrate = get_player_bonus(client.conn.playing, EFT_MAX_RATES);
271 /* This's quite a simple-minded "double check".. */
272 tax=MIN(tax, maxrate);
273 lux=MIN(lux, maxrate);
274 sci=MIN(sci, maxrate);
275
276 if(tax+sci+lux!=100) {
277 if(tax!=rates_tax_value) {
278 if(!lux_lock)
279 lux=MIN(MAX(100-tax-sci, 0), maxrate);
280 if(!sci_lock)
281 sci=MIN(MAX(100-tax-lux, 0), maxrate);
282 }
283 else if(lux!=rates_lux_value) {
284 if(!tax_lock)
285 tax=MIN(MAX(100-lux-sci, 0), maxrate);
286 if(!sci_lock)
287 sci=MIN(MAX(100-lux-tax, 0), maxrate);
288 }
289 else if(sci!=rates_sci_value) {
290 if(!lux_lock)
291 lux=MIN(MAX(100-tax-sci, 0), maxrate);
292 if(!tax_lock)
293 tax=MIN(MAX(100-lux-sci, 0), maxrate);
294 }
295
296 if(tax+sci+lux!=100) {
297 lux=rates_lux_value;
298 sci=rates_sci_value;
299 tax=rates_tax_value;
300 rates_tax_value=-1;
301 rates_lux_value=-1;
302 rates_sci_value=-1;
303 no_tax_scroll=0;
304 no_lux_scroll=0;
305 no_sci_scroll=0;
306 }
307
308 }
309
310 if(tax!=rates_tax_value) {
311 fc_snprintf(buf, sizeof(buf), _("Tax: %d%%"), tax);
312 xaw_set_label(rates_tax_label, buf);
313 if(!no_tax_scroll)
314 XawScrollbarSetThumb(rates_tax_scroll, (tax/10)*1/11.0f, 1/11.0f);
315 rates_tax_value=tax;
316 }
317
318 if(lux!=rates_lux_value) {
319 fc_snprintf(buf, sizeof(buf), _("Luxury: %d%%"), lux);
320 xaw_set_label(rates_lux_label, buf);
321 if(!no_lux_scroll)
322 XawScrollbarSetThumb(rates_lux_scroll, (lux/10)*1/11.0f, 1/11.0f);
323 rates_lux_value=lux;
324 }
325
326 if(sci!=rates_sci_value) {
327 fc_snprintf(buf, sizeof(buf), _("Science: %d%%"), sci);
328 xaw_set_label(rates_sci_label, buf);
329 if(!no_sci_scroll)
330 XawScrollbarSetThumb(rates_sci_scroll, (sci/10)*1/11.0f, 1/11.0f);
331 rates_sci_value=sci;
332 }
333
334 }
335
336
337 /**************************************************************************
338 ...
339 **************************************************************************/
rates_scroll_jump_callback(Widget w,XtPointer client_data,XtPointer percent_ptr)340 void rates_scroll_jump_callback(Widget w, XtPointer client_data,
341 XtPointer percent_ptr)
342 {
343 float percent=*(float*)percent_ptr;
344
345 if(w==rates_tax_scroll) {
346 int tax_value;
347 tax_value=10*(int)(11*percent);
348 tax_value=MIN(tax_value, 100);
349 rates_set_values(tax_value,1, rates_lux_value,0, rates_sci_value,0);
350 }
351 else if(w==rates_lux_scroll) {
352 int lux_value;
353 lux_value=10*(int)(11*percent);
354 lux_value=MIN(lux_value, 100);
355 rates_set_values(rates_tax_value,0, lux_value,1, rates_sci_value,0);
356 }
357 else {
358 int sci_value;
359 sci_value=10*(int)(11*percent);
360 sci_value=MIN(sci_value, 100);
361 rates_set_values(rates_tax_value,0, rates_lux_value,0, sci_value,1);
362 }
363
364 }
365
366
367 /**************************************************************************
368 ...
369 **************************************************************************/
rates_scroll_scroll_callback(Widget w,XtPointer client_data,XtPointer position_val)370 void rates_scroll_scroll_callback(Widget w, XtPointer client_data,
371 XtPointer position_val)
372 {
373 int val, pos = XTPOINTER_TO_INT(position_val);
374
375 if(w==rates_tax_scroll) {
376 if(pos<0)
377 val=MAX(rates_tax_value-10, 0);
378 else
379 val=MIN(rates_tax_value+10, 100);
380 rates_set_values(val,0, rates_lux_value,0, rates_sci_value,0);
381 }
382 else if(w==rates_lux_scroll) {
383 if(pos<0)
384 val=MAX(rates_lux_value-10, 0);
385 else
386 val=MIN(rates_lux_value+10, 100);
387 rates_set_values(rates_tax_value,0, val,0, rates_sci_value,0);
388 }
389 else {
390 if(pos<0)
391 val=MAX(rates_sci_value-10, 0);
392 else
393 val=MIN(rates_sci_value+10, 100);
394 rates_set_values(rates_tax_value,0, rates_lux_value,0, val,0);
395 }
396 }
397
398 /**************************************************************************
399 Update multipliers (policies) dialog.
400 **************************************************************************/
real_multipliers_dialog_update(void * unused)401 void real_multipliers_dialog_update(void *unused)
402 {
403 /* FIXME */
404 }
405