~ubuntu-branches/ubuntu/natty/xfce4-weather-plugin/natty-proposed

« back to all changes in this revision

Viewing changes to panel-plugin/weather-config.c

  • Committer: Bazaar Package Importer
  • Author(s): Yves-Alexis Perez, Simon Huggins, Yves-Alexis Perez
  • Date: 2007-12-08 19:28:17 UTC
  • mfrom: (0.1.5 upstream)
  • Revision ID: james.westby@ubuntu.com-20071208192817-xjr2u2eshv19ndp5
Tags: 0.6.2-1
[ Simon Huggins ]
* debian/control: Move fake Homepage field to a real one now dpkg
  supports it.
* Add Vcs-* headers to debian/control

[ Yves-Alexis Perez ]
* New upstream release.
* debian/control:
  - updated standard versions to 3.7.3.
  - updated my email to the debian.org one.
* debian/copyright: updated copyrights, authors and license.
* debian/NEWS: remove tab at beginning of lines. 

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*  $Id: weather-config.c 2366 2007-01-15 19:10:23Z nick $
 
2
 *
 
3
 *  Copyright (c) 2003-2007 Xfce Development Team
 
4
 * 
 
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.
 
9
 *
 
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.
 
14
 *
 
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.
 
18
 */
 
19
 
 
20
#ifdef HAVE_CONFIG_H
 
21
#include <config.h>
 
22
#endif
 
23
 
 
24
#include <string.h>
 
25
#include <libxfcegui4/libxfcegui4.h>
 
26
 
 
27
#include "weather-parsers.h"
 
28
#include "weather-data.h"
 
29
#include "weather.h"
 
30
 
 
31
#include "weather-config.h"
 
32
#include "weather-search.h"
 
33
 
 
34
#define OPTIONS_N 11
 
35
#define BORDER    8
 
36
 
 
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},
 
49
};
 
50
 
 
51
typedef void (*cb_function) (xfceweather_data *);
 
52
static cb_function cb = NULL;
 
53
 
 
54
static void
 
55
add_mdl_option (GtkListStore *mdl,
 
56
                gint          opt)
 
57
{
 
58
  GtkTreeIter iter;
 
59
 
 
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);
 
64
}
 
65
 
 
66
 
 
67
 
 
68
static gboolean
 
69
cb_addoption (GtkWidget *widget,
 
70
              gpointer   data)
 
71
{
 
72
  xfceweather_dialog *dialog;
 
73
  gint                history;
 
74
 
 
75
  dialog = (xfceweather_dialog *) data;
 
76
  history = gtk_option_menu_get_history (GTK_OPTION_MENU (dialog->opt_xmloption));
 
77
 
 
78
  add_mdl_option (dialog->mdl_xmloption, history);
 
79
 
 
80
  return FALSE;
 
81
}
 
82
 
 
83
 
 
84
 
 
85
static gboolean
 
86
cb_deloption (GtkWidget *widget,
 
87
              gpointer   data)
 
88
{
 
89
  xfceweather_dialog *dialog = (xfceweather_dialog *) data;
 
90
  GtkTreeIter         iter;
 
91
  GtkTreeSelection    *selection;
 
92
 
 
93
  selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (dialog->lst_xmloption));
 
94
 
 
95
  if (gtk_tree_selection_get_selected (selection, NULL, &iter))
 
96
    gtk_list_store_remove (GTK_LIST_STORE (dialog->mdl_xmloption), &iter);
 
97
 
 
98
  return FALSE;
 
99
}
 
100
 
 
101
 
 
102
 
 
103
static gboolean
 
104
cb_toggle (GtkWidget *widget,
 
105
           gpointer   data)
 
106
{
 
107
  GtkWidget *target = (GtkWidget *) data;
 
108
 
 
109
  gtk_widget_set_sensitive (target,
 
110
                            gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
 
111
                                                          (widget)));
 
112
 
 
113
  return FALSE;
 
114
}
 
115
 
 
116
 
 
117
 
 
118
static gboolean
 
119
cb_not_toggle (GtkWidget *widget,
 
120
               gpointer   data)
 
121
{
 
122
  GtkWidget *target = (GtkWidget *) data;
 
123
 
 
124
  gtk_widget_set_sensitive (target,
 
125
                            !gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
 
126
                                                           (widget)));
 
127
 
 
128
  return FALSE;
 
129
}
 
130
 
 
131
 
 
132
 
 
133
static GtkWidget *
 
134
make_label (void)
 
135
{
 
136
  guint      i;
 
137
  GtkWidget *widget, *menu;
 
138
 
 
139
  menu = gtk_menu_new ();
 
140
  widget = gtk_option_menu_new ();
 
141
 
 
142
  for (i = 0; i < 11; i++)
 
143
    {
 
144
      labeloption opt = labeloptions[i];
 
145
 
 
146
      gtk_menu_shell_append (GTK_MENU_SHELL (menu),
 
147
                             gtk_menu_item_new_with_label (_(opt.name)));
 
148
    }
 
149
 
 
150
  gtk_option_menu_set_menu (GTK_OPTION_MENU (widget), menu);
 
151
 
 
152
  return widget;
 
153
}
 
