diff options
Diffstat (limited to 'mateweather/mateweather-dialog.c')
-rw-r--r-- | mateweather/mateweather-dialog.c | 738 |
1 files changed, 738 insertions, 0 deletions
diff --git a/mateweather/mateweather-dialog.c b/mateweather/mateweather-dialog.c new file mode 100644 index 00000000..86cecd6c --- /dev/null +++ b/mateweather/mateweather-dialog.c @@ -0,0 +1,738 @@ +/* $Id$ */ + +/* + * Papadimitriou Spiros <[email protected]> + * + * This code released under the GNU GPL. + * Read the file COPYING for more information. + * + * Main status dialog + * + */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <assert.h> + +#include <mateconf/mateconf-client.h> + +#define MATEWEATHER_I_KNOW_THIS_IS_UNSTABLE + +#include "mateweather.h" +#include "mateweather-applet.h" +#include "mateweather-pref.h" +#include "mateweather-dialog.h" + +struct _MateWeatherDialogPrivate { + GtkWidget* cond_location; + GtkWidget* cond_update; + GtkWidget* cond_cond; + GtkWidget* cond_sky; + GtkWidget* cond_temp; + GtkWidget* cond_dew; + GtkWidget* cond_humidity; + GtkWidget* cond_wind; + GtkWidget* cond_pressure; + GtkWidget* cond_vis; + GtkWidget* cond_apparent; + GtkWidget* cond_sunrise; + GtkWidget* cond_sunset; + GtkWidget* cond_image; + GtkWidget* forecast_text; + GtkWidget* radar_image; + + MateWeatherApplet* applet; +}; + +enum { + PROP_0, + PROP_MATEWEATHER_APPLET, +}; + +G_DEFINE_TYPE(MateWeatherDialog, mateweather_dialog, GTK_TYPE_DIALOG); + +#define MATEWEATHER_DIALOG_GET_PRIVATE(obj) \ + (G_TYPE_INSTANCE_GET_PRIVATE((obj), MATEWEATHER_TYPE_DIALOG, MateWeatherDialogPrivate)) + +#define MONOSPACE_FONT_DIR "/desktop/mate/interface" +#define MONOSPACE_FONT_KEY MONOSPACE_FONT_DIR "/monospace_font_name" + +static void mateweather_dialog_save_geometry(MateWeatherDialog* dialog) +{ + MateWeatherMateConf* mateconf; + int w, h,; + //int x, y; + + mateconf = dialog->priv->applet->mateconf; + + //gtk_window_get_position(GTK_WINDOW(dialog), &x, &y); + gtk_window_get_size(GTK_WINDOW(dialog), &w, &h); + + mateweather_mateconf_set_int(mateconf, "dialog_width", w, NULL); + mateweather_mateconf_set_int(mateconf, "dialog_height", h, NULL); + // The x and y position must not be stored + //mateweather_mateconf_set_int(mateconf, "dialog_x", x, NULL); + //mateweather_mateconf_set_int(mateconf, "dialog_y", y, NULL); +} + +static void mateweather_dialog_load_geometry(MateWeatherDialog* dialog) +{ + MateWeatherMateConf* mateconf; + int w, h; + //int x, y; + GError *error; + + mateconf = dialog->priv->applet->mateconf; + error = NULL; + + w = mateweather_mateconf_get_int(mateconf, "dialog_width", &error); + + if (error) + { + g_message ("mateweather: no spatial information available"); + g_error_free (error); + return; + } + + h = mateweather_mateconf_get_int(mateconf, "dialog_height", &error); + + if (error) + { + g_message ("mateweather: no spatial information available"); + g_error_free (error); + return; + } + + /*x = mateweather_mateconf_get_int(mateconf, "dialog_x", &error); + + if (error) + { + g_message ("mateweather: no spatial information available"); + g_error_free (error); + return; + } + + y = mateweather_mateconf_get_int(mateconf, "dialog_y", &error); + + if (error) + { + g_message("mateweather: no spatial information available"); + g_error_free(error); + return; + }*/ + + if (w > 0 && h > 0) + { + gtk_window_resize(GTK_WINDOW(dialog), w, h); + } + + /*if (x > 0 && y > 0) + { + gtk_window_move(GTK_WINDOW(dialog), x, y); + }*/ +} + +static void response_cb(MateWeatherDialog* dialog, gint id, gpointer data) +{ + if (id == GTK_RESPONSE_OK) { + mateweather_update (dialog->priv->applet); + + mateweather_dialog_update (dialog); + } else { + gtk_widget_destroy (GTK_WIDGET(dialog)); + } +} + +static void link_cb(GtkButton* button, gpointer data) +{ + gtk_show_uri (gtk_widget_get_screen (GTK_WIDGET (button)), + "http://www.weather.com/", + gtk_get_current_event_time (), + NULL); +} + +static gchar* replace_multiple_new_lines(gchar* s) +{ + gchar *prev_s = s; + gint count = 0; + gint i; + + if (s == NULL) { + return s; + } + + for (;*s != '\0';s++) { + + count = 0; + + if (*s == '\n') { + s++; + while (*s == '\n' || *s == ' ') { + count++; + s++; + } + } + for (i = count; i > 1; i--) { + *(s - i) = ' '; + } + } + return prev_s; +} + +static void mateweather_dialog_create(MateWeatherDialog* dialog) +{ + MateWeatherDialogPrivate *priv; + MateWeatherApplet *gw_applet; + + GtkWidget *weather_vbox; + GtkWidget *weather_notebook; + GtkWidget *cond_hbox; + GtkWidget *cond_table; + GtkWidget *cond_location_lbl; + GtkWidget *cond_update_lbl; + GtkWidget *cond_temp_lbl; + GtkWidget *cond_cond_lbl; + GtkWidget *cond_sky_lbl; + GtkWidget *cond_wind_lbl; + GtkWidget *cond_humidity_lbl; + GtkWidget *cond_pressure_lbl; + GtkWidget *cond_vis_lbl; + GtkWidget *cond_dew_lbl; + GtkWidget *cond_apparent_lbl; + GtkWidget *cond_sunrise_lbl; + GtkWidget *cond_sunset_lbl; + GtkWidget *cond_frame_alignment; + GtkWidget *current_note_lbl; + GtkWidget *forecast_note_lbl; + GtkWidget *radar_note_lbl; + GtkWidget *radar_vbox; + GtkWidget *radar_link_btn; + GtkWidget *radar_link_alignment; + GtkWidget *forecast_hbox; + GtkWidget *ebox; + GtkWidget *scrolled_window; + GtkWidget *imagescroll_window; + + priv = dialog->priv; + gw_applet = priv->applet; + + g_object_set (dialog, "destroy-with-parent", TRUE, NULL); + gtk_window_set_title (GTK_WINDOW (dialog), _("Details")); + gtk_dialog_add_buttons (GTK_DIALOG (dialog), + _("_Update"), GTK_RESPONSE_OK, + GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, + NULL); + gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_CLOSE); + gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE); + gtk_container_set_border_width (GTK_CONTAINER (dialog), 5); + gtk_box_set_spacing (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), 2); + gtk_container_set_border_width (GTK_CONTAINER (dialog), 5); + + if (gw_applet->mateweather_pref.radar_enabled) + gtk_window_set_default_size (GTK_WINDOW (dialog), 570,440); + else + gtk_window_set_default_size (GTK_WINDOW (dialog), 590, 340); + + gtk_window_set_screen (GTK_WINDOW (dialog), + gtk_widget_get_screen (GTK_WIDGET (gw_applet->applet))); + mateweather_dialog_load_geometry (dialog); + + /* Must come after load geometry, otherwise it will get reset. */ + gtk_window_set_resizable (GTK_WINDOW (dialog), TRUE); + + weather_vbox = gtk_dialog_get_content_area (GTK_DIALOG (dialog)); + gtk_widget_show (weather_vbox); + + weather_notebook = gtk_notebook_new (); + gtk_container_set_border_width (GTK_CONTAINER (weather_notebook), 5); + gtk_widget_show (weather_notebook); + gtk_box_pack_start (GTK_BOX (weather_vbox), weather_notebook, TRUE, TRUE, 0); + + cond_hbox = gtk_hbox_new (FALSE, 2); + gtk_widget_show (cond_hbox); + gtk_container_add (GTK_CONTAINER (weather_notebook), cond_hbox); + gtk_container_set_border_width (GTK_CONTAINER (cond_hbox), 4); + + cond_table = gtk_table_new (13, 2, FALSE); + gtk_widget_show (cond_table); + gtk_box_pack_start (GTK_BOX (cond_hbox), cond_table, TRUE, TRUE, 0); + gtk_container_set_border_width (GTK_CONTAINER (cond_table), 12); + gtk_table_set_row_spacings (GTK_TABLE (cond_table), 6); + gtk_table_set_col_spacings (GTK_TABLE (cond_table), 12); + + cond_location_lbl = gtk_label_new (_("City:")); + gtk_widget_show (cond_location_lbl); + gtk_table_attach (GTK_TABLE (cond_table), cond_location_lbl, 0, 1, 0, 1, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_label_set_justify (GTK_LABEL (cond_location_lbl), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment (GTK_MISC (cond_location_lbl), 0, 0.5); + + cond_update_lbl = gtk_label_new (_("Last update:")); + gtk_widget_show (cond_update_lbl); + gtk_table_attach (GTK_TABLE (cond_table), cond_update_lbl, 0, 1, 1, 2, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_label_set_justify (GTK_LABEL (cond_update_lbl), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment (GTK_MISC (cond_update_lbl), 0, 0.5); + + cond_cond_lbl = gtk_label_new (_("Conditions:")); + gtk_widget_show (cond_cond_lbl); + gtk_table_attach (GTK_TABLE (cond_table), cond_cond_lbl, 0, 1, 2, 3, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_label_set_justify (GTK_LABEL (cond_cond_lbl), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment (GTK_MISC (cond_cond_lbl), 0, 0.5); + + cond_sky_lbl = gtk_label_new (_("Sky:")); + gtk_widget_show (cond_sky_lbl); + gtk_table_attach (GTK_TABLE (cond_table), cond_sky_lbl, 0, 1, 3, 4, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_label_set_justify (GTK_LABEL (cond_sky_lbl), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment (GTK_MISC (cond_sky_lbl), 0, 0.5); + + cond_temp_lbl = gtk_label_new (_("Temperature:")); + gtk_widget_show (cond_temp_lbl); + gtk_table_attach (GTK_TABLE (cond_table), cond_temp_lbl, 0, 1, 4, 5, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_label_set_justify (GTK_LABEL (cond_temp_lbl), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment (GTK_MISC (cond_temp_lbl), 0, 0.5); + + cond_apparent_lbl = gtk_label_new (_("Feels like:")); + gtk_widget_show (cond_apparent_lbl); + gtk_table_attach (GTK_TABLE (cond_table), cond_apparent_lbl, 0, 1, 5, 6, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_label_set_justify (GTK_LABEL (cond_apparent_lbl), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment (GTK_MISC (cond_apparent_lbl), 0, 0.5); + + cond_dew_lbl = gtk_label_new (_("Dew point:")); + gtk_widget_show (cond_dew_lbl); + gtk_table_attach (GTK_TABLE (cond_table), cond_dew_lbl, 0, 1, 6, 7, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_label_set_justify (GTK_LABEL (cond_dew_lbl), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment (GTK_MISC (cond_dew_lbl), 0, 0.5); + + cond_humidity_lbl = gtk_label_new (_("Relative humidity:")); + gtk_widget_show (cond_humidity_lbl); + gtk_table_attach (GTK_TABLE (cond_table), cond_humidity_lbl, 0, 1, 7, 8, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_label_set_justify (GTK_LABEL (cond_humidity_lbl), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment (GTK_MISC (cond_humidity_lbl), 0, 0.5); + + cond_wind_lbl = gtk_label_new (_("Wind:")); + gtk_widget_show (cond_wind_lbl); + gtk_table_attach (GTK_TABLE (cond_table), cond_wind_lbl, 0, 1, 8, 9, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_label_set_justify (GTK_LABEL (cond_wind_lbl), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment (GTK_MISC (cond_wind_lbl), 0, 0.5); + + cond_pressure_lbl = gtk_label_new (_("Pressure:")); + gtk_widget_show (cond_pressure_lbl); + gtk_table_attach (GTK_TABLE (cond_table), cond_pressure_lbl, 0, 1, 9, 10, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_label_set_justify (GTK_LABEL (cond_pressure_lbl), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment (GTK_MISC (cond_pressure_lbl), 0, 0.5); + + cond_vis_lbl = gtk_label_new (_("Visibility:")); + gtk_widget_show (cond_vis_lbl); + gtk_table_attach (GTK_TABLE (cond_table), cond_vis_lbl, 0, 1, 10, 11, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_label_set_justify (GTK_LABEL (cond_vis_lbl), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment (GTK_MISC (cond_vis_lbl), 0, 0.5); + + cond_sunrise_lbl = gtk_label_new (_("Sunrise:")); + gtk_widget_show (cond_sunrise_lbl); + gtk_table_attach (GTK_TABLE (cond_table), cond_sunrise_lbl, 0, 1, 11, 12, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_label_set_justify (GTK_LABEL (cond_sunrise_lbl), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment (GTK_MISC (cond_sunrise_lbl), 0, 0.5); + + cond_sunset_lbl = gtk_label_new (_("Sunset:")); + gtk_widget_show (cond_sunset_lbl); + gtk_table_attach (GTK_TABLE (cond_table), cond_sunset_lbl, 0, 1, 12, 13, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_label_set_justify (GTK_LABEL (cond_sunset_lbl), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment (GTK_MISC (cond_sunset_lbl), 0, 0.5); + + priv->cond_location = gtk_label_new (""); + gtk_widget_show (priv->cond_location); + gtk_table_attach (GTK_TABLE (cond_table), priv->cond_location, 1, 2, 0, 1, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_label_set_selectable (GTK_LABEL (priv->cond_location), TRUE); + gtk_label_set_justify (GTK_LABEL (priv->cond_location), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment (GTK_MISC (priv->cond_location), 0, 0.5); + + priv->cond_update = gtk_label_new (""); + gtk_widget_show (priv->cond_update); + gtk_table_attach (GTK_TABLE (cond_table), priv->cond_update, 1, 2, 1, 2, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_label_set_selectable (GTK_LABEL (priv->cond_update), TRUE); + gtk_label_set_justify (GTK_LABEL (priv->cond_update), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment (GTK_MISC (priv->cond_update), 0, 0.5); + + priv->cond_cond = gtk_label_new (""); + gtk_widget_show (priv->cond_cond); + gtk_table_attach (GTK_TABLE (cond_table), priv->cond_cond, 1, 2, 2, 3, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_label_set_selectable (GTK_LABEL (priv->cond_cond), TRUE); + gtk_label_set_justify (GTK_LABEL (priv->cond_cond), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment (GTK_MISC (priv->cond_cond), 0, 0.5); + + priv->cond_sky = gtk_label_new (""); + gtk_widget_show (priv->cond_sky); + gtk_table_attach (GTK_TABLE (cond_table), priv->cond_sky, 1, 2, 3, 4, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_label_set_selectable (GTK_LABEL (priv->cond_sky), TRUE); + gtk_label_set_justify (GTK_LABEL (priv->cond_sky), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment (GTK_MISC (priv->cond_sky), 0, 0.5); + + priv->cond_temp = gtk_label_new (""); + gtk_widget_show (priv->cond_temp); + gtk_table_attach (GTK_TABLE (cond_table), priv->cond_temp, 1, 2, 4, 5, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_label_set_selectable (GTK_LABEL (priv->cond_temp), TRUE); + gtk_label_set_justify (GTK_LABEL (priv->cond_temp), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment (GTK_MISC (priv->cond_temp), 0, 0.5); + + priv->cond_apparent = gtk_label_new (""); + gtk_widget_show (priv->cond_apparent); + gtk_table_attach (GTK_TABLE (cond_table), priv->cond_apparent, 1, 2, 5, 6, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_label_set_selectable (GTK_LABEL (priv->cond_apparent), TRUE); + gtk_label_set_justify (GTK_LABEL (priv->cond_apparent), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment (GTK_MISC (priv->cond_apparent), 0, 0.5); + + priv->cond_dew = gtk_label_new (""); + gtk_widget_show (priv->cond_dew); + gtk_table_attach (GTK_TABLE (cond_table), priv->cond_dew, 1, 2, 6, 7, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_label_set_selectable (GTK_LABEL (priv->cond_dew), TRUE); + gtk_label_set_justify (GTK_LABEL (priv->cond_dew), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment (GTK_MISC (priv->cond_dew), 0, 0.5); + + priv->cond_humidity = gtk_label_new (""); + gtk_widget_show (priv->cond_humidity); + gtk_table_attach (GTK_TABLE (cond_table), priv->cond_humidity, 1, 2, 7, 8, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_label_set_selectable (GTK_LABEL (priv->cond_humidity), TRUE); + gtk_label_set_justify (GTK_LABEL (priv->cond_humidity), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment (GTK_MISC (priv->cond_humidity), 0, 0.5); + + priv->cond_wind = gtk_label_new (""); + gtk_widget_show (priv->cond_wind); + gtk_table_attach (GTK_TABLE (cond_table), priv->cond_wind, 1, 2, 8, 9, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_label_set_selectable (GTK_LABEL (priv->cond_wind), TRUE); + gtk_label_set_justify (GTK_LABEL (priv->cond_wind), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment (GTK_MISC (priv->cond_wind), 0, 0.5); + + priv->cond_pressure = gtk_label_new (""); + gtk_widget_show (priv->cond_pressure); + gtk_table_attach (GTK_TABLE (cond_table), priv->cond_pressure, 1, 2, 9, 10, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_label_set_selectable (GTK_LABEL (priv->cond_pressure), TRUE); + gtk_label_set_justify (GTK_LABEL (priv->cond_pressure), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment (GTK_MISC (priv->cond_pressure), 0, 0.5); + + priv->cond_vis = gtk_label_new (""); + gtk_widget_show (priv->cond_vis); + gtk_table_attach (GTK_TABLE (cond_table), priv->cond_vis, 1, 2, 10, 11, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_label_set_selectable (GTK_LABEL (priv->cond_vis), TRUE); + gtk_label_set_justify (GTK_LABEL (priv->cond_vis), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment (GTK_MISC (priv->cond_vis), 0, 0.5); + + priv->cond_sunrise = gtk_label_new (""); + gtk_widget_show (priv->cond_sunrise); + gtk_table_attach (GTK_TABLE (cond_table), priv->cond_sunrise, 1, 2, 11, 12, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_label_set_selectable (GTK_LABEL (priv->cond_sunrise), TRUE); + gtk_label_set_justify (GTK_LABEL (priv->cond_sunrise), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment (GTK_MISC (priv->cond_sunrise), 0, 0.5); + + priv->cond_sunset = gtk_label_new (""); + gtk_widget_show (priv->cond_sunset); + gtk_table_attach (GTK_TABLE (cond_table), priv->cond_sunset, 1, 2, 12, 13, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_label_set_selectable (GTK_LABEL (priv->cond_sunset), TRUE); + gtk_label_set_justify (GTK_LABEL (priv->cond_sunset), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment (GTK_MISC (priv->cond_sunset), 0, 0.5); + + cond_frame_alignment = gtk_alignment_new (0.5, 0, 1, 0); + gtk_widget_show (cond_frame_alignment); + gtk_box_pack_end (GTK_BOX (cond_hbox), cond_frame_alignment, FALSE, FALSE, 0); + gtk_container_set_border_width (GTK_CONTAINER (cond_frame_alignment), 2); + + priv->cond_image = gtk_image_new_from_icon_name ("stock-unknown", GTK_ICON_SIZE_BUTTON); + gtk_widget_show (priv->cond_image); + gtk_container_add (GTK_CONTAINER (cond_frame_alignment), priv->cond_image); + + current_note_lbl = gtk_label_new (_("Current Conditions")); + gtk_widget_show (current_note_lbl); + gtk_notebook_set_tab_label (GTK_NOTEBOOK (weather_notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (weather_notebook), 0), current_note_lbl); + + if (gw_applet->mateweather_pref.location->zone_valid) { + + forecast_hbox = gtk_hbox_new(FALSE, 0); + gtk_container_set_border_width (GTK_CONTAINER (forecast_hbox), 12); + gtk_widget_show (forecast_hbox); + + scrolled_window = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), + GTK_SHADOW_ETCHED_IN); + + priv->forecast_text = gtk_text_view_new (); + set_access_namedesc (priv->forecast_text, _("Forecast Report"), _("See the ForeCast Details")); + gtk_container_add (GTK_CONTAINER (scrolled_window), priv->forecast_text); + gtk_text_view_set_editable (GTK_TEXT_VIEW (priv->forecast_text), FALSE); + gtk_text_view_set_left_margin (GTK_TEXT_VIEW (priv->forecast_text), 6); + gtk_widget_show (priv->forecast_text); + gtk_widget_show (scrolled_window); + gtk_box_pack_start (GTK_BOX (forecast_hbox), scrolled_window, TRUE, TRUE, 0); + + gtk_container_add (GTK_CONTAINER (weather_notebook), forecast_hbox); + + forecast_note_lbl = gtk_label_new (_("Forecast")); + gtk_widget_show (forecast_note_lbl); + gtk_notebook_set_tab_label (GTK_NOTEBOOK (weather_notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (weather_notebook), 1), forecast_note_lbl); + + } + + if (gw_applet->mateweather_pref.radar_enabled) { + + radar_note_lbl = gtk_label_new_with_mnemonic (_("Radar Map")); + gtk_widget_show (radar_note_lbl); + + radar_vbox = gtk_vbox_new (FALSE, 6); + gtk_widget_show (radar_vbox); + gtk_notebook_append_page (GTK_NOTEBOOK (weather_notebook), radar_vbox, radar_note_lbl); + gtk_container_set_border_width (GTK_CONTAINER (radar_vbox), 6); + + priv->radar_image = gtk_image_new (); + + imagescroll_window = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (imagescroll_window), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (imagescroll_window), + GTK_SHADOW_ETCHED_IN); + + ebox = gtk_event_box_new (); + gtk_widget_show (ebox); + + gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(imagescroll_window),ebox); + gtk_box_pack_start (GTK_BOX (radar_vbox), imagescroll_window, TRUE, TRUE, 0); + gtk_widget_show (priv->radar_image); + gtk_widget_show (imagescroll_window); + + gtk_container_add (GTK_CONTAINER (ebox), priv->radar_image); + + radar_link_alignment = gtk_alignment_new (0.5, 0.5, 0, 0); + gtk_widget_show (radar_link_alignment); + gtk_box_pack_start (GTK_BOX (radar_vbox), radar_link_alignment, FALSE, FALSE, 0); + + radar_link_btn = gtk_button_new_with_mnemonic (_("_Visit Weather.com")); + set_access_namedesc (radar_link_btn, _("Visit Weather.com"), _("Click to Enter Weather.com")); + gtk_widget_set_size_request (radar_link_btn, 450, -2); + gtk_widget_show (radar_link_btn); + if (!mateweather_mateconf_get_bool (gw_applet->mateconf, "use_custom_radar_url", NULL)) + gtk_container_add (GTK_CONTAINER (radar_link_alignment), radar_link_btn); + + g_signal_connect (G_OBJECT (radar_link_btn), "clicked", + G_CALLBACK (link_cb), NULL); + + } + + g_signal_connect (G_OBJECT (dialog), "response", G_CALLBACK (response_cb), NULL); + +} + +static PangoFontDescription* get_system_monospace_font(void) +{ + PangoFontDescription *desc = NULL; + MateConfClient *conf; + char *name; + + conf = mateconf_client_get_default (); + name = mateconf_client_get_string (conf, MONOSPACE_FONT_KEY, NULL); + + if (name) { + desc = pango_font_description_from_string (name); + g_free (name); + } + + g_object_unref (conf); + + return desc; +} + +void mateweather_dialog_update(MateWeatherDialog* dialog) +{ + MateWeatherDialogPrivate *priv; + MateWeatherApplet *gw_applet; + gchar *forecast; + GtkTextBuffer *buffer; + PangoFontDescription *font_desc; + const gchar *icon_name; + + priv = dialog->priv; + gw_applet = priv->applet; + + /* Check for parallel network update in progress */ + if(gw_applet->mateweather_info == NULL) + return; + + /* Update icon */ + icon_name = weather_info_get_icon_name (gw_applet->mateweather_info); + gtk_image_set_from_icon_name (GTK_IMAGE (priv->cond_image), + icon_name, GTK_ICON_SIZE_DIALOG); + + /* Update current condition fields and forecast */ + gtk_label_set_text(GTK_LABEL(priv->cond_location), weather_info_get_location_name(gw_applet->mateweather_info)); + gtk_label_set_text(GTK_LABEL(priv->cond_update), weather_info_get_update(gw_applet->mateweather_info)); + gtk_label_set_text(GTK_LABEL(priv->cond_cond), weather_info_get_conditions(gw_applet->mateweather_info)); + gtk_label_set_text(GTK_LABEL(priv->cond_sky), weather_info_get_sky(gw_applet->mateweather_info)); + gtk_label_set_text(GTK_LABEL(priv->cond_temp), weather_info_get_temp(gw_applet->mateweather_info)); + gtk_label_set_text(GTK_LABEL(priv->cond_apparent), weather_info_get_apparent(gw_applet->mateweather_info)); + gtk_label_set_text(GTK_LABEL(priv->cond_dew), weather_info_get_dew(gw_applet->mateweather_info)); + gtk_label_set_text(GTK_LABEL(priv->cond_humidity), weather_info_get_humidity(gw_applet->mateweather_info)); + gtk_label_set_text(GTK_LABEL(priv->cond_wind), weather_info_get_wind(gw_applet->mateweather_info)); + gtk_label_set_text(GTK_LABEL(priv->cond_pressure), weather_info_get_pressure(gw_applet->mateweather_info)); + gtk_label_set_text(GTK_LABEL(priv->cond_vis), weather_info_get_visibility(gw_applet->mateweather_info)); + gtk_label_set_text(GTK_LABEL(priv->cond_sunrise), weather_info_get_sunrise(gw_applet->mateweather_info)); + gtk_label_set_text(GTK_LABEL(priv->cond_sunset), weather_info_get_sunset(gw_applet->mateweather_info)); + + /* Update forecast */ + if (gw_applet->mateweather_pref.location->zone_valid) { + font_desc = get_system_monospace_font (); + if (font_desc) { + gtk_widget_modify_font (priv->forecast_text, font_desc); + pango_font_description_free (font_desc); + } + + buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (priv->forecast_text)); + forecast = g_strdup(weather_info_get_forecast(gw_applet->mateweather_info)); + if (forecast) { + forecast = g_strstrip(replace_multiple_new_lines(forecast)); + gtk_text_buffer_set_text(buffer, forecast, -1); + g_free(forecast); + } else { + gtk_text_buffer_set_text(buffer, _("Forecast not currently available for this location."), -1); + } + } + + /* Update radar map */ + if (gw_applet->mateweather_pref.radar_enabled) { + GdkPixbufAnimation *radar; + + radar = weather_info_get_radar (gw_applet->mateweather_info); + if (radar) { + gtk_image_set_from_animation (GTK_IMAGE (priv->radar_image), radar); + } + } +} + +static void mateweather_dialog_set_property(GObject* object, guint prop_id, const GValue* value, GParamSpec* pspec) +{ + MateWeatherDialog *dialog = MATEWEATHER_DIALOG (object); + + switch (prop_id) { + case PROP_MATEWEATHER_APPLET: + dialog->priv->applet = g_value_get_pointer (value); + break; + } +} + +static void mateweather_dialog_get_property(GObject* object, guint prop_id, GValue* value, GParamSpec* pspec) +{ + MateWeatherDialog *dialog = MATEWEATHER_DIALOG (object); + + switch (prop_id) { + case PROP_MATEWEATHER_APPLET: + g_value_set_pointer (value, dialog->priv->applet); + break; + } +} + +static void mateweather_dialog_init(MateWeatherDialog* self) +{ + self->priv = MATEWEATHER_DIALOG_GET_PRIVATE (self); +} + +static GObject* mateweather_dialog_constructor(GType type, guint n_construct_params, GObjectConstructParam* construct_params) +{ + GObject *object; + MateWeatherDialog *self; + + object = G_OBJECT_CLASS (mateweather_dialog_parent_class)-> + constructor (type, n_construct_params, construct_params); + self = MATEWEATHER_DIALOG (object); + + mateweather_dialog_create (self); + mateweather_dialog_update (self); + + return object; +} + +GtkWidget* mateweather_dialog_new(MateWeatherApplet* applet) +{ + return g_object_new(MATEWEATHER_TYPE_DIALOG, + "mateweather-applet", applet, + NULL); +} + +static void mateweather_dialog_unrealize(GtkWidget* widget) +{ + MateWeatherDialog* self = MATEWEATHER_DIALOG(widget); + + mateweather_dialog_save_geometry(self); + + GTK_WIDGET_CLASS(mateweather_dialog_parent_class)->unrealize(widget); +} + +static void mateweather_dialog_class_init(MateWeatherDialogClass* klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + mateweather_dialog_parent_class = g_type_class_peek_parent (klass); + + object_class->set_property = mateweather_dialog_set_property; + object_class->get_property = mateweather_dialog_get_property; + object_class->constructor = mateweather_dialog_constructor; + widget_class->unrealize = mateweather_dialog_unrealize; + + /* This becomes an OBJECT property when MateWeatherApplet is redone */ + g_object_class_install_property(object_class, PROP_MATEWEATHER_APPLET, g_param_spec_pointer ("mateweather-applet", "MateWeather Applet", "The MateWeather Applet", G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + + g_type_class_add_private(klass, sizeof(MateWeatherDialogPrivate)); +} |