weather-summary.c 23.3 KB
Newer Older
Florian Rivoal's avatar
Florian Rivoal committed
1
/*  Copyright (c) 2003-2007 Xfce Development Team
2
 *
3 4 5
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
6 7 8 9 10
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  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 15 16 17 18
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */

#ifdef HAVE_CONFIG_H
19
#include <config.h>
20 21 22 23
#endif

#include <libxfcegui4/libxfcegui4.h>

Nick Schermer's avatar
Nick Schermer committed
24 25
#include "weather-parsers.h"
#include "weather-data.h"
Florian Rivoal's avatar
Florian Rivoal committed
26
#include "weather-http.h"
Nick Schermer's avatar
Nick Schermer committed
27
#include "weather.h"
28

Nick Schermer's avatar
Nick Schermer committed
29 30 31
#include "weather-summary.h"
#include "weather-translate.h"
#include "weather-icon.h"
32

33

34 35 36
static gboolean lnk_clicked (GtkTextTag *tag, GObject *obj,
			     GdkEvent *event, GtkTextIter *iter,
			     GtkWidget *textview);
37

38 39 40 41 42 43
#define BORDER                           8
#define APPEND_BTEXT(text)               gtk_text_buffer_insert_with_tags(GTK_TEXT_BUFFER(buffer),\
                                                                          &iter, text, -1, btag, NULL);
#define APPEND_TEXT_ITEM_REAL(text)      gtk_text_buffer_insert(GTK_TEXT_BUFFER(buffer), \
                                                                &iter, text, -1);\
                                         g_free (value);
44 45
#define APPEND_TEXT_ITEM(text, item)     value = g_strdup_printf("\t%s%s%s %s\n",\
                                                                 text, text?": ":"", \
46 47
                                                                 get_data(data->weatherdata, item),\
                                                                 get_unit(data->unit, item));\
48
                                         APPEND_TEXT_ITEM_REAL(value);
49 50 51 52 53 54 55 56 57
#define APPEND_LINK_ITEM(prefix, text, url, lnk_tag) \
					 gtk_text_buffer_insert(GTK_TEXT_BUFFER(buffer), \
                                                                &iter, prefix, -1);\
					 gtk_text_buffer_insert_with_tags(GTK_TEXT_BUFFER(buffer), \
                                                                &iter, text, -1, lnk_tag, NULL);\
					 gtk_text_buffer_insert(GTK_TEXT_BUFFER(buffer), \
                                                                &iter, "\n", -1);\
					 g_object_set_data_full(G_OBJECT(lnk_tag), "url", g_strdup(url), g_free); \
					 g_signal_connect(G_OBJECT(lnk_tag), "event", \
58
						G_CALLBACK(lnk_clicked), NULL);
59

60 61


62 63
static GtkTooltips *tooltips = NULL;

64 65 66 67 68 69
static gboolean lnk_clicked (GtkTextTag *tag, GObject *obj,
			     GdkEvent *event, GtkTextIter *iter,
			     GtkWidget *textview)
{
  if (event->type == GDK_BUTTON_RELEASE) {
    const gchar *url = g_object_get_data(G_OBJECT(tag), "url");
70
    gchar *str = g_strdup_printf("exo-open --launch WebBrowser %s", url);
71

72
    g_spawn_command_line_async(str, NULL);
73 74 75 76
    g_free(str);
  } else if (event->type == GDK_LEAVE_NOTIFY) {
     gdk_window_set_cursor(gtk_text_view_get_window(GTK_TEXT_VIEW(obj),
				GTK_TEXT_WINDOW_TEXT), NULL);
77
  }
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
  return FALSE;
}

static gboolean
icon_clicked (GtkWidget      *widget,
              GdkEventButton *event,
              gpointer        user_data)
{
  return lnk_clicked(user_data, NULL, (GdkEvent *)(event), NULL, NULL);
}

