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

« back to all changes in this revision

Viewing changes to panel-plugin/config_dialog.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
 
/* vim: set expandtab ts=8 sw=4: */
2
 
 
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 of the License, or
6
 
 *  (at your option) 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 Library General Public License for more details.
12
 
 *
13
 
 *  You should have received a copy of the GNU General Public License
14
 
 *  along with this program; if not, write to the Free Software
15
 
 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16
 
 */
17
 
 
18
 
#ifdef HAVE_CONFIG_H
19
 
#include <config.h>
20
 
#endif
21
 
 
22
 
#include <string.h>
23
 
#include <libxfcegui4/libxfcegui4.h>
24
 
 
25
 
#include "parsers.h"
26
 
#include "get_data.h"
27
 
#include "plugin.h"
28
 
 
29
 
#include "config_dialog.h"
30
 
#include "search_dialog.h"
31
 
 
32
 
#define OPTIONS_N 11
33
 
#define BORDER    8
34
 
 
35
 
const static labeloption labeloptions[OPTIONS_N] = { 
36
 
        {N_("Windchill (F)"), FLIK},
37
 
        {N_("Temperature (T)"), TEMP},
38
 
        {N_("Atmosphere pressure (P)"), BAR_R},
39
 
        {N_("Atmosphere state (P)"), BAR_D},
40
 
        {N_("Wind speed (WS)"), WIND_SPEED},
41
 
        {N_("Wind gust (WG)"), WIND_GUST},
42
 
        {N_("Wind direction (WD)"), WIND_DIRECTION},
43
 
        {N_("Humidity (H)"), HMID},
44
 
        {N_("Visibility (V)"), VIS},
45
 
        {N_("UV Index (UV)"), UV_INDEX},
46
 
        {N_("Dewpoint (DP)"), DEWP},
47
 
};
48
 
 
49
 
typedef void(*cb_function)(xfceweather_data *);
50
 
static cb_function cb = NULL;
51
 
 
52
 
static void
53
 
add_mdl_option (GtkListStore *mdl,
54
 
                int           opt)
55
 
{
56
 
    GtkTreeIter iter;
57
 
    
58
 
    gtk_list_store_append (mdl, &iter);
59
 
    gtk_list_store_set (mdl, &iter,
60
 
            0, _(labeloptions[opt].name),
61
 
            1, labeloptions[opt].number,
62
 
            -1);
63
 
}
64
 
 
65
 
static gboolean
66
 
cb_addoption (GtkWidget *widget,
67
 
              gpointer   data)
68
 
{
69
 
    xfceweather_dialog *dialog  = (xfceweather_dialog *) data;
70
 
    gint                history = gtk_option_menu_get_history (GTK_OPTION_MENU (dialog->opt_xmloption)); 
71
 
 
72
 
    add_mdl_option (dialog->mdl_xmloption, history);
73
 
 
74
 
    return FALSE;
75
 
}
76
 
 
77
 
static gboolean
78
 
cb_deloption (GtkWidget *widget,
79
 
              gpointer   data)
80
 
{
81
 
    xfceweather_dialog *dialog    = (xfceweather_dialog *)data;
82
 
    GtkTreeIter         iter;
83
 
    GtkTreeSelection   *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (dialog->lst_xmloption));
84
 
    
85
 
    if (gtk_tree_selection_get_selected (selection, NULL, &iter))
86
 
        gtk_list_store_remove (GTK_LIST_STORE (dialog->mdl_xmloption), &iter);
87
 
 
88
 
    return FALSE;
89
 
}
90
 
 
91
 
static gboolean
92
 
cb_toggle (GtkWidget *widget,
93
 
           gpointer   data)
94
 
{
95
 
    GtkWidget *target = (GtkWidget *)data;
96
 
 
97
 
    gtk_widget_set_sensitive (target,
98
 
            gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)));
99
 
 
100
 
    return FALSE;
101
 
}
102
 
 
103
 
static gboolean
104
 
cb_not_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 (widget)));
111
 
 
112
 
    return FALSE;
113
 
}               
114
 
 
115
 
static
116
 
