Click here to Skip to main content
15,886,055 members
Articles / Web Development / ASP.NET

RSS Reader Web Part with tab support and asynchronous periodic data refresh using AJAX

Rate me:
Please Sign up or sign in to vote.
2.60/5 (6 votes)
23 Feb 2008CPOL4 min read 102.3K   391   16  
Creating an RSS Reader Web Part with tab support and asynchronous periodic data refresh using AJAX.
using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Xml.Serialization;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebPartPages;
using System.Xml;
//using System.Net;
using AjaxControlToolkit;
namespace RSSReaderAjax
{
    [DefaultProperty("Text"),
      ToolboxData("<{0}:RSSReaderAjax runat=server></{0}:RSSReaderAjax>"),
       XmlRoot(Namespace = "RSSReaderAjax")]
    public class RSSReaderAjax :WebPart
    {

        #region Fields
        private string []_rssurl=new string[4];
        private string[] _rssimgurl = new string[4];
        TextBox []txturl=new TextBox[4];
        LinkButton[] btnfetchrss = new LinkButton[4];
        LinkButton[] btnrefresh = new LinkButton[4];
        LinkButton []btnreset=new LinkButton[4];
        TabPanel []tabs=new TabPanel[4];
        TabContainer tc;
        Label[] rsstext = new Label[4];
        UpdatePanel rsspanel;
        UpdateProgress rssprogress;
        Timer ajaxtimer;
      //  Image[] imgtab = new Image[4];
        int _updateinterval=120;
        int _imgpanelwidth = 0;

        string plusimage;
        string minusimage;
        const string rssstr="_layouts/listfeed.aspx";
        string togglescript = @"function ToggleDescription(currentDiv,parentdiv,plus,minus)
                                    {
                                    
                                        if(currentDiv.style.display == 'none')
                                        {
                                            currentDiv.style.display = 'block';
                                            parentdiv.src=minus;
                                        }
                                        else
                                        {
                                            currentDiv.style.display = 'none';
                                            parentdiv.src=plus;
                                        }
                                        currentDiv.style.paddingLeft='25';

                                    }

                              
                                    function ToggleItemDescription(currentDiv,plus,minus) 
                                    {
                                        var parentdiv='ctl_'+currentDiv;
                                        ToggleDescription(document.getElementById(currentDiv),document.getElementById(parentdiv),plus,minus);
                                        
                                       
                                    }";

        #endregion

        #region customproperties
        [DefaultValue("")]
        [WebPartStorage(Storage.Shared)]
        [FriendlyNameAttribute("1st RSS Feed URL")]
        [Description("Put 1st the RSS Feed URL")]
        [Browsable(true)]
        [XmlElement(ElementName = "RSSUrl")]
        public string RSSUrl
        {
            get
            {
                return _rssurl[0];
            }
            set
            {
                _rssurl[0] = MakeRssUrl(value);
            }
        }




        [DefaultValue("")]
        [WebPartStorage(Storage.Shared)]
        [FriendlyNameAttribute("1st Tab Image URL")]
        [Description("Put 1st Tab Imag URL")]
        [Browsable(true)]
        [XmlElement(ElementName = "RSSimgUrl")]
        public string RSSImgUrl
        {
            get
            {
                return _rssimgurl[0];
            }
            set
            {
                _rssimgurl[0] = value;

            }
        }

        [DefaultValue("")]
        [WebPartStorage(Storage.Shared)]
        [FriendlyNameAttribute("2nd RSS feed URL")]
        [Description("Put 2nd the RSS Feed URL")]
        [Browsable(true)]
        [XmlElement(ElementName = "RSSUrl1")]
        public string RSSUrl1
        {
            get
            {
                return _rssurl[1];
            }
            set
            {
                _rssurl[1] = value;

            }
        }
        [DefaultValue("")]
        [WebPartStorage(Storage.Shared)]
        [FriendlyNameAttribute("2nd Tab Image URL")]
        [Description("Put 2nd Tab Image URL")]
        [Browsable(true)]
        [XmlElement(ElementName = "RSSimgUrl1")]
        public string RSSImgUrl1
        {
            get
            {
                return _rssimgurl[1];
            }
            set
            {
                _rssimgurl[1] = value;

            }
        }