static GdkCursor *hand_cursor = NULL;
static GdkCursor *text_cursor = NULL;
static gboolean on_icon = FALSE;
static gboolean view_motion_notify(GtkWidget *widget,
				   GdkEventMotion *event,
				   GtkWidget *view)
{
  GtkTextBuffer *buffer;

  buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view));

  if (event->x != -1 && event->y != -1) {
    gint bx, by;
    GtkTextIter iter;
    GSList *tags;
    GSList *cur;

106
    gtk_text_view_window_to_buffer_coords(GTK_TEXT_VIEW(view),
107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
    						GTK_TEXT_WINDOW_WIDGET,
    						event->x, event->y, &bx, &by);
    gtk_text_view_get_iter_at_location(GTK_TEXT_VIEW(view),
    						&iter, bx, by);
    tags = gtk_text_iter_get_tags(&iter);
    for (cur = tags; cur != NULL; cur = cur->next) {
      GtkTextTag *tag = cur->data;
      if (g_object_get_data(G_OBJECT(tag), "url")) {
        gdk_window_set_cursor(gtk_text_view_get_window(GTK_TEXT_VIEW(view),
				   GTK_TEXT_WINDOW_TEXT), hand_cursor);
        return FALSE;
      }
    }
  }
  if (!on_icon)
    gdk_window_set_cursor(gtk_text_view_get_window(GTK_TEXT_VIEW(view),
			     GTK_TEXT_WINDOW_TEXT), text_cursor);
  return FALSE;
}

static gboolean icon_motion_notify(GtkWidget *widget,
				   GdkEventMotion *event,
				   GtkWidget *view)
{
  on_icon = TRUE;
  gdk_window_set_cursor(gtk_text_view_get_window(GTK_TEXT_VIEW(view),
			     GTK_TEXT_WINDOW_TEXT), hand_cursor);
  return FALSE;
}

static gboolean view_leave_notify(GtkWidget *widget,
				   GdkEventMotion *event,
				   GtkWidget *view)
{
  on_icon = FALSE;
  gdk_window_set_cursor(gtk_text_view_get_window(GTK_TEXT_VIEW(view),
			     GTK_TEXT_WINDOW_TEXT), text_cursor);
  return FALSE;
}

static GtkWidget *weather_channel_evt = NULL;
static void view_scrolled_cb (GtkAdjustment *adj, GtkWidget *view)
{
  if (weather_channel_evt) {
    gint x, y, x1, y1;
152 153
    x1 = view->allocation.width - 73 - 5;
    y1 = view->requisition.height - 55 - 5;
154 155 156
    gtk_text_view_buffer_to_window_coords(
			GTK_TEXT_VIEW(view),
			GTK_TEXT_WINDOW_TEXT, x1, y1, &x, &y);
157
    gtk_text_view_move_child(GTK_TEXT_VIEW(view),
158 159 160 161 162 163 164 165 166 167
			weather_channel_evt, x, y);
  }
}

static void view_size_allocate_cb	(GtkWidget	*widget,
					 GtkAllocation	*allocation,
					 gpointer	 data)
{
  view_scrolled_cb(NULL, GTK_WIDGET(data));
}
168

169 170 171 172 173
static gchar *get_logo_path (void)
{
	gchar *dir = g_strconcat(g_get_user_cache_dir(), G_DIR_SEPARATOR_S,
				"xfce4", G_DIR_SEPARATOR_S, "weather-plugin", NULL);

174
	g_mkdir_with_parents(dir, 0755);
175 176 177 178 179 180 181 182 183
	g_free(dir);

	return g_strconcat(g_get_user_cache_dir(), G_DIR_SEPARATOR_S,
				"xfce4", G_DIR_SEPARATOR_S, "weather-plugin",
				G_DIR_SEPARATOR_S, "weather_logo.jpg", NULL);
}