GtkWidget *make_label (void)
117
 
{
118
 
    guint      i;
119
 
    GtkWidget *widget, *menu;
120
 
    
121
 
    menu = gtk_menu_new ();
122
 
    widget = gtk_option_menu_new ();
123
 
 
124
 
    for (i = 0; i < 11; i++)
125
 
    {
126
 
        labeloption opt = labeloptions[i];
127
 
 
128
 
        gtk_menu_shell_append (GTK_MENU_SHELL (menu),
129
 
                gtk_menu_item_new_with_label (_(opt.name)));
130
 
    }
131
 
    
132
 
    gtk_option_menu_set_menu (GTK_OPTION_MENU (widget), menu);
133
 
 
134
 
    return widget;
135
 
}
136
 
 
137
 
void
138
 
apply_options (xfceweather_dialog *dialog)
139
 
{
140
 
    gint         history = 0;
141
 
    gboolean     hasiter = FALSE;
142
 
    GtkTreeIter  iter;
143
 
    gchar       *text;
144
 
 
145
 
    xfceweather_data *data = (xfceweather_data *) dialog->wd;
146
 
    
147
 
    history = gtk_option_menu_get_history (GTK_OPTION_MENU (dialog->opt_unit));
148
 
 
149
 
    if (history == 0)
150
 
        data->unit = IMPERIAL;
151
 
    else 
152
 
        data->unit = METRIC;
153
 
 
154
 
    if (data->location_code)
155
 
        g_free (data->location_code);
156
 
 
157
 
    data->location_code = g_strdup (gtk_entry_get_text (GTK_ENTRY (dialog->txt_loc_code))); 
158
 
 
159
 
    /* call labels_clear() here */
160
 
    if (data->labels && data->labels->len > 0)
161
 
        g_array_free (data->labels, TRUE);
162
 
 
163
 
    data->labels = g_array_new (FALSE, TRUE, sizeof(datas));
164
 
 
165
 
    for (hasiter = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (dialog->mdl_xmloption), &iter);
166
 
            hasiter == TRUE; hasiter = gtk_tree_model_iter_next (
167
 
                GTK_TREE_MODEL (dialog->mdl_xmloption), &iter))
168
 
    {
169
 
        gint option;
170
 
        GValue value = {0, };
171
 
 
172
 
        gtk_tree_model_get_value (GTK_TREE_MODEL(dialog->mdl_xmloption), &iter, 1, &value);
173
 
        option = g_value_get_int (&value);
174
 
        g_array_append_val (data->labels, option);
175
 
        g_value_unset (&value);
176
 
    }
177
 
    
178
 
    if (data->proxy_host)
179
 
    {
180
 
        g_free (data->proxy_host);
181
 
        data->proxy_host = NULL; 
182
 
    }
183
 
    
184
 
    if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->chk_proxy_use)))
185
 
        data->proxy_fromenv = FALSE;
186
 
    else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->chk_proxy_fromenv)))
187
 
    {
188
 
        data->proxy_fromenv = TRUE;
189
 
        check_envproxy(&data->proxy_host, &data->proxy_port);
190
 
    }
191
 
    else /* use provided proxy settings */
192
 
    {
193
 
        data->proxy_fromenv = FALSE;
194
 
        text = g_strdup (gtk_entry_get_text (GTK_ENTRY(dialog->txt_proxy_host)));
195
 
 
196
 
        if (strlen (text) == 0)
197
 
        {
198
 
            xfce_err(_("Please enter proxy settings"));
199
 
            gtk_widget_grab_focus (dialog->txt_proxy_host);
200
 
            return;
201
 
        }
202
 
 
203
 
        data->proxy_host = g_strdup(text);
204
 
        data->proxy_port = gtk_spin_button_get_value (
205
 
                GTK_SPIN_BUTTON (dialog->txt_proxy_port));
206
 
 
207
 
        if (data->saved_proxy_host)
208
 
            g_free (data->saved_proxy_host);
209
 
        
210
 
        data->saved_proxy_host = g_strdup(text);
211
 
        data->saved_proxy_port = data->proxy_port;
212
 
        
213
 
        g_free (text);
214
 
    }       