154
 
 
155
 
 
156
 
 
157
void
 
158
apply_options (xfceweather_dialog *dialog)
 
159
{
 
160
  gint         history = 0;
 
161
  gboolean     hasiter = FALSE;
 
162
  GtkTreeIter  iter;
 
163
  gchar       *text;
 
164
  gint         option;
 
165
  GValue       value = { 0, };
 
166
 
 
167
  xfceweather_data *data = (xfceweather_data *) dialog->wd;
 
168
 
 
169
  history = gtk_option_menu_get_history (GTK_OPTION_MENU (dialog->opt_unit));
 
170
 
 
171
  if (history == 0)
 
172
    data->unit = IMPERIAL;
 
173
  else
 
174
    data->unit = METRIC;
 
175
 
 
176
  if (data->location_code)
 
177
    g_free (data->location_code);
 
178
 
 
179
  data->location_code =
 
180
    g_strdup (gtk_entry_get_text (GTK_ENTRY (dialog->txt_loc_code)));
 
181
 
 
182
  /* call labels_clear() here */
 
183
  if (data->labels && data->labels->len > 0)
 
184
    g_array_free (data->labels, TRUE);
 
185
 
 
186
  data->labels = g_array_new (FALSE, TRUE, sizeof (datas));
 
187
 
 
188
  for (hasiter =
 
189
       gtk_tree_model_get_iter_first (GTK_TREE_MODEL (dialog->mdl_xmloption),
 
190
                                      &iter); hasiter == TRUE;
 
191
       hasiter =
 
192
       gtk_tree_model_iter_next (GTK_TREE_MODEL (dialog->mdl_xmloption),
 
193
                                 &iter))
 
194
    {
 
195
      gtk_tree_model_get_value (GTK_TREE_MODEL (dialog->mdl_xmloption), &iter,
 
196
                                1, &value);
 
197
      option = g_value_get_int (&value);
 
198
      g_array_append_val (data->labels, option);
 
199
      g_value_unset (&value);
 
200
    }
 
201
 
 
202
  if (data->proxy_host)
 
203
    {
 
204
      g_free (data->proxy_host);
 
205
      data->proxy_host = NULL;
 
206
    }
 
207
 
 
208
  if (!gtk_toggle_button_get_active
 
209
      (GTK_TOGGLE_BUTTON (dialog->chk_proxy_use)))
 
210
    data->proxy_fromenv = FALSE;
 
211
  else
 
212
    if (gtk_toggle_button_get_active
 
213
        (GTK_TOGGLE_BUTTON (dialog->chk_proxy_fromenv)))
 
214
    {
 
215
      data->proxy_fromenv = TRUE;
 
216
      check_envproxy (&data->proxy_host, &data->proxy_port);
 
217
    }
 
218
  else                                /* use provided proxy settings */
 
219
    {
 
220
      data->proxy_fromenv = FALSE;
 
221
      text =
 
222
        g_strdup (gtk_entry_get_text (GTK_ENTRY (dialog->txt_proxy_host)));
 
223
 
 
224
      if (strlen (text) == 0)
 
225
        {
 
226
          xfce_err (_("Please enter proxy settings"));
 
227
          gtk_widget_grab_focus (dialog->txt_proxy_host);
 
228
          return;
 
229
        }
 
230
 
 
231
      data->proxy_host = g_strdup (text);
 
232
      data->proxy_port =
 
233
        gtk_spin_button_get_value (GTK_SPIN_BUTTON (dialog->txt_proxy_port));
 
234
 
 
235
      if (data->saved_proxy_host)
 
236
        g_free (data->saved_proxy_host);
 
237
 
 
238
      data->saved_proxy_host = g_strdup (text);
 
239
      data->saved_proxy_port = data->proxy_port;
 
240
 
 
241
      g_free (text);
 
242
    }
 
243
 
 
244
  if (cb)
 
245
    cb (data);
 
246
}
 
247
 
 
248
 
 
249
 
 
250
static int
 
251
option_i (datas opt)
 
252
{
 
253
  guint i;
 
254
 
 
255
  for (i = 0; i < OPTIONS_N; i++)
 
256
    {
 
257
      if (labeloptions[i].number == opt)
 
258
        return i;
 
259
    }
 
260
 
 
261
  return -1;
 
262
}
 
263
 
 
264
 
 
265
 
 
266
static gboolean
 
267
cb_findlocation (GtkButton *button,
 
268
                 gpointer   user_data)
 