static void
logo_fetched (gboolean  succeed,
Florian Rivoal's avatar
Florian Rivoal committed
184
           gchar     *result,
185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213
	   size_t    len,
           gpointer  user_data)
{
	if (succeed && result) {
		gchar *path = get_logo_path();
		GError *error = NULL;
		GdkPixbuf *pixbuf = NULL;
		if (!g_file_set_contents(path, result, len, &error)) {
			printf("err %s\n", error?error->message:"?");
			g_error_free(error);
			g_free(result);
			g_free(path);
			return;
		}
		g_free(result);
		pixbuf = gdk_pixbuf_new_from_file(path, NULL);
		g_free(path);
		if (pixbuf) {
			gtk_image_set_from_pixbuf(GTK_IMAGE(user_data), pixbuf);
			g_object_unref(pixbuf);
		}
	}
}

static GtkWidget *weather_summary_get_logo(xfceweather_data *data)
{
	GtkWidget *image = gtk_image_new();
	GdkPixbuf *pixbuf = NULL;
	gchar *path = get_logo_path();
214

215 216 217
	pixbuf = gdk_pixbuf_new_from_file(path, NULL);
	g_free(path);
	if (pixbuf == NULL) {
218
		weather_http_receive_data ("xoap.weather.com", "/web/common/twc/logos/web_73x55.jpg",
219 220 221 222 223
			data->proxy_host, data->proxy_port, logo_fetched, image);
	} else {
		gtk_image_set_from_pixbuf(GTK_IMAGE(image), pixbuf);
		g_object_unref(pixbuf);
	}
224

225 226
	return image;
}
227

228
static GtkWidget *
229
create_summary_tab (xfceweather_data *data)
230
{
231
  GtkTextBuffer *buffer;
232
  GtkTextIter    iter;
233
  GtkTextTag    *btag, *ltag0, *ltag1, *ltag2, *ltag3, *ltag4;
234 235
  gchar         *value, *date, *wind, *sun_val, *vis;
  GtkWidget     *view, *frame, *scrolled;
236 237 238
  GdkColor       lnk_color;
  GtkAdjustment *adj;
  GtkWidget     *weather_channel_icon;
239 240 241

  view = gtk_text_view_new ();
  gtk_text_view_set_editable (GTK_TEXT_VIEW (view), FALSE);
242
  gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (view), FALSE);
243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259
  frame = gtk_frame_new (NULL);
  scrolled = gtk_scrolled_window_new (NULL, NULL);

  gtk_container_add (GTK_CONTAINER (scrolled), view);
  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled),
                                  GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);

  gtk_container_set_border_width (GTK_CONTAINER (frame), BORDER);
  gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
  gtk_container_add (GTK_CONTAINER (frame), scrolled);

  buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
  gtk_text_buffer_get_iter_at_offset (GTK_TEXT_BUFFER (buffer), &iter, 0);
  btag =
    gtk_text_buffer_create_tag (buffer, NULL, "weight", PANGO_WEIGHT_BOLD,
                                NULL);

260 261 262 263 264 265 266
  gdk_color_parse("#0000ff", &lnk_color);
  ltag0 = gtk_text_buffer_create_tag(buffer, "lnk0", "foreground-gdk", &lnk_color, NULL);
  ltag1 = gtk_text_buffer_create_tag(buffer, "lnk1", "foreground-gdk", &lnk_color, NULL);
  ltag2 = gtk_text_buffer_create_tag(buffer, "lnk2", "foreground-gdk", &lnk_color, NULL);
  ltag3 = gtk_text_buffer_create_tag(buffer, "lnk3", "foreground-gdk", &lnk_color, NULL);
  ltag4 = gtk_text_buffer_create_tag(buffer, "lnk4", "foreground-gdk", &lnk_color, NULL);

267
  /* head */
268
  value = g_strdup_printf (_("Weather report for: %s.\n\n"), get_data (data->weatherdata, DNAM));
269 270 271
  APPEND_BTEXT (value);
  g_free (value);

