Click here to Skip to main content
15,892,804 members
Articles / Programming Languages / XML

WeatherBar - Weather in the Taskbar

Rate me:
Please Sign up or sign in to vote.
4.36/5 (17 votes)
1 Feb 2010Ms-PL4 min read 52.2K   3.8K   49  
An application designed for Windows 7 to display the weather in a specific location
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.Threading;
using Microsoft.WindowsAPICodePack.Taskbar;
using Microsoft.WindowsAPICodePack.Shell;
using System.Reflection;
using System.Runtime.InteropServices;

namespace WeatherBar
{
    public partial class Form1 : Form
    {
        // The property that determines the icon
        // to be shown for the current weather
        int IconID { get; set; }

        JumpList jumpList;
        TaskbarManager tbManager = TaskbarManager.Instance;

        // The boolean variable
        bool goingUp = false;

        int humidity = 0;

        [DllImport("shell32.dll", SetLastError = true)]
        static extern IntPtr ExtractIcon(IntPtr hInst, string lpszExeFileName, int nIconIndex);

        /// <summary>
        /// Extract an icon from a DLL/EXE. Used to extract
        /// icons from the local embedded native resource
        /// </summary>
        /// <param name="fileName">The name of the executable/DLL</param>
        /// <param name="iconID">Icon index</param>
        /// <returns></returns>
        private Icon GetIcon(string fileName, int iconID)
        {
            Icon ico = null;
            IntPtr hc;

            if (System.IO.File.Exists(fileName))
            {
                try
                {
                    hc = ExtractIcon(this.Handle, fileName, iconID);
                    if (!hc.Equals(IntPtr.Zero))
                    {
                        ico = Icon.FromHandle(hc);
                    }
                }
                catch{}
            }


            return ico;
        }

        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// Check whether it is AM or PM in a specific region
        /// to determine the weather icon (applies to some).
        /// Using the TrueKnowledge API to get the time.
        /// </summary>
        /// <param name="location">Explicit location of the city.</param>
        /// <returns></returns>
        bool isAM(string location)
        {
            bool time = true;

            XmlDocument doc = new XmlDocument();
            try
            {
                doc.Load(string.Format("https://api.trueknowledge.com/direct_answer?question=what+is+the+time+in+{0}&api_account_id=api_application&api_password=n122jb8b75oyk8qx", location));
                XmlNamespaceManager nManager = new XmlNamespaceManager(doc.NameTable);

                nManager.AddNamespace("tk", "http://www.trueknowledge.com/ns/kengine");
                XmlNode node = doc.SelectSingleNode("//tk:text_result", nManager);

                int hours = Convert.ToInt32(node.InnerText.Substring(node.InnerText.IndexOf(',') + 1, 3));
                if ((hours > 18) || (hours < 6))
                    time = false;
                else
                    time = true;
            }
            catch
            {
                time = true;
            }

            return time;
        }

        void Form1_Shown(object sender, System.EventArgs e)
        {
            jumpList = JumpList.CreateJumpList();

            // Only get conditions if there is a location set
            // API returns error value otherwise.
            if (!string.IsNullOrEmpty(Properties.Settings.Default.Location))
            {
                Conditions conditions = Weather.GetCurrentConditions(Properties.Settings.Default.Location);
                UpdateConditions(conditions);
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            while (panel1.Location.Y < 55)
            {
                panel1.Location = new Point(142, panel1.Location.Y + 6);
            }
            timer1.Enabled = false;
            goingUp = true;
            linkLabel1.Text = "Do not change";
        }

        private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            panel1.Visible = true;
            if (goingUp)
            {
                timer2.Enabled = true;
            }
            else
            {
                timer1.Enabled = true;
            }
        }