215
 
 
216
 
    if (cb)
217
 
        cb(data);
218
 
}
219
 
 
220
 
static int
221
 
option_i (datas opt)
222
 
{
223
 
    guint i;
224
 
 
225
 
    for (i = 0; i < OPTIONS_N; i++)
226
 
    {
227
 
        if (labeloptions[i].number == opt)
228
 
            return i;
229
 
    }
230
 
 
231
 
    return -1;
232
 
}
233
 
 
234
 
static gboolean
235
 
cb_findlocation (GtkButton *button,
236
 
                 gpointer   user_data)
237
 
{
238
 
    xfceweather_dialog *dialog = (xfceweather_dialog *) user_data;
239
 
    search_dialog *sdialog     = create_search_dialog(NULL, 
240
 
            dialog->wd->proxy_host, dialog->wd->proxy_port);
241
 
 
242
 
    if (run_search_dialog(sdialog))
243
 
        gtk_entry_set_text (GTK_ENTRY(dialog->txt_loc_code), sdialog->result);
244
 
 
245
 
    free_search_dialog(sdialog);
246
 
 
247
 
    return FALSE;
248
 
}
249
 
    
250
 
 
251
 
xfceweather_dialog *
252
 
create_config_dialog (xfceweather_data *data,
253
 
                      GtkWidget        *vbox)
254
 
{
255
 
    xfceweather_dialog *dialog;
256
 
    GtkWidget *vbox2, *vbox3, *hbox, *hbox2, *label, 
257
 
          *menu, *button_add, 
258
 
          *button_del, *image, *button, *scroll;
259
 
    GtkSizeGroup *sg = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
260
 
    GtkSizeGroup *sg_buttons = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
261
 
    GtkTreeViewColumn *column;
262
 
    GtkCellRenderer *renderer; 
263
 
    
264
 
    dialog = panel_slice_new0 (xfceweather_dialog);
265
 
 
266
 
    dialog->wd = (xfceweather_data *)data;
267
 
    dialog->dialog = gtk_widget_get_toplevel (vbox);
268
 
 
269
 
    label = gtk_label_new (_("Measurement unit:"));
270
 
    gtk_misc_set_alignment (GTK_MISC(label), 0, 0.5);
271
 
    menu = gtk_menu_new ();
272
 
    dialog->opt_unit = gtk_option_menu_new ();
273
 
       
274
 
    gtk_menu_shell_append  ((GtkMenuShell *)(GTK_MENU(menu)),
275
 
                (gtk_menu_item_new_with_label (_("Imperial"))));
276
 
    gtk_menu_shell_append  ((GtkMenuShell *)(GTK_MENU(menu)),
277
 
                (gtk_menu_item_new_with_label (_("Metric"))));
278
 
    gtk_option_menu_set_menu(GTK_OPTION_MENU(dialog->opt_unit), menu);
279
 
 
280
 
    if (dialog->wd->unit == IMPERIAL)
281
 
        gtk_option_menu_set_history(GTK_OPTION_MENU(dialog->opt_unit), 0);
282
 
    else
283
 
        gtk_option_menu_set_history(GTK_OPTION_MENU(dialog->opt_unit), 1);
284
 
    gtk_size_group_add_widget (sg, label);
285
 
 
286
 
    hbox = gtk_hbox_new (FALSE, BORDER);
287
 
    gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
288
 
    gtk_box_pack_start (GTK_BOX (hbox), dialog->opt_unit, TRUE, TRUE, 0);
289
 
    gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
290
 
 
291
 
 
292
 
    label = gtk_label_new (_("Location code:"));
293
 
    dialog->txt_loc_code = gtk_entry_new ();
294
 
 
295
 
    gtk_misc_set_alignment (GTK_MISC(label), 0, 0.5);
296
 
 
297
 
    if (dialog->wd->location_code != NULL)
298
 
        gtk_entry_set_text (GTK_ENTRY(dialog->txt_loc_code), 
299
 
                dialog->wd->location_code);
300
 
    gtk_size_group_add_widget (sg, label);
301
 
 
302
 
    button = gtk_button_new ();
303
 
    image = gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_BUTTON);