272
  date = translate_lsup (get_data (data->weatherdata, LSUP));
273
  value = g_strdup_printf (_("Observation station located in %s\nLast update: %s.\n"),
274
                           get_data (data->weatherdata, OBST), date ? date : get_data (data->weatherdata, LSUP));
275
  g_free (date);
276 277
  APPEND_TEXT_ITEM_REAL (value);

278
  /* Temperature */
279 280 281 282 283
  APPEND_BTEXT (_("\nTemperature\n"));
  APPEND_TEXT_ITEM (_("Temperature"), TEMP);
  APPEND_TEXT_ITEM (_("Windchill"), FLIK);

  /* special case for TRANS because of translate_desc */
284
  value = g_strdup_printf ("\t%s: %s\n", _("Description"),
285
                           translate_desc (get_data (data->weatherdata, TRANS)));
286 287 288
  APPEND_TEXT_ITEM_REAL (value);
  APPEND_TEXT_ITEM (_("Dew point"), DEWP);

289
  /* Wind */
290
  APPEND_BTEXT (_("\nWind\n"));
291
  wind = translate_wind_speed (get_data (data->weatherdata, WIND_SPEED), data->unit);
292 293
  value = g_strdup_printf ("\t%s: %s\n", _("Speed"), wind);
  g_free (wind);
294
  APPEND_TEXT_ITEM_REAL (value);
295

296
  wind = translate_wind_direction (get_data (data->weatherdata, WIND_DIRECTION));
297
  value = g_strdup_printf ("\t%s: %s\n", _("Direction"),
298
                           wind ? wind : get_data (data->weatherdata, WIND_DIRECTION));
299
  g_free (wind);
300 301
  APPEND_TEXT_ITEM_REAL (value);

302
  wind = translate_wind_speed (get_data (data->weatherdata, WIND_GUST), data->unit);
303 304
  value = g_strdup_printf ("\t%s: %s\n", _("Gusts"), wind);
  g_free (wind);
305
  APPEND_TEXT_ITEM_REAL (value);
306

307
  /* UV */
308 309
  APPEND_BTEXT (_("\nUV\n"));
  APPEND_TEXT_ITEM (_("Index"), UV_INDEX);
310
  value = g_strdup_printf ("\t%s: %s\n", _("Risk"),
311
                           translate_risk (get_data (data->weatherdata, UV_TRANS)));
312 313
  APPEND_TEXT_ITEM_REAL (value);

314
  /* Atmospheric pressure */
315 316 317
  APPEND_BTEXT (_("\nAtmospheric pressure\n"));
  APPEND_TEXT_ITEM (_("Pressure"), BAR_R);

318
  value = g_strdup_printf ("\t%s: %s\n",  _("State"),
319
                           translate_bard (get_data (data->weatherdata, BAR_D)));
320 321
  APPEND_TEXT_ITEM_REAL (value);

322
  /* Sun */
323
  APPEND_BTEXT (_("\nSun\n"));
324
  sun_val = translate_time (get_data (data->weatherdata, SUNR));
325
  value = g_strdup_printf ("\t%s: %s\n",
326
                           _("Rise"), sun_val ? sun_val : get_data (data->weatherdata, SUNR));
327
  g_free (sun_val);
328 329
  APPEND_TEXT_ITEM_REAL (value);

330
  sun_val = translate_time (get_data (data->weatherdata, SUNS));
331
  value = g_strdup_printf ("\t%s: %s\n",
332
                           _("Set"), sun_val ? sun_val : get_data (data->weatherdata, SUNS));
333
  g_free (sun_val);
334 335
  APPEND_TEXT_ITEM_REAL (value);

336
  /* Other */
337 338
  APPEND_BTEXT (_("\nOther\n"));
  APPEND_TEXT_ITEM (_("Humidity"), HMID);
339
  vis = translate_visibility (get_data (data->weatherdata, VIS), data->unit);