        [DefaultValue("")]
        [WebPartStorage(Storage.Shared)]
        [FriendlyNameAttribute("3rd RSS Feed URL")]
        [Description("Put 3rd the RSS Feed URL")]
        [Browsable(true)]
        [XmlElement(ElementName = "RSSUrl2")]
        public string RSSUrl2
        {
            get
            {
                return _rssurl[2];
            }
            set
            {
                _rssurl[2] = value;

            }
        }

        [DefaultValue("")]
        [WebPartStorage(Storage.Shared)]
        [FriendlyNameAttribute("3rd Tab Image URL")]
        [Description("Put 3rd Tab Image URL")]
        [Browsable(true)]
        [XmlElement(ElementName = "RSSimgUrl2")]
        public string RSSImgUrl2
        {
            get
            {
                return _rssimgurl[2];
            }
            set
            {
                _rssimgurl[2] = value;

            }
        }

        [DefaultValue("")]
        [WebPartStorage(Storage.Shared)]
        [FriendlyNameAttribute("4th RSS Feed URL")]
        [Description("Put the 4th RSS Feed URL")]
        [Browsable(true)]
        [XmlElement(ElementName = "RSSUrl3")]
        public string RSSUrl3
        {
            get
            {
                return _rssurl[3];
            }
            set
            {
                _rssurl[3] = value;

            }
        }


        [DefaultValue("")]
        [WebPartStorage(Storage.Shared)]
        [FriendlyNameAttribute("4th Tab Image URL")]
        [Description("Put the 4th Tab Image URL")]
        [Browsable(true)]
        [XmlElement(ElementName = "RSSimgUrl3")]
        public string RSSImgUrl3
        {
            get
            {
                return _rssimgurl[3];
            }
            set
            {
                _rssimgurl[3] = value;

            }
        }


        [DefaultValue(120)]
        [WebPartStorage(Storage.Shared)]
        [FriendlyNameAttribute("Update Interval")]
        [Description("Specify(in secs) how often feed should update")]
        [Browsable(true)]
        [XmlElement(ElementName = "UpdateInterval")]
        public int UpdateInterval
        {
            get
            {
                return _updateinterval;;
            }
            set
            {
                try
                {
                    _updateinterval =value;
                }
                catch (Exception)
                {
                    _updateinterval = 120;
                }
                

            }
        }

        [DefaultValue(0)]
        [WebPartStorage(Storage.Shared)]
        [FriendlyNameAttribute("Image Panel Width(in pixels, Put 0 to autofit image)")]
        [Description("Please specify the width of image panel in pixels")]
        [Browsable(true)]
        [XmlElement(ElementName = "ImagePanel")]
        public int ImgPanelWidth
        {
            get
            {
                return _imgpanelwidth;
            }
            set
            {
                try
                {
                    _imgpanelwidth = value;
                }
                catch (Exception)
                {
                    _imgpanelwidth = 200;
                }

            }
        }
        #endregion


        #region functions