        private void timer2_Tick(object sender, EventArgs e)
        {
            while (panel1.Location.Y > 0)
            {
                panel1.Location = new Point(142, panel1.Location.Y -6);
            }
            panel1.Visible = false;
            timer2.Enabled = false;
            linkLabel1.Text = "Change location";
            goingUp = false;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Conditions conditions = Weather.GetCurrentConditions(textBox1.Text);
            if (conditions == null)
            {
                MessageBox.Show("Cannot find location.\nPlease enter a valid ZIP code or name.", "WeatherBar", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
            else
            {
                Properties.Settings.Default.Location = conditions.City;
                Properties.Settings.Default.Save();

                timer2.Enabled = true;
                label2.Text = string.Format("{0} °F ({1} °C)", conditions.TempF, conditions.TempC);

                UpdateConditions(conditions);

            }
        }

        /// <summary>
        /// The function to trigger the overall conditions update.
        /// </summary>
        /// <param name="conditions">The instance of Conditions that contains the data.</param>
        void UpdateConditions(Conditions conditions)
        {
            RefreshImage(pictureBox2, conditions);
            this.Icon = GetIcon(Assembly.GetExecutingAssembly().Location, IconID);
            label1.Text = Properties.Settings.Default.Location;

            int x = conditions.Humidity.IndexOf(':');
            string selected = conditions.Humidity.Substring(conditions.Humidity.IndexOf(':')+1, conditions.Humidity.Length - x-2);
            humidity = Convert.ToInt32(selected);
            label3.Text = string.Format ("Humidity: {0}%",humidity.ToString());

            int _humidity = (int)humidity;
            tbManager.SetProgressValue(_humidity, 100);

            if ((_humidity > 0) && (_humidity < 50))
            {
                tbManager.SetProgressState(TaskbarProgressBarState.Normal);
            }
            else if ((_humidity > 50) && (_humidity < 70))
            {
                tbManager.SetProgressState(TaskbarProgressBarState.Paused);
            }
            else
            {
                tbManager.SetProgressState(TaskbarProgressBarState.Error);
            }

            List<Conditions> forecast = Weather.GetForecast(conditions.City);
            label4.Text = forecast[0].DayOfWeek;
            label5.Text = forecast[1].DayOfWeek;
            label6.Text = forecast[2].DayOfWeek;
            label7.Text = forecast[3].DayOfWeek;

            RefreshImage(pictureBox1, forecast[0]);
            RefreshImage(pictureBox3, forecast[1]);
            RefreshImage(pictureBox4, forecast[2]);
            RefreshImage(pictureBox5, forecast[3]);

            jumpList.ClearAllUserTasks();
            AddToJumplist(forecast[0]);
            AddToJumplist(forecast[1]);
            AddToJumplist(forecast[2]);
            AddToJumplist(forecast[3]);

            Assembly assembly = Assembly.GetExecutingAssembly();
            System.Diagnostics.Debug.Print(assembly.GetName().ToString());

            UpdateTemps(label8, label9,forecast,0);
            UpdateTemps(label11, label10, forecast, 1);
            UpdateTemps(label13, label12, forecast, 2);
            UpdateTemps(label15, label14, forecast, 3);

        }

        /// <summary>
        /// Update the temperatures for the forecasted days.
        /// </summary>
        /// <param name="maxLabel">Label to show the maximum temperature.</param>
        /// <param name="minLabel">Label to show the minimum temperature.</param>
        /// <param name="forecast">The list of Conditions instances that contain the forecast.</param>
        /// <param name="itemID">The ID of the forecast day.</param>
        void UpdateTemps(Label maxLabel, Label minLabel, List<Conditions> forecast, int itemID)
        {
            maxLabel.Text = forecast[itemID].High;
            minLabel.Text = forecast[itemID].Low;
        }

        /// <summary>
        /// Add the forecast as JumpListLink
        /// (for each day)
        /// </summary>
        /// <param name="conditions">The Conditions that contains the forecast.</param>
        void AddToJumplist(Conditions conditions)
        {
            JumpListLink jll = new JumpListLink(string.Format("http://www.google.com/ig/api?weather={0}",Properties.Settings.Default.Location), string.Format("{0}  H: {1}  L: {2}", conditions.DayOfWeek, conditions.High, conditions.Low));

            string type = conditions.Condition.ToUpper();

            switch (type)
            {
                case "SCATTERED THUNDERSTORMS":
                    {
                        jll.IconReference = new IconReference(Assembly.GetEntryAssembly().Location, 0);
                        break;
                    }
                case "SHOWERS":
                    {
                        jll.IconReference = new IconReference(Assembly.GetEntryAssembly().Location, 11);
                        break;
                    }
                case "SCATTERED SHOWERS":
                    {
                        jll.IconReference = new IconReference(Assembly.GetEntryAssembly().Location, 11);
                        break;
                    }
                case "RAIN AND SNOW":
                    {
                        jll.IconReference = new IconReference(Assembly.GetEntryAssembly().Location, 42);
                        break;
                    }
                case "OVERCAST":
                    {
                        jll.IconReference = new IconReference(Assembly.GetEntryAssembly().Location, 26);
                        break;
                    }
                case "LIGHT SNOW":
                    {
                        jll.IconReference = new IconReference(Assembly.GetEntryAssembly().Location, 13);
                        break;
                    }
                case "FREEZING DRIZZLE":
                    {
                        jll.IconReference = new IconReference(Assembly.GetEntryAssembly().Location, 20);
                        break;
                    }
                case "CHANCE OF RAIN":
                    {
                        jll.IconReference = new IconReference(Assembly.GetEntryAssembly().Location, 8);
                        break;
                    }
                case "SUNNY":
                    {
                        jll.IconReference = new IconReference(Assembly.GetEntryAssembly().Location, 32);
                        break;
                    }
                case "CLEAR":
                    {
                        if (isAM(conditions.City))
                            jll.IconReference = new IconReference(Assembly.GetEntryAssembly().Location, 32);
                        else
                            jll.IconReference = new IconReference(Assembly.GetEntryAssembly().Location, 31);
                        break;
                    }
                case "MOSTLY SUNNY":
                    {
                        if (isAM(conditions.City))
                            jll.IconReference = new IconReference(Assembly.GetEntryAssembly().Location, 34);
                        else
                            jll.IconReference = new IconReference(Assembly.GetEntryAssembly().Location, 29);
                        break;
                    }
                case "PARTLY CLOUDY":
                    {
                        if (isAM(conditions.City))
                            jll.IconReference = new IconReference(Assembly.GetEntryAssembly().Location, 44);
                        else
                            jll.IconReference = new IconReference(Assembly.GetEntryAssembly().Location, 27);
                        break;
                    }
                case "MOSTLY CLOUDY":
                    {
                        if (isAM(conditions.City))
                            jll.IconReference = new IconReference(Assembly.GetEntryAssembly().Location, 28);
                        else
                            jll.IconReference = new IconReference(Assembly.GetEntryAssembly().Location, 27);
                        break;
                    }
                case "CHANCE OF STORM":
                    {
                        jll.IconReference = new IconReference(Assembly.GetEntryAssembly().Location, 23);
                        break;
                    }
                case "RAIN":
                    {
                        jll.IconReference = new IconReference(Assembly.GetEntryAssembly().Location, 11);
                        break;
                    }
                case "CHANCE OF SNOW":
                    {
                        jll.IconReference = new IconReference(Assembly.GetEntryAssembly().Location, 15);
                        break;
                    }
                case "CLOUDY":
                    {
                        jll.IconReference = new IconReference(Assembly.GetEntryAssembly().Location, 26);
                        break;
                    }
                case "MIST":
                    {
                        jll.IconReference = new IconReference(Assembly.GetEntryAssembly().Location, 20);
                        break;
                    }
                case "STORM":
                    {
                        jll.IconReference = new IconReference(Assembly.GetEntryAssembly().Location, 2);
                        break;
                    }
                case "THUNDERSTORM":
                    {
                        jll.IconReference = new IconReference(Assembly.GetEntryAssembly().Location, 3);
                        break;
                    }
                case "CHANCE OF TSTORM":
                    {
                        jll.IconReference = new IconReference(Assembly.GetEntryAssembly().Location, 35);
                        break;
                    }
                case "SLEET":
                    {
                        jll.IconReference = new IconReference(Assembly.GetEntryAssembly().Location, 25);
                        break;
                    }
                case "SNOW":
                    {
                        jll.IconReference = new IconReference(Assembly.GetEntryAssembly().Location, 14);
                        break;
                    }
                case "ICY":
                    {
                        jll.IconReference = new IconReference(Assembly.GetEntryAssembly().Location, 25);
                        break;
                    }
                case "DUST":
                    {
                        jll.IconReference = new IconReference(Assembly.GetEntryAssembly().Location, 21);
                        break;
                    }
                case "FOG":
                    {
                        jll.IconReference = new IconReference(Assembly.GetEntryAssembly().Location, 20);
                        break;
                    }
                case "SMOKE":
                    {
                        jll.IconReference = new IconReference(Assembly.GetEntryAssembly().Location, 19);
                        break;
                    }
                case "HAZE":
                    {
                        jll.IconReference = new IconReference(Assembly.GetEntryAssembly().Location, 20);
                        break;
                    }
                case "FLURRIES":
                    {
                        jll.IconReference = new IconReference(Assembly.GetEntryAssembly().Location, 41);
                        break;
                    }
                case "LIGHT RAIN":
                    {
                        jll.IconReference = new IconReference(Assembly.GetEntryAssembly().Location, 11);
                        break;
                    }

            }

            jumpList.AddUserTasks(jll);
            jumpList.Refresh();
        }

        /// <summary>
        /// Refresh the weather image for the location
        /// set in the condition passed to the function.
        /// Uses local application resources.
        /// </summary>
        /// <param name="picture">The PictureBox that will contain the picture.</param>
        /// <param name="conditions">The instance of Conditions.</param>
        void RefreshImage(PictureBox picture, Conditions conditions)
        {
            string type = conditions.Condition.ToUpper();

            switch (type)
            {
                case "SCATTERED THUNDERSTORMS":
                    {
                        picture.Image = Properties.Resources._0;
                        IconID = 1;
                        break;
                    }
                case "SHOWERS":
                    {
                        picture.Image = Properties.Resources._11;
                        IconID = 42;
                        break;
                    }
                case "SCATTERED SHOWERS":
                    {
                        picture.Image = Properties.Resources._11;
                        IconID = 42;
                        break;
                    }
                case "RAIN AND SNOW":
                    {
                        picture.Image = Properties.Resources._42;
                        IconID = 42;
                        break;
                    }
                case "OVERCAST":
                    {
                        picture.Image = Properties.Resources._26;
                        IconID = 26;
                        break;
                    }
                case "LIGHT SNOW":
                    {
                        picture.Image = Properties.Resources._13;
                        IconID = 13;
                        break;
                    }
                case "FREEZING DRIZZLE":
                    {
                        picture.Image = Properties.Resources._20;
                        IconID = 20;
                        break;
                    }
                case "CHANCE OF RAIN":
                    {
                        picture.Image = Properties.Resources._8;
                        IconID = 8;
                        break;
                    }
                case "SUNNY":
                    {
                        picture.Image = Properties.Resources._32;
                        IconID = 32;
                        break;
                    }
                case "CLEAR":
                    {
                        if (isAM(conditions.City))
                        {
                            picture.Image = Properties.Resources._32;
                            IconID = 32;
                        }
                        else
                        {
                            picture.Image = Properties.Resources._31;
                            IconID = 31;
                        }
                        break;
                    }
                case "MOSTLY SUNNY":
                    {
                        if (isAM(conditions.City))
                        {
                            picture.Image = Properties.Resources._34;
                            IconID = 34;
                        }
                        else
                        {
                            picture.Image = Properties.Resources._29;
                            IconID = 29;
                        }
                        break;
                    }
                case "PARTLY CLOUDY":
                    {
                        if (isAM(conditions.City))
                        {
                            picture.Image = Properties.Resources._44;
                            IconID = 44;
                        }
                        else
                        {
                            picture.Image = Properties.Resources._27;
                            IconID = 27;
                        }
                        break;
                    }
                case "MOSTLY CLOUDY":
                    {
                        if (isAM(conditions.City))
                        {
                            picture.Image = Properties.Resources._28;
                            IconID = 28;
                        }
                        else
                        {
                            picture.Image = Properties.Resources._27;
                            IconID = 27;
                        }
                        break;
                    }
                case "CHANCE OF STORM":
                    {
                        picture.Image = Properties.Resources._23;
                        IconID = 23;
                        break;
                    }
                case "RAIN":
                    {
                        picture.Image = Properties.Resources._11;
                        IconID = 11;
                        break;
                    }
                case "CHANCE OF SNOW":
                    {
                        picture.Image = Properties.Resources._15;
                        IconID = 15;
                        break;
                    }
                case "CLOUDY":
                    {
                        picture.Image = Properties.Resources._26;
                        IconID = 26;
                        break;
                    }
                case "MIST":
                    {
                        picture.Image = Properties.Resources._20;
                        IconID = 20;
                        break;
                    }
                case "STORM":
                    {
                        picture.Image = Properties.Resources._2;
                        IconID = 2;
                        break;
                    }
                case "THUNDERSTORM":
                    {
                        picture.Image = Properties.Resources._3;
                        IconID = 3;
                        break;
                    }
                case "CHANCE OF TSTORM":
                    {
                        picture.Image = Properties.Resources._35;
                        IconID = 35;
                        break;
                    }
                case "SLEET":
                    {
                        picture.Image = Properties.Resources._25;
                        IconID = 25;
                        break;
                    }
                case "SNOW":
                    {
                        picture.Image = Properties.Resources._14;
                        IconID = 14;
                        break;
                    }
                case "ICY":
                    {
                        picture.Image = Properties.Resources._25;
                        IconID = 25;
                        break;
                    }
                case "DUST":
                    {
                        picture.Image = Properties.Resources._21;
                        IconID = 21;
                        break;
                    }
                case "FOG":
                    {
                        picture.Image = Properties.Resources._20;
                        IconID = 20;
                        break;
                    }
                case "SMOKE":
                    {
                        picture.Image = Properties.Resources._19;
                        IconID = 19;
                        break;
                    }
                case "HAZE":
                    {
                        picture.Image = Properties.Resources._20;
                        IconID = 20;
                        break;
                    }
                case "FLURRIES":
                    {
                        picture.Image = Properties.Resources._41;
                        IconID = 41;
                        break;
                    }
                case "LIGHT RAIN":
                    {
                        picture.Image = Properties.Resources._11;
                        IconID = 11;
                        break;
                    }
                default:
                    {
                        IconID = 32;
                        break;
                    }

            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            AddUSLocation add = new AddUSLocation();
            add.Owner = this;
            add.ShowDialog();
        }

        // Timer that constantly updates the conditions for the specified region.
        private void timer3_Tick(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(Properties.Settings.Default.Location))
            {
                Conditions conditions = Weather.GetCurrentConditions(Properties.Settings.Default.Location);
                UpdateConditions(conditions);
            }
        }
    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Microsoft Public License (Ms-PL)


Written By
Software Developer Independent
Moldova (Republic of) Moldova (Republic of)
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions