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