340 341
  value = g_strdup_printf ("\t%s: %s\n", _("Visibility"), vis);
  g_free (vis);
342
  APPEND_TEXT_ITEM_REAL (value);
343

344 345 346 347 348
  APPEND_BTEXT (_("\nMore on weather.com\n"));
  value = g_strdup_printf("http://www.weather.com/?par=xoap&site=wx_logo&cm_ven=bd_oap&cm_cat=%s&cm_pla=HomePage&cm_ite=Logo",
  		PARTNER_ID);
  g_object_set_data_full(G_OBJECT(ltag0), "url", value, g_free);

349 350 351 352
  APPEND_LINK_ITEM ("\t", get_data (data->weatherdata, LNK1_TXT), get_data (data->weatherdata, LNK1), ltag1);
  APPEND_LINK_ITEM ("\t", get_data (data->weatherdata, LNK2_TXT), get_data (data->weatherdata, LNK2), ltag2);
  APPEND_LINK_ITEM ("\t", get_data (data->weatherdata, LNK3_TXT), get_data (data->weatherdata, LNK3), ltag3);
  APPEND_LINK_ITEM ("\t", get_data (data->weatherdata, LNK4_TXT), get_data (data->weatherdata, LNK4), ltag4);
353 354 355 356 357

  g_signal_connect(G_OBJECT(view), "motion-notify-event",
		   G_CALLBACK(view_motion_notify), view);
  g_signal_connect(G_OBJECT(view), "leave-notify-event",
		   G_CALLBACK(view_leave_notify), view);
358

359 360
  weather_channel_icon = weather_summary_get_logo(data);

361 362 363
  if (weather_channel_icon) {
    weather_channel_evt = gtk_event_box_new();
    gtk_container_add(GTK_CONTAINER(weather_channel_evt), weather_channel_icon);
364
    gtk_text_view_add_child_in_window(GTK_TEXT_VIEW(view), weather_channel_evt,
365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389
                                      GTK_TEXT_WINDOW_TEXT, 0, 0);
    gtk_widget_show_all(weather_channel_evt);
    adj = gtk_scrolled_window_get_vadjustment(
	    GTK_SCROLLED_WINDOW(scrolled));
    g_signal_connect(G_OBJECT(adj), "value-changed",
		     G_CALLBACK(view_scrolled_cb), view);
    g_signal_connect(G_OBJECT(view), "size_allocate",
		     G_CALLBACK(view_size_allocate_cb),
		     view);
    g_signal_connect(G_OBJECT(weather_channel_evt), "button-release-event",
		     G_CALLBACK(icon_clicked),
		     ltag0);
    g_signal_connect(G_OBJECT(weather_channel_evt), "enter-notify-event",
		     G_CALLBACK(icon_motion_notify), view);
    g_signal_connect(G_OBJECT(weather_channel_evt), "visibility-notify-event",
		     G_CALLBACK(icon_motion_notify), view);
    g_signal_connect(G_OBJECT(weather_channel_evt), "motion-notify-event",
		     G_CALLBACK(icon_motion_notify), view);
    g_signal_connect(G_OBJECT(weather_channel_evt), "leave-notify-event",
		     G_CALLBACK(view_leave_notify), view);
  }
  if (hand_cursor == NULL)
    hand_cursor = gdk_cursor_new(GDK_HAND2);
  if (text_cursor == NULL)
    text_cursor = gdk_cursor_new(GDK_XTERM);
390

391

392 393
  return frame;
}
394

395
static GtkWidget *
396 397
make_forecast (xml_dayf *weatherdata,
               units     unit)
398
{
399 400
  GtkWidget *item_vbox, *temp_hbox, *icon_hbox,
            *label, *icon_d, *icon_n, *box_d, *box_n;
401
  GdkPixbuf *icon;
402
  gchar     *str, *day, *wind;
403 404 405 406 407 408 409 410 411 412 413

  DBG ("this day %s", weatherdata->day);

  item_vbox = gtk_vbox_new (FALSE, 0);
  gtk_container_set_border_width (GTK_CONTAINER (item_vbox), 6);


  label = gtk_label_new (NULL);
  gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);

  day = translate_day (get_data_f (weatherdata, WDAY));
