1
/* $Id: weather-config.c 2366 2007-01-15 19:10:23Z nick $
3
* Copyright (c) 2003-2007 Xfce Development Team
5
* This program is free software; you can redistribute it and/or modify
6
* it under the terms of the GNU General Public License as published by
7
* the Free Software Foundation; either version 2 of the License, or
8
* (at your option) any later version.
10
* This program 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
13
* GNU Library General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with this program; if not, write to the Free Software
17
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
25
#include <libxfcegui4/libxfcegui4.h>
27
#include "weather-parsers.h"
28
#include "weather-data.h"
31
#include "weather-config.h"
32
#include "weather-search.h"
37
const static labeloption labeloptions[OPTIONS_N] = {
38
{N_("Windchill (F)"), FLIK},
39
{N_("Temperature (T)"), TEMP},
40
{N_("Atmosphere pressure (P)"), BAR_R},
41
{N_("Atmosphere state (P)"), BAR_D},
42
{N_("Wind speed (WS)"), WIND_SPEED},
43
{N_("Wind gust (WG)"), WIND_GUST},
44
{N_("Wind direction (WD)"), WIND_DIRECTION},
45
{N_("Humidity (H)"), HMID},
46
{N_("Visibility (V)"), VIS},
47
{N_("UV Index (UV)"), UV_INDEX},
48
{N_("Dewpoint (DP)"), DEWP},
51
typedef void (*cb_function) (xfceweather_data *);
52
static cb_function cb = NULL;
55
add_mdl_option (GtkListStore *mdl,
60
gtk_list_store_append (mdl, &iter);
61
gtk_list_store_set (mdl, &iter,
62
0, _(labeloptions[opt].name),
63
1, labeloptions[opt].number, -1);
69
cb_addoption (GtkWidget *widget,
72
xfceweather_dialog *dialog;
75
dialog = (xfceweather_dialog *) data;
76
history = gtk_option_menu_get_history (GTK_OPTION_MENU (dialog->opt_xmloption));
78
add_mdl_option (dialog->mdl_xmloption, history);
86
cb_deloption (GtkWidget *widget,
89
xfceweather_dialog *dialog = (xfceweather_dialog *) data;
91
GtkTreeSelection *selection;
93
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (dialog->lst_xmloption));
95
if (gtk_tree_selection_get_selected (selection, NULL, &iter))
96
gtk_list_store_remove (GTK_LIST_STORE (dialog->mdl_xmloption), &iter);
104
cb_toggle (GtkWidget *widget,
107
GtkWidget *target = (GtkWidget *) data;
109
gtk_widget_set_sensitive (target,
110
gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
119
cb_not_toggle (GtkWidget *widget,
122
GtkWidget *target = (GtkWidget *) data;
124
gtk_widget_set_sensitive (target,
125
!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
137
GtkWidget *widget, *menu;
139
menu = gtk_menu_new ();
140
widget = gtk_option_menu_new ();
142
for (i = 0; i < 11; i++)
144
labeloption opt = labeloptions[i];
146
gtk_menu_shell_append (GTK_MENU_SHELL (menu),
147
gtk_menu_item_new_with_label (_(opt.name)));
150
gtk_option_menu_set_menu (GTK_OPTION_MENU (widget), menu);
158
apply_options (xfceweather_dialog *dialog)
161
gboolean hasiter = FALSE;
165
GValue value = { 0, };
167
xfceweather_data *data = (xfceweather_data *) dialog->wd;
169
history = gtk_option_menu_get_history (GTK_OPTION_MENU (dialog->opt_unit));
172
data->unit = IMPERIAL;
176
if (data->location_code)
177
g_free (data->location_code);
179
data->location_code =
180
g_strdup (gtk_entry_get_text (GTK_ENTRY (dialog->txt_loc_code)));
182
/* call labels_clear() here */
183
if (data->labels && data->labels->len > 0)
184
g_array_free (data->labels, TRUE);
186
data->labels = g_array_new (FALSE, TRUE, sizeof (datas));
189
gtk_tree_model_get_iter_first (GTK_TREE_MODEL (dialog->mdl_xmloption),
190
&iter); hasiter == TRUE;
192
gtk_tree_model_iter_next (GTK_TREE_MODEL (dialog->mdl_xmloption),
195
gtk_tree_model_get_value (GTK_TREE_MODEL (dialog->mdl_xmloption), &iter,
197
option = g_value_get_int (&value);
198
g_array_append_val (data->labels, option);
199
g_value_unset (&value);
202
if (data->proxy_host)
204
g_free (data->proxy_host);
205
data->proxy_host = NULL;
208
if (!gtk_toggle_button_get_active
209
(GTK_TOGGLE_BUTTON (dialog->chk_proxy_use)))
210
data->proxy_fromenv = FALSE;
212
if (gtk_toggle_button_get_active
213
(GTK_TOGGLE_BUTTON (dialog->chk_proxy_fromenv)))
215
data->proxy_fromenv = TRUE;
216
check_envproxy (&data->proxy_host, &data->proxy_port);
218
else /* use provided proxy settings */
220
data->proxy_fromenv = FALSE;
222
g_strdup (gtk_entry_get_text (GTK_ENTRY (dialog->txt_proxy_host)));
224
if (strlen (text) == 0)
226
xfce_err (_("Please enter proxy settings"));
227
gtk_widget_grab_focus (dialog->txt_proxy_host);
231
data->proxy_host = g_strdup (text);
233
gtk_spin_button_get_value (GTK_SPIN_BUTTON (dialog->txt_proxy_port));
235
if (data->saved_proxy_host)
236
g_free (data->saved_proxy_host);
238
data->saved_proxy_host = g_strdup (text);
239
data->saved_proxy_port = data->proxy_port;
255
for (i = 0; i < OPTIONS_N; i++)
257
if (labeloptions[i].number == opt)
267
cb_findlocation (GtkButton *button,
270
xfceweather_dialog *dialog = (xfceweather_dialog *) user_data;
271
search_dialog *sdialog;
273
sdialog = create_search_dialog (NULL,
274
dialog->wd->proxy_host,
275
dialog->wd->proxy_port);
277
if (run_search_dialog (sdialog))
278
gtk_entry_set_text (GTK_ENTRY (dialog->txt_loc_code), sdialog->result);
280
free_search_dialog (sdialog);
288
create_config_dialog (xfceweather_data *data,
291
xfceweather_dialog *dialog;
292
GtkWidget *vbox2, *vbox3, *hbox, *hbox2, *label,
293
*menu, *button_add, *button_del, *image, *button, *scroll;
294
GtkSizeGroup *sg, *sg_buttons;
295
GtkTreeViewColumn *column;
296
GtkCellRenderer *renderer;
301
sg = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
302
sg_buttons = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
304
dialog = panel_slice_new0 (xfceweather_dialog);
306
dialog->wd = (xfceweather_data *) data;
307
dialog->dialog = gtk_widget_get_toplevel (vbox);
309
label = gtk_label_new (_("Measurement unit:"));
310
gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
311
menu = gtk_menu_new ();
312
dialog->opt_unit = gtk_option_menu_new ();
314
gtk_menu_shell_append ((GtkMenuShell *) (GTK_MENU (menu)),
315
(gtk_menu_item_new_with_label (_("Imperial"))));
316
gtk_menu_shell_append ((GtkMenuShell *) (GTK_MENU (menu)),
317
(gtk_menu_item_new_with_label (_("Metric"))));
318
gtk_option_menu_set_menu (GTK_OPTION_MENU (dialog->opt_unit), menu);
320
if (dialog->wd->unit == IMPERIAL)
321
gtk_option_menu_set_history (GTK_OPTION_MENU (dialog->opt_unit), 0);
323
gtk_option_menu_set_history (GTK_OPTION_MENU (dialog->opt_unit), 1);
324
gtk_size_group_add_widget (sg, label);
326
hbox = gtk_hbox_new (FALSE, BORDER);
327
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
328
gtk_box_pack_start (GTK_BOX (hbox), dialog->opt_unit, TRUE, TRUE, 0);
329
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
332
label = gtk_label_new (_("Location code:"));
333
dialog->txt_loc_code = gtk_entry_new ();
335
gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
337
if (dialog->wd->location_code != NULL)
338
gtk_entry_set_text (GTK_ENTRY (dialog->txt_loc_code),
339
dialog->wd->location_code);
340
gtk_size_group_add_widget (sg, label);
342
button = gtk_button_new ();
343
image = gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_BUTTON);
344
gtk_container_add (GTK_CONTAINER (button), image);
345
g_signal_connect (G_OBJECT (button), "clicked",
346
G_CALLBACK (cb_findlocation), dialog);
348
hbox = gtk_hbox_new (FALSE, BORDER);
349
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
350
gtk_box_pack_start (GTK_BOX (hbox), dialog->txt_loc_code, TRUE, TRUE, 0);
351
gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
352
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
355
label = gtk_label_new (_("Proxy server:"));
356
dialog->txt_proxy_host = gtk_entry_new ();
357
dialog->chk_proxy_use =
358
gtk_check_button_new_with_label (_("Use proxy server"));
359
dialog->chk_proxy_fromenv =
360
gtk_check_button_new_with_label (_("Auto-detect from environment"));
361
dialog->txt_proxy_port = gtk_spin_button_new_with_range (0, 65536, 1);
363
gtk_misc_set_alignment (GTK_MISC (label), 0, 0);
365
gtk_size_group_add_widget (sg, label);
367
vbox3 = gtk_vbox_new (FALSE, BORDER);
368
gtk_box_pack_start (GTK_BOX (vbox3), dialog->chk_proxy_use, FALSE, FALSE,
370
gtk_box_pack_start (GTK_BOX (vbox3), dialog->chk_proxy_fromenv, FALSE,
373
hbox = gtk_hbox_new (FALSE, BORDER);
374
gtk_box_pack_start (GTK_BOX (hbox), dialog->txt_proxy_host, TRUE, TRUE, 0);
375
gtk_box_pack_start (GTK_BOX (hbox), dialog->txt_proxy_port, FALSE, FALSE,
377
gtk_box_pack_start (GTK_BOX (vbox3), hbox, FALSE, FALSE, 0);
380
hbox2 = gtk_hbox_new (FALSE, BORDER);
381
gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, FALSE, 0);
382
gtk_box_pack_start (GTK_BOX (hbox2), vbox3, TRUE, TRUE, 0);
384
gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, FALSE, 0);
386
g_signal_connect (G_OBJECT (dialog->chk_proxy_use), "toggled",
387
G_CALLBACK (cb_toggle), dialog->txt_proxy_host);
388
g_signal_connect (G_OBJECT (dialog->chk_proxy_use), "toggled",
389
G_CALLBACK (cb_toggle), dialog->txt_proxy_port);
390
g_signal_connect (G_OBJECT (dialog->chk_proxy_use), "toggled",
391
G_CALLBACK (cb_toggle), dialog->chk_proxy_fromenv);
392
g_signal_connect (G_OBJECT (dialog->chk_proxy_fromenv), "toggled",
393
G_CALLBACK (cb_not_toggle), dialog->txt_proxy_host);
394
g_signal_connect (G_OBJECT (dialog->chk_proxy_fromenv), "toggled",
395
G_CALLBACK (cb_not_toggle), dialog->txt_proxy_port);
397
if (dialog->wd->saved_proxy_host != NULL)
399
gtk_entry_set_text (GTK_ENTRY (dialog->txt_proxy_host),
400
dialog->wd->saved_proxy_host);
402
gtk_spin_button_set_value (GTK_SPIN_BUTTON (dialog->txt_proxy_port),
403
dialog->wd->saved_proxy_port);
406
if (dialog->wd->proxy_host || dialog->wd->proxy_fromenv)
408
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->chk_proxy_use),
411
if (dialog->wd->proxy_fromenv)
412
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
413
(dialog->chk_proxy_fromenv), TRUE);
417
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->chk_proxy_use),
419
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->chk_proxy_use),
425
dialog->opt_xmloption = make_label ();
426
dialog->mdl_xmloption = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_INT);
427
dialog->lst_xmloption =
428
gtk_tree_view_new_with_model (GTK_TREE_MODEL (dialog->mdl_xmloption));
430
renderer = gtk_cell_renderer_text_new ();
432
gtk_tree_view_column_new_with_attributes (_("Labels to display"),
433
renderer, "text", 0, NULL);
434
gtk_tree_view_append_column (GTK_TREE_VIEW (dialog->lst_xmloption), column);
436
button_add = gtk_button_new_from_stock (GTK_STOCK_ADD);
437
gtk_size_group_add_widget (sg_buttons, button_add);
438
hbox = gtk_hbox_new (FALSE, BORDER);
439
gtk_box_pack_start (GTK_BOX (hbox), dialog->opt_xmloption, TRUE, TRUE, 0);
440
gtk_box_pack_start (GTK_BOX (hbox), button_add, FALSE, FALSE, 0);
441
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
443
button_del = gtk_button_new_from_stock (GTK_STOCK_REMOVE);
444
gtk_size_group_add_widget (sg_buttons, button_del);
445
hbox = gtk_hbox_new (FALSE, BORDER);
446
scroll = gtk_scrolled_window_new (NULL, NULL);
447
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll),
448
GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
449
gtk_container_add (GTK_CONTAINER (scroll), dialog->lst_xmloption);
450
gtk_box_pack_start (GTK_BOX (hbox), scroll, TRUE, TRUE, 0);
452
vbox2 = gtk_vbox_new (FALSE, 0);
453
gtk_box_pack_start (GTK_BOX (vbox2), button_del, FALSE, FALSE, 0);
454
gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 0);
455
gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
456
gtk_widget_set_size_request (dialog->lst_xmloption, -1, 120);
459
if (data->labels->len > 0)
461
for (i = 0; i < data->labels->len; i++)
463
opt = g_array_index (data->labels, datas, i);
465
if ((n = option_i (opt)) != -1)
466
add_mdl_option (dialog->mdl_xmloption, n);
470
g_object_unref (G_OBJECT (sg));
471
g_object_unref (G_OBJECT (sg_buttons));
473
g_signal_connect (G_OBJECT (button_add), "clicked",
474
G_CALLBACK (cb_addoption), dialog);
475
g_signal_connect (G_OBJECT (button_del), "clicked",
476
G_CALLBACK (cb_deloption), dialog);
478
gtk_widget_show_all (vbox);
486
set_callback_config_dialog (xfceweather_dialog *dialog,