        protected override void CreateChildControls()
        {
            base.CreateChildControls();
            #region Ajax_start

            EnsurePanelFix();

            rsspanel = new UpdatePanel();
            rsspanel.ID = "rsspanel";
            rsspanel.UpdateMode = UpdatePanelUpdateMode.Conditional;
            rsspanel.ChildrenAsTriggers = true;

            ajaxtimer = new Timer();
            ajaxtimer.Enabled = true;
            ajaxtimer.ID = "ajaxtimer";
            ajaxtimer.Interval = UpdateInterval*1000;
           
            #endregion

            string content = "<script language='javascript'> " + togglescript + "</script>";
            System.Web.UI.ScriptManager.RegisterClientScriptBlock(Page, this.GetType(), "madhur", content, false);
           
            plusimage = this.Page.ClientScript.GetWebResourceUrl(this.GetType(), "RSSReaderAjax.plus.gif");
            minusimage = this.Page.ClientScript.GetWebResourceUrl(this.GetType(), "RSSReaderAjax.minus.gif");

            string css = this.Page.ClientScript.GetWebResourceUrl(this.GetType(), "RSSReaderAjax.StyleSheet.css");
            string link = "<link rel='stylesheet' type='text/css' href='" + css + "'/>";
            Page.Header.Controls.Add(new LiteralControl(link));


            rsspanel.ContentTemplateContainer.Controls.Add(tc);
            rsspanel.ContentTemplateContainer.Controls.Add(ajaxtimer);

            for (int i = 0; i < 4; ++i)
            {
                if (GetRSSUrl(i) == null)
                {
                    tc.Tabs[i].Enabled = false;

                    txturl[i] = new TextBox();
                    txturl[i].ID = "txturl" + i.ToString();
                    txturl[i].Visible = true;

                    btnfetchrss[i] = new LinkButton();
                    btnfetchrss[i].ID = "btnfetchrss" + i.ToString();
                    btnfetchrss[i].Text = "Set RSS Url";
                    btnfetchrss[i].Click += new EventHandler(btnfetchrss_Click);

                    tabs[i].Controls.Add(new LiteralControl("Please specify the URL of the RSS feed in webpart properties.<br>"));
                   // tabs[i].Controls.Add(txturl[i]);
                   // tabs[i].Controls.Add(btnfetchrss[i]);
                   // this.Controls.Add(btnfetchrss[i]);
                }
                else
                {
                    rsstext[i] = new Label();
                    rsstext[i].ID = "rsstext" + i.ToString();

                    btnreset[i] = new LinkButton();
                    btnreset[i].Text = "Reset URL";
                    btnreset[i].ID = "btnreset" + i.ToString();
                    btnreset[i].Click += new EventHandler(btnreset_Click);

                    btnrefresh[i] = new LinkButton();
                    btnrefresh[i].Text = "Refresh";
                    btnrefresh[i].ID = "btnrefresh" + i.ToString();
                    btnrefresh[i].Click += new EventHandler(btnrefresh_Click);

                    rsstext[i].Text = RSSBind(GetRSSUrl(i),i);

                    tabs[i].Controls.Add(rsstext[i]);

                }

            }
          
            this.Controls.Add(rsspanel);

            AjaxControlToolkit.UpdatePanelAnimationExtender anim = new UpdatePanelAnimationExtender();
            anim.ID = "anim";
            anim.TargetControlID = rsspanel.ID;
            //AjaxControlToolkit.Animation.ScriptAction d=new AjaxControlToolkit.Animation.ScriptAction();
            
            //anim.OnUpdating=AjaxControlToolkit.Animation.
        }

        
        public  string RSSBind(string url,int index)
        {
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            System.Data.DataSet ds = RSSRead.GetFeeds(url);

            if (ds.Tables.Count == 1)
            {
                sb.Append("Error occured: " + ds.Tables[0].Rows[0][0].ToString());
                return sb.ToString();
            }

            System.Data.DataTable dtFeeds = ds.Tables[0];
            System.Data.DataTable info = ds.Tables[1];

            int count = 1;
            string divnonestyle = "style=display:none";

            string divid = string.Empty;
            string parentdivid = string.Empty;
            string funccall = string.Empty;
            sb.Append("<table>");
            sb.Append("<tr>");
            string s = GetRSSImage(index);
            if (!string.IsNullOrEmpty(s))
            {
                sb.Append("<td width='"+ImgPanelWidth+"' valign='top'>");
                sb.Append("<img src='" + GetRSSImage(index) + "' valign='top'/>");
                sb.Append("</td>");
            }
            sb.Append("<td>");
            foreach (System.Data.DataRowView drv in dtFeeds.DefaultView)
            {
                divid = this.ID+index.ToString()+ count.ToString();
               
                parentdivid = "ctl_" + divid;
                funccall = "javascript:ToggleItemDescription('" + divid + "','" + plusimage + "','" +minusimage + "')";

                sb.Append("<table>");
                sb.Append("<tr>");
                sb.Append("<td>");
                sb.Append("<img onclick=" + funccall + " valign=bottom border=0 style='cursor:hand;'id=\"" + parentdivid + "\" src=\"" + plusimage + "\"/>");
                sb.Append("</td>");
                sb.Append("<td>");
                sb.Append("<a href=\"" + funccall+"\">" + drv["Title"].ToString() + "</a>");
                sb.Append("</td>");
                sb.Append("</tr>");
                sb.Append("</table>");
                sb.Append("<div id=\"" + divid + "\"" + divnonestyle + ">");
                drv["Content"] = drv["Content"].ToString().Replace("<b>Body:</b>", string.Empty);
                drv["Content"] = drv["Content"].ToString().Replace('�', ' ');
                sb.Append(drv["Content"].ToString());
                sb.Append("Published on: " + drv["PublishDate"].ToString());
                sb.Append("</div>");

 
                count++;
            }
            sb.Append("<a href=\"" + info.Rows[1][0].ToString() + "\"><br>Click here to View all items</a><br>");
            sb.Append("</td>");

            
            sb.Append("</tr>");
            sb.Append("</table>");


            int j=info.Rows[0][0].ToString().IndexOf(':');
            if (j != -1)
                tc.Tabs[index].HeaderText = info.Rows[0][0].ToString().Substring(j + 2);
            else
                tc.Tabs[index].HeaderText = info.Rows[0][0].ToString();

            return sb.ToString();

        }