269
{
 
270
  xfceweather_dialog *dialog = (xfceweather_dialog *) user_data;
 
271
  search_dialog *sdialog;
 
272
 
 
273
  sdialog = create_search_dialog (NULL,
 
274
                                  dialog->wd->proxy_host,
 
275
                                  dialog->wd->proxy_port);
 
276
 
 
277
  if (run_search_dialog (sdialog))
 
278
    gtk_entry_set_text (GTK_ENTRY (dialog->txt_loc_code), sdialog->result);
 
279
 
 
280
  free_search_dialog (sdialog);
 
281
 
 
282
  return FALSE;
 
283
}
 
284
 
 
285
 
 
286
 
 
287
xfceweather_dialog *
 
288
create_config_dialog (xfceweather_data *data,
 
289
                      GtkWidget        *vbox)
 
290
{
 
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;
 
297
  datas               opt;
 
298
  guint               i;
 
299
  gint                n;
 
300
 
 
301
  sg = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
 
302
  sg_buttons = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
 
303
 
 
304
  dialog = panel_slice_new0 (xfceweather_dialog);
 
305
 
 
306
  dialog->wd = (xfceweather_data *) data;
 
307
  dialog->dialog = gtk_widget_get_toplevel (vbox);
 
308
 
 
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 ();
 
313
 
 
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);
 
319
 
 
320
  if (dialog->wd->unit == IMPERIAL)
 
321
    gtk_option_menu_set_history (GTK_OPTION_MENU (dialog->opt_unit), 0);
 
322
  else
 
323
    gtk_option_menu_set_history (GTK_OPTION_MENU (dialog->opt_unit), 1);
 
324
  gtk_size_group_add_widget (sg, label);
 
325
 
 
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);
 
330
 
 
331
 
 
332
  label = gtk_label_new (_("Location code:"));
 
333
  dialog->txt_loc_code = gtk_entry_new ();
 
334
 
 
335
  gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
 
336
 
 
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);
 
341
 
 
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);
 
347
 
 
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);
 
353
 
 
354
  /* proxy */
 
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);
 
362
 
 
363
  gtk_misc_set_alignment (GTK_MISC (label), 0, 0);
 
364
 
 
365
  gtk_size_group_add_widget (sg, label);
 
366
 
 
367
  vbox3 = gtk_vbox_new (FALSE, BORDER);
 
368
  gtk_box_pack_start (GTK_BOX (vbox3), dialog->chk_proxy_use, FALSE, FALSE,
 
369
                      0);
 
370
  gtk_box_pack_start (GTK_BOX (vbox3), dialog->chk_proxy_fromenv, FALSE,
 
371
                      FALSE, 0);
 
372
 
 
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,
 
376
                      0);
 
377
  gtk_box_pack_start (GTK_BOX (vbox3), hbox, FALSE, FALSE, 0);
 
378
 
 
379
 
 
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);
 
383
 
 
384
  gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, FALSE, 0);
 
385
 
 
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);
 
396
 
 
397
  if (dialog->wd->saved_proxy_host != NULL)
 
398
    {
 
399
      gtk_entry_set_text (GTK_ENTRY (dialog->txt_proxy_host),
 
400
                          dialog->wd->saved_proxy_host);
 
401
 
 
402
      gtk_spin_button_set_value (GTK_SPIN_BUTTON (dialog->txt_proxy_port),
 
403
                                 dialog->wd->saved_proxy_port);
 
404
    }
 
405
 
 
406
  if (dialog->wd->proxy_host || dialog->wd->proxy_fromenv)
 
407
    {
 
408
      gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->chk_proxy_use),
 
409
                                    TRUE);
 
410
 
 
411
      if (dialog->wd->proxy_fromenv)
 
412
        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
 
413
                                      (dialog->chk_proxy_fromenv), TRUE);
 
414
    }
 
415
  else
 
416
    {
 
417
      gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->chk_proxy_use),
 
418
                                    TRUE);
 
419
      gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->chk_proxy_use),
 
420
                                    FALSE);
 
421
    }
 
422
 
 
423
 
 
424
  /* labels */
 
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));
 
429
 
 
430
  renderer = gtk_cell_renderer_text_new ();
 
431
  column =
 
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);
 
435
 
 
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);
 
442
 
 
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);
 
451
 
 
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);
 
457
 
 
458
 
 
459
  if (data->labels->len > 0)
 
460
    {
 
461
      for (i = 0; i < data->labels->len; i++)
 
462
        {
 
463
          opt = g_array_index (data->labels, datas, i);
 
464
 
 
465
          if ((n = option_i (opt)) != -1)
 
466
            add_mdl_option (dialog->mdl_xmloption, n);
 
467
        }
 
468
    }
 
469
 
 
470
  g_object_unref (G_OBJECT (sg));
 
471
  g_object_unref (G_OBJECT (sg_buttons));
 
472
 
 
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);
 
477
 
 
478
  gtk_widget_show_all (vbox);
 
479
 
 
480
  return dialog;
 
481
}
 
482
 
 
483
 
 
484
 
 
485
void
 
486
set_callback_config_dialog (xfceweather_dialog *dialog,
 
487
                            cb_function         cb_new)
 
488
{
 
489
  cb = cb_new;
 
490
}