414 415
  str = g_strdup_printf ("<b>%s</b>", day ? day : get_data_f (weatherdata, WDAY));
  g_free (day);
416 417 418

  gtk_label_set_markup (GTK_LABEL (label), str);
  g_free (str);
419

420 421 422 423
  gtk_box_pack_start (GTK_BOX (item_vbox), label, FALSE, FALSE, 0);

  icon_hbox = gtk_hbox_new (FALSE, 0);

424
  icon = get_icon (get_data_f (weatherdata, ICON_D), 48);
425 426
  icon_d = gtk_image_new_from_pixbuf (icon);
  box_d = gtk_event_box_new ();
427
  gtk_event_box_set_visible_window (GTK_EVENT_BOX (box_d), FALSE);
428 429
  gtk_container_add (GTK_CONTAINER (box_d), icon_d);

430 431 432
  if (G_LIKELY (icon))
    g_object_unref (G_OBJECT (icon));

433
  icon = get_icon (get_data_f (weatherdata, ICON_N), 48);
434 435
  icon_n = gtk_image_new_from_pixbuf (icon);
  box_n = gtk_event_box_new ();
436
  gtk_event_box_set_visible_window (GTK_EVENT_BOX (box_n), FALSE);
437 438
  gtk_container_add (GTK_CONTAINER (box_n), icon_n);

439 440 441
  if (G_LIKELY (icon))
    g_object_unref (G_OBJECT (icon));

442 443 444
  if (G_UNLIKELY (!tooltips))
    tooltips = gtk_tooltips_new ();

445 446
  str = g_strdup_printf (_("Day: %s"),
                         translate_desc (get_data_f (weatherdata, TRANS_D)));
447 448
  gtk_tooltips_set_tip (tooltips, box_d, str, NULL);
  g_free (str);
449 450 451

  str = g_strdup_printf (_("Night: %s"),
                         translate_desc (get_data_f (weatherdata, TRANS_N)));
452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470
  gtk_tooltips_set_tip (tooltips, box_n, str, NULL);
  g_free (str);

  gtk_box_pack_start (GTK_BOX (icon_hbox), box_d, TRUE, TRUE, 0);
  gtk_box_pack_start (GTK_BOX (icon_hbox), box_n, TRUE, TRUE, 0);
  gtk_box_pack_start (GTK_BOX (item_vbox), icon_hbox, FALSE, FALSE, 0);

  label = gtk_label_new (NULL);
  gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
  gtk_label_set_markup (GTK_LABEL (label), _("<b>Precipitation</b>"));
  gtk_box_pack_start (GTK_BOX (item_vbox), label, FALSE, FALSE, 0);

  temp_hbox = gtk_hbox_new (FALSE, 0);
  label = gtk_label_new (NULL);
  gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
  str = g_strdup_printf ("%s %%", get_data_f (weatherdata, PPCP_D));
  gtk_label_set_markup (GTK_LABEL (label), str);
  g_free (str);
  gtk_box_pack_start (GTK_BOX (temp_hbox), label, TRUE, TRUE, 0);
471

472 473 474 475 476
  label = gtk_label_new (NULL);
  gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
  str = g_strdup_printf ("%s %%", get_data_f (weatherdata, PPCP_N));
  gtk_label_set_markup (GTK_LABEL (label), str);
  g_free (str);
477

478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517
  gtk_box_pack_start (GTK_BOX (temp_hbox), label, TRUE, TRUE, 0);
  gtk_box_pack_start (GTK_BOX (item_vbox), temp_hbox, FALSE, FALSE, 0);

  label = gtk_label_new (NULL);
  gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
  gtk_label_set_markup (GTK_LABEL (label), _("<b>Temperature</b>"));
  gtk_box_pack_start (GTK_BOX (item_vbox), label, FALSE, FALSE, 0);

  temp_hbox = gtk_hbox_new (FALSE, 0);
  label = gtk_label_new (NULL);
  gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
  str = g_strdup_printf ("<span foreground=\"red\">%s</span> %s",
                         get_data_f (weatherdata, TEMP_MAX), get_unit (unit,
                                                                       TEMP));
  gtk_label_set_markup (GTK_LABEL (label), str);
  g_free (str);
  gtk_box_pack_start (GTK_BOX (temp_hbox), label, TRUE, TRUE, 0);
  label = gtk_label_new (NULL);
  gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
  str = g_strdup_printf ("<span foreground=\"blue\">%s</span> %s",
                         get_data_f (weatherdata, TEMP_MIN), get_unit (unit,
                                                                       TEMP));
  gtk_label_set_markup (GTK_LABEL (label), str);
  g_free (str);
  gtk_box_pack_start (GTK_BOX (temp_hbox), label, TRUE, TRUE, 0);
  gtk_box_pack_start (GTK_BOX (item_vbox), temp_hbox, FALSE, FALSE, 0);

  label = gtk_label_new (NULL);
  gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
  gtk_label_set_markup (GTK_LABEL (label), _("<b>Wind</b>"));
  gtk_box_pack_start (GTK_BOX (item_vbox), label, FALSE, FALSE, 0);

  temp_hbox = gtk_hbox_new (FALSE, 0);
  label = gtk_label_new (NULL);
  gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);

  wind = translate_wind_direction (get_data_f (weatherdata, W_DIRECTION_D));
  gtk_label_set_markup (GTK_LABEL (label),
                        wind ? wind : get_data_f (weatherdata,
                                                  W_DIRECTION_D));
518
  g_free (wind);
519 520 521 522 523 524 525 526 527 528

  gtk_box_pack_start (GTK_BOX (temp_hbox), label, TRUE, TRUE, 0);

  label = gtk_label_new (NULL);
  gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);

  wind = translate_wind_direction (get_data_f (weatherdata, W_DIRECTION_N));
  gtk_label_set_markup (GTK_LABEL (label),
                        wind ? wind : get_data_f (weatherdata,
                                                  W_DIRECTION_N));
529 530
  g_free (wind);

531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555
  gtk_box_pack_start (GTK_BOX (temp_hbox), label, TRUE, TRUE, 0);
  gtk_box_pack_start (GTK_BOX (item_vbox), temp_hbox, FALSE, FALSE, 0);

  /* speed */
  temp_hbox = gtk_hbox_new (FALSE, 2);
  label = gtk_label_new (NULL);
  gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
  str = g_strdup_printf ("%s %s", get_data_f (weatherdata, W_SPEED_D),
                         get_unit (unit, WIND_SPEED));
  gtk_label_set_markup (GTK_LABEL (label), str);
  g_free (str);
  gtk_box_pack_start (GTK_BOX (temp_hbox), label, TRUE, TRUE, 0);

  label = gtk_label_new (NULL);
  gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
  str = g_strdup_printf ("%s %s", get_data_f (weatherdata, W_SPEED_N),
                         get_unit (unit, WIND_SPEED));
  gtk_label_set_markup (GTK_LABEL (label), str);
  g_free (str);
  gtk_box_pack_start (GTK_BOX (temp_hbox), label, TRUE, TRUE, 0);
  gtk_box_pack_start (GTK_BOX (item_vbox), temp_hbox, FALSE, FALSE, 0);

  DBG ("Done");

  return item_vbox;
556 557
}

558 559