        private string writeRSSLink(SPList list, SPView view)
        {
            string _rssUrl = list.ParentWebUrl.ToString() + "/_layouts/listfeed.aspx?";
            _rssUrl += "List=" + list.ID.ToString();
            _rssUrl += "&View=" + view.ID.ToString();
            return "<A HREF='" + _rssUrl + "'>View RSS Feed <IMG SRC='/_layouts/images/rss.gif' BORDER=0></A>";
        }


        protected override void OnInit(EventArgs e)
        {
            // Let's find if the ScriptManager exists and add it if not
            ScriptManager scriptManager = ScriptManager.GetCurrent(Page);

            if (scriptManager == null)
            {
                scriptManager = new ScriptManager();
                scriptManager.EnablePartialRendering = true;
                scriptManager.ID = "sm";

                if (Page.Form != null)
                {
                    // Insert script manager after the web part manager
                    for (int controlIndex = 0; controlIndex < Page.Form.Controls.Count; controlIndex++)
                    {
                        if (Page.Form.Controls[controlIndex].GetType() == WebPartManager.GetType())
                        {
                            Page.Form.Controls.AddAt(controlIndex + 1, scriptManager);
                        }
                    }
                }
            } 


            tc = new TabContainer();
            tc.ID = "tc";
            tc.CssClass = "ajax__tab_yuitabview-theme";                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
            tc.BorderWidth = Unit.Pixel(0);

            for (int i = 0; i < 4; ++i)
            {
                tabs[i] = new TabPanel();
                tabs[i].HeaderText = "Tab "+i.ToString();
                tabs[i].ID = "tabs" + i.ToString();
                tabs[i].BorderWidth = Unit.Pixel(0);
                tc.Tabs.Add(tabs[i]);
                
            }
            rssprogress = new UpdateProgress();
            rssprogress.ID = "rssprogress";
            rssprogress.ProgressTemplate = new MyTemplate(this.Page.ClientScript.GetWebResourceUrl(this.GetType(), "RSSReaderAjax.activityanimation.gif"));
            this.Controls.Add(rssprogress);

            this.ChromeType = System.Web.UI.WebControls.WebParts.PartChromeType.None;

            base.OnInit(e);
        }

        void btnreset_Click(object sender, EventArgs e)
        {

            if (sender == btnreset[0])
                RSSUrl = null;
            else if (sender == btnreset[1])
                RSSUrl1 = null;
            else if (sender == btnreset[2])
                RSSUrl2 = null;
            else
                RSSUrl3 = null;
          
            this.SetPersonalizationDirty();
            rsspanel.Update();
            
        }

        void btnfetchrss_Click(object sender, EventArgs e)
        {
           // WebPartManager.DisplayMode=Microsoft.SharePoint.WebPartPages.
            SPWebPartManager wp = (SPWebPartManager)this.Parent;
            wp.DisplayMode = SPWebPartManager.EditDisplayMode;
            wp.BeginWebPartEditing(this);
            //WebPartManager.DisplayMode = System.Web.UI.WebControls.WebParts.WebPartManager.EditDisplayMode;
            //WebPartManager.BeginWebPartEditing(this);

            
            /*if(sender==btnfetchrss[0])
                RSSUrl = txturl[0].Text;
            else if(sender==btnfetchrss[1])
                RSSUrl1 = txturl[1].Text;
            else if (sender == btnfetchrss[2])
                RSSUrl2 = txturl[2].Text;
            else
                RSSUrl3 = txturl[3].Text;

           this.SaveProperties = true;
            rsspanel.Update();*/
            
        }