304
 
    gtk_container_add(GTK_CONTAINER (button), image);
305
 
    g_signal_connect (button, "clicked", G_CALLBACK (cb_findlocation), dialog);
306
 
 
307
 
    hbox = gtk_hbox_new (FALSE, BORDER);
308
 
    gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
309
 
    gtk_box_pack_start (GTK_BOX (hbox), dialog->txt_loc_code, TRUE, TRUE, 0);
310
 
    gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
311
 
    gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
312
 
 
313
 
    /* proxy */
314
 
    label = gtk_label_new (_("Proxy server:"));
315
 
    dialog->txt_proxy_host = gtk_entry_new ();
316
 
    dialog->chk_proxy_use = gtk_check_button_new_with_label (_("Use proxy server"));
317
 
    dialog->chk_proxy_fromenv = 
318
 
        gtk_check_button_new_with_label (_("Auto-detect from environment"));
319
 
    dialog->txt_proxy_port = gtk_spin_button_new_with_range (0, 65536, 1);
320
 
 
321
 
    gtk_misc_set_alignment (GTK_MISC(label), 0, 0);
322
 
 
323
 
    gtk_size_group_add_widget (sg, label);
324
 
 
325
 
    vbox3 = gtk_vbox_new (FALSE, BORDER);
326
 
    gtk_box_pack_start (GTK_BOX (vbox3), dialog->chk_proxy_use, FALSE, FALSE, 0);
327
 
    gtk_box_pack_start (GTK_BOX (vbox3), dialog->chk_proxy_fromenv, FALSE, FALSE, 0);
328
 
 
329
 
    hbox = gtk_hbox_new (FALSE, BORDER);
330
 
    gtk_box_pack_start (GTK_BOX (hbox), dialog->txt_proxy_host, TRUE, TRUE, 0);
331
 
    gtk_box_pack_start (GTK_BOX (hbox), dialog->txt_proxy_port, FALSE, FALSE, 0);
332
 
    gtk_box_pack_start (GTK_BOX (vbox3), hbox, FALSE, FALSE, 0);
333
 
    
334
 
 
335
 
    hbox2 = gtk_hbox_new (FALSE, BORDER);
336
 
    gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, FALSE, 0);
337
 
    gtk_box_pack_start (GTK_BOX (hbox2), vbox3, TRUE, TRUE, 0);
338
 
 
339
 
    gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, FALSE, 0);
340
 
 
341
 
    g_signal_connect (dialog->chk_proxy_use, "toggled", G_CALLBACK (cb_toggle),
342
 
            (gpointer)dialog->txt_proxy_host);
343
 
    g_signal_connect (dialog->chk_proxy_use, "toggled", G_CALLBACK (cb_toggle),
344
 
            (gpointer)dialog->txt_proxy_port);
345
 
    g_signal_connect (dialog->chk_proxy_use, "toggled", G_CALLBACK (cb_toggle),
346
 
            (gpointer)dialog->chk_proxy_fromenv);
347
 
 
348
 
    g_signal_connect (dialog->chk_proxy_fromenv, "toggled", G_CALLBACK (cb_not_toggle),
349
 
            (gpointer)dialog->txt_proxy_host);
350
 
    g_signal_connect (dialog->chk_proxy_fromenv, "toggled", G_CALLBACK (cb_not_toggle),
351
 
            (gpointer)dialog->txt_proxy_port);
352
 
 
353
 
    if (dialog->wd->saved_proxy_host != NULL)
354
 
    {
355
 
        gtk_entry_set_text (GTK_ENTRY (dialog->txt_proxy_host), 
356
 
                dialog->wd->saved_proxy_host); 
357
 
 
358
 
        gtk_spin_button_set_value (GTK_SPIN_BUTTON (dialog->txt_proxy_port), 
359
 
                dialog->wd->saved_proxy_port);
360
 
    }
361
 
 
362
 
    if (dialog->wd->proxy_host || dialog->wd->proxy_fromenv)