560
static GtkWidget *
561
create_forecast_tab (xfceweather_data *data)
562
{
563
  GtkWidget *widg = gtk_hbox_new (FALSE, 0);
564
  guint      i;
565

566
  gtk_container_set_border_width (GTK_CONTAINER (widg), 6);
567

568
  if (data->weatherdata && data->weatherdata->dayf)
Nick Schermer's avatar
Nick Schermer committed
569
    {
570
      for (i = 0; i < XML_WEATHER_DAYF_N - 1; i++)
571
        {
572
          if (!data->weatherdata->dayf[i])
573
            break;
Nick Schermer's avatar
Nick Schermer committed
574

575
          DBG ("%s", data->weatherdata->dayf[i]->day);
Nick Schermer's avatar
Nick Schermer committed
576

577
          gtk_box_pack_start (GTK_BOX (widg),
578
                              make_forecast (data->weatherdata->dayf[i], data->unit), FALSE,
579 580 581
                              FALSE, 0);
          gtk_box_pack_start (GTK_BOX (widg), gtk_vseparator_new (), TRUE,
                              TRUE, 0);
582
        }
Nick Schermer's avatar
Nick Schermer committed
583

584
      if (data->weatherdata->dayf[i])
585
        gtk_box_pack_start (GTK_BOX (widg),
586
                            make_forecast (data->weatherdata->dayf[i], data->unit), FALSE, FALSE,
587
                            0);
Nick Schermer's avatar
Nick Schermer committed
588
    }
589

590
  return widg;
591
}
592

593 594 595 596 597 598 599
static void
summary_dialog_response (GtkWidget          *dlg,
                         gint                response,
                         GtkWidget          *window)
{
	if (response == GTK_RESPONSE_ACCEPT)
		gtk_widget_destroy(window);
600
	else if (response == GTK_RESPONSE_HELP)
601 602 603
		g_spawn_command_line_async ("exo-open --launch WebBrowser " PLUGIN_WEBSITE, NULL);
}

604
GtkWidget *
605
create_summary_window (xfceweather_data *data)
606
{
607
  GtkWidget *window, *notebook, *vbox;
608
  gchar     *title;
609
  GdkPixbuf *icon;
610

611 612 613
  window = xfce_titled_dialog_new_with_buttons (_("Weather Update"),
                                                NULL,
                                                GTK_DIALOG_NO_SEPARATOR,
614
                                                GTK_STOCK_ABOUT,
615 616
						GTK_RESPONSE_HELP,
                                                GTK_STOCK_CLOSE,
617
                                                GTK_RESPONSE_ACCEPT, NULL);
618

619
  title = g_strdup_printf (_("Weather report for: %s"), get_data (data->weatherdata, DNAM));
Nick Schermer's avatar
Nick Schermer committed
620

621 622
  xfce_titled_dialog_set_subtitle (XFCE_TITLED_DIALOG (window), title);
  g_free (title);
623

624 625 626
  vbox = gtk_vbox_new (FALSE, 0);
  gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox, TRUE, TRUE,
                      0);
627

628
  icon = get_icon (get_data (data->weatherdata, WICON), 48);
629

630
  if (!icon)
631
    icon = get_icon ("99", 48);
632

633
  gtk_window_set_icon (GTK_WINDOW (window), icon);
634 635 636

  if (G_LIKELY (icon))
    g_object_unref (G_OBJECT (icon));
637

638 639 640
  notebook = gtk_notebook_new ();
  gtk_container_set_border_width (GTK_CONTAINER (notebook), BORDER);
  gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
641
                            create_forecast_tab (data),
642
                            gtk_label_new (_("Forecast")));
643
  gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
644
                            create_summary_tab (data),
645
                            gtk_label_new (_("Details")));
646

647
  gtk_box_pack_start (GTK_BOX (vbox), notebook, TRUE, TRUE, 0);
648

649
  g_signal_connect (G_OBJECT (window), "response",
650
                    G_CALLBACK (summary_dialog_response), window);
651

652
  gtk_window_set_default_size (GTK_WINDOW (window), 500, 400);
653

654
  return window;
655
}