        void btnrefresh_Click(object sender, EventArgs e)
        {
            
                //System.Threading.Thread.Sleep(2000);

           if (sender == btnrefresh[0])
                rsstext[0].Text = RSSBind(GetRSSUrl(0),0);
            else if(sender == btnrefresh[1])
                rsstext[1].Text = RSSBind(GetRSSUrl(1),1);
            else if (sender == btnrefresh[2])
                rsstext[2].Text = RSSBind(GetRSSUrl(2),2);
            else
                rsstext[3].Text = RSSBind(GetRSSUrl(3),3);

        }
     
        private string GetRSSUrl(int index)
        {
            try
            {
                if (index == 0)
                    return RSSUrl;
                else if (index == 1)
                    return RSSUrl1;
                else if (index == 2)
                    return RSSUrl2;
                else if (index == 3)
                    return RSSUrl3;
            }
            catch (NullReferenceException)
            {
                
            }
                return string.Empty;
           
        }

        private string GetRSSImage(int index)
        {
            try
            {
                if (index == 0)
                    return RSSImgUrl;
                else if (index == 1)
                    return RSSImgUrl1;
                else if (index == 2)
                    return RSSImgUrl2;
                else if (index == 3)
                    return RSSImgUrl3;
            }
            catch (NullReferenceException)
            {
                
            }
            return string.Empty;
        }
        private void SaveWebpart()
        {
            SPWeb web = Microsoft.SharePoint.WebControls.SPControl.GetContextWeb(this.Context);
            SPFile file = web.GetFile(this.Context.Request.Path);
            SPWebPartCollection webPartCollection = file.GetWebPartCollection(Storage.Shared);
            this.SaveProperties = true;
            file.CheckOut();
            webPartCollection.SaveChanges(this.StorageKey);
            file.CheckIn("Checked in by ajax");

            web.Dispose();
        }

    
      
        private string GetListURL()
        {
            return string.Empty;
        }
        private string CheckURL()
        {
            if (!SPSite.Exists(new Uri(RSSUrl, UriKind.Absolute)))
                return "RSS Feed is not a valid RSS URL";
            else
                return string.Empty;


        }

        private string MakeRssUrl(string rawurl)
        {
            try
            {
                Uri url = new Uri(rawurl, UriKind.Absolute);

                if (url.GetLeftPart(UriPartial.Path).Contains(rssstr))
                {
                    //_rssurl[0] = rawurl;
                    return rawurl;
                }
                else
                {
                    string rssurl;
                    using (SPWeb web = new SPSite(rawurl).OpenWeb())
                    {
                        SPList list = web.GetListFromUrl(rawurl);
                        rssurl = web.Url + "/_layouts/listfeed.aspx?list=" + list.ID;
                        //list.uni
                        return rssurl;

                    }

                }
            }
            catch (UriFormatException e)
            {
                return string.Empty;
            }
            
          


        }
        
        private void EnsurePanelFix()
        {
            if (this.Page.Form != null)
            {
                String fixupScript = @"
     _spBodyOnLoadFunctionNames.push(""_initFormActionAjax"");
     function _initFormActionAjax()
     {
       if (_spEscapedFormAction == document.forms[0].action)
       {
         document.forms[0]._initialAction = 
         document.forms[0].action;
       }
     }
     var RestoreToOriginalFormActionCore = 
       RestoreToOriginalFormAction;
     RestoreToOriginalFormAction = function()
     {
       if (_spOriginalFormAction != null)
       {
         RestoreToOriginalFormActionCore();
         document.forms[0]._initialAction = 
         document.forms[0].action;
       }
     }";
                ScriptManager.RegisterStartupScript(this,
                  typeof(RSSReaderAjax), "UpdatePanelFixup",
                  fixupScript, true);
            }
        }

        #endregion
    }


    class MyTemplate : ITemplate
    {
        string imgpath;

        public MyTemplate(string path){
            imgpath = path;

        }
        public void InstantiateIn(Control container)
        {

            LiteralControl l1 = new LiteralControl("<img src="+imgpath+"/>");
            container.Controls.Add(l1);
        }
    }

}

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 Code Project Open License (CPOL)


Written By
Software Developer (Senior) Wipro Technologies
India India
I am working in Wipro Technologies as a developer with expertises in Microsoft Office SharePoint products. My interests include working on ASP.NET, AJAX, Javascript Object Notation (JSON), XML web services, Algorithm Optimization, Design Patterns.

Comments and Discussions