using System; using System.IO; using System.Collections; using System.Web.UI; using System.Web.UI.WebControls; using Newtonsoft.Json; using FeedBuilder; namespace Sample.Web.Controls { public class RssReaderControl : CompositeControl, ICallbackEventHandler { private ITemplate itemTemplate; private String feedUrl; #region Support Types public class RssEntryData { private DateTime dateTime; private String title; private String link; public DateTime DateTime { get { return dateTime; } set { dateTime = value; } } public String Title { get { return title; } set { title = value; } } public String Link { get { return link; } set { link = value; } } public RssEntryData(DateTime dateTime, String title, String link) { this.DateTime = dateTime; this.Title = title; this.Link = link; } public RssEntryData() { } } public class TemplatedListItem : WebControl, IDataItemContainer { private RssEntryData data = new RssEntryData(); private Int32 dataItemIndex; internal RssEntryData Data { get { return data; } set { data = value; } } #region IDataItemContainer Members public Object DataItem { get { return this.Data; } } public Int32 DataItemIndex { get { return dataItemIndex; } set { dataItemIndex = value; } } public Int32 DisplayIndex { get { return this.DataItemIndex; } } #endregion } [TemplateContainer(typeof(TemplatedListItem))] [PersistenceMode(PersistenceMode.InnerProperty)] public ITemplate ItemTemplate { get { return itemTemplate; } set { itemTemplate = value; } } public String FeedUrl { get { return feedUrl; } set { feedUrl = value; } } #endregion protected override void OnInit(EventArgs e) { Page.ClientScript.RegisterClientScriptResource(this.GetType(), "Sample.Resources.JavaScript.RssReaderControlCallback.js"); base.OnInit(e); } protected override void RenderContents(HtmlTextWriter writer) { base.RenderContents(writer); if (!Page.IsCallback) { writer.RenderBeginTag(HtmlTextWriterTag.Span); writer.Write("Feed Address: "); writer.RenderEndTag(); writer.AddAttribute(HtmlTextWriterAttribute.Id, this.ClientID + "_txtRssFeedAddress"); writer.RenderBeginTag(HtmlTextWriterTag.Input); writer.RenderEndTag(); writer.AddAttribute(HtmlTextWriterAttribute.Onclick, Page.ClientScript.GetCallbackEventReference(this, "document.getElementById('" + this.ClientID + "_txtRssFeedAddress').value", "Jampad.Sample.Web.RssReaderControl.getRssFeedCallback", "'" + this.ClientID + "_divResults'")); writer.AddAttribute(HtmlTextWriterAttribute.Type, "button"); writer.AddAttribute(HtmlTextWriterAttribute.Value, "Get Feed"); writer.RenderBeginTag(HtmlTextWriterTag.Input); writer.RenderEndTag(); writer.AddAttribute(HtmlTextWriterAttribute.Id, this.ClientID + "_divResults"); writer.RenderBeginTag(HtmlTextWriterTag.Div); writer.RenderEndTag(); } } public String GetCallbackResult() { StringWriter sw = new StringWriter(); HtmlTextWriter writer = new HtmlTextWriter(sw); this.RenderContents(writer); return sw.ToString(); } public void RaiseCallbackEvent(String eventArgument) { AbstractReader reader = FeedReaderBuilder.Build(eventArgument); Int32 i = 0; if (this.ItemTemplate != null) { foreach (SimpleFeedEntry sfe in reader.GetEntryList()) { RssEntryData di = new RssEntryData(sfe.Date, sfe.Title, sfe.Link); TemplatedListItem li = new TemplatedListItem(); li.Data = di; li.DataItemIndex = ++i; this.ItemTemplate.InstantiateIn(li); Controls.Add(li); } } DataBind(false); } } }