363
 
    { 
364
 
        gtk_toggle_button_set_active (
365
 
                GTK_TOGGLE_BUTTON (dialog->chk_proxy_use), TRUE);
366
 
        
367
 
        if (dialog->wd->proxy_fromenv)
368
 
            gtk_toggle_button_set_active (
369
 
                    GTK_TOGGLE_BUTTON (dialog->chk_proxy_fromenv), TRUE);
370
 
    }
371
 
    else
372
 
    { 
373
 
        gtk_toggle_button_set_active (
374
 
                GTK_TOGGLE_BUTTON (dialog->chk_proxy_use), TRUE);
375
 
        gtk_toggle_button_set_active (
376
 
                GTK_TOGGLE_BUTTON (dialog->chk_proxy_use), FALSE);
377
 
    }
378
 
 
379
 
 
380
 
    /* labels */
381
 
     
382
 
    dialog->opt_xmloption = make_label (); 
383
 
    dialog->mdl_xmloption = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_INT);
384
 
    dialog->lst_xmloption = gtk_tree_view_new_with_model (GTK_TREE_MODEL(dialog->mdl_xmloption));
385
 
 
386
 
    renderer = gtk_cell_renderer_text_new ();
387
 
    column = gtk_tree_view_column_new_with_attributes (_("Labels to display"), renderer,
388
 
            "text", 0, NULL);
389
 
    gtk_tree_view_append_column (GTK_TREE_VIEW(dialog->lst_xmloption), column);
390
 
 
391
 
    button_add = gtk_button_new_from_stock(GTK_STOCK_ADD);
392
 
    gtk_size_group_add_widget (sg_buttons, button_add);
393
 
    hbox = gtk_hbox_new (FALSE, BORDER);
394
 
    gtk_box_pack_start (GTK_BOX (hbox), dialog->opt_xmloption, TRUE, TRUE, 0);
395
 
    gtk_box_pack_start (GTK_BOX (hbox), button_add, FALSE, FALSE, 0);
396
 
    gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
397
 
 
398
 
    button_del = gtk_button_new_from_stock(GTK_STOCK_REMOVE);
399
 
    gtk_size_group_add_widget (sg_buttons, button_del);
400
 
    hbox = gtk_hbox_new (FALSE, BORDER);
401
 
    scroll = gtk_scrolled_window_new (NULL, NULL);
402
 
    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_NEVER,
403
 
            GTK_POLICY_AUTOMATIC);
404
 
    gtk_container_add(GTK_CONTAINER(scroll), dialog->lst_xmloption);
405
 
    gtk_box_pack_start (GTK_BOX (hbox), scroll, TRUE, TRUE, 0);
406
 
    
407
 
    vbox2 = gtk_vbox_new (FALSE, 0);
408
 
    gtk_box_pack_start (GTK_BOX (vbox2), button_del, FALSE, FALSE, 0);
409
 
    gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 0);
410
 
    gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
411
 
    gtk_widget_set_size_request (dialog->lst_xmloption, -1, 120);
412
 
 
413
 
 
414
 
    if (data->labels->len > 0) 
415
 
    {
416
 
        datas opt;
417
 
        guint i;
418
 
        gint  n;
419
 
        
420
 
        for (i = 0; i < data->labels->len; i++) 
421
 
        {
422
 
            opt = g_array_index (data->labels, datas, i);
423
 
 
424
 
            if ((n = option_i(opt)) != -1)
425
 
                add_mdl_option (dialog->mdl_xmloption, n);
426
 
        }
427
 
    }
428
 
 
429
 
    g_signal_connect (button_add, "clicked", G_CALLBACK (cb_addoption), dialog);
430
 
    g_signal_connect (button_del, "clicked", G_CALLBACK (cb_deloption), dialog);      
431
 
    
432
 
    gtk_widget_show_all (vbox);
433
 
 
434
 
    return dialog;
435
 
}
436
 
 
437
 
void
438
 
set_callback_config_dialog (xfceweather_dialog *dialog, 
439
 
                            cb_function         cb_new)
440
 
{
441
 
    cb = cb_new;
442
 
}