/[xmltv_parser]/trunk/libxmltv/Core/DataSourceBindable.cs
ViewVC logotype

Diff of /trunk/libxmltv/Core/DataSourceBindable.cs

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 120 by william, Sun Mar 10 18:19:12 2013 UTC revision 181 by william, Sat Mar 16 17:56:55 2013 UTC
# Line 3  using System.Collections.Generic; Line 3  using System.Collections.Generic;
3  using System.Linq;  using System.Linq;
4  using System.Text;  using System.Text;
5  using libxmltv.Interfaces;  using libxmltv.Interfaces;
6    using System.Collections;
7    using Enterprise.Logging;
8    
9  namespace libxmltv.Core  namespace libxmltv.Core
10  {  {
11      public class ChannelList : List<IXMLTVChannel>, IDataSourceBindable      public class ChannelList : List<IXMLTVChannel>, IDataSourceBindable//, IDataConverter<IChannelDefintionList>
12      {      {
13            private class ChannelDefintionList : List<IChannelDefintion>, IDataSourceSortable, IDataSourceFilterable, IChannelDefintionList  
14            {
15                public ChannelDefintionList() { }
16                public ChannelDefintionList(List<IChannelDefintion> collection) { collection.ForEach(s => this.Add(s)); }
17                #region IDataSourceSortable members
18                public void Sort(ref object source, bool descending, params string[] args)
19                {
20                }
21                #endregion
22                #region IDataSourceFilterable members
23                public void Filter(ref object source, params string[] args)
24                {
25                }
26                #endregion
27            }
28            private class ChannelDefintion : IChannelDefintion
29            {
30                public ChannelDefintion()
31                {
32                    ChannelId = string.Empty;
33                    ChannelName = string.Empty;
34                }
35                public string ChannelId { get; internal set; }
36                public string ChannelName { get; internal set; }
37    
38                public override string ToString()
39                {
40                    StringBuilder builder = new StringBuilder();
41                    Type t = typeof(ChannelDefintion);
42                    var props = t.GetProperties();
43                    foreach (var prop in props)
44                    {
45                        string name = prop.Name;
46                        object value = prop.GetValue(this, null);
47                        builder.AppendFormat("\t{0}: '{1}'", name, value == null ? "null" : value.ToString());
48                    }
49                    return builder.ToString();
50                }
51                
52            }
53            //static private List<string> known_columns;
54            //static ChannelList()
55            //{
56            //    known_columns = new List<string>();
57            //    known_columns.Add("Id");
58            //    known_columns.Add("Name");
59            //}
60          public ChannelList() { }          public ChannelList() { }
61    
62          public object CreateBindableDataSource()          //public object ConvertObjectData(object source) { return this.ConvertData(source); }
63            //public IChannelDefintionList ConvertData(object source)
64            //{
65            //    //object t = source;
66            //    if (source.GetType() != typeof(ChannelDefintionList)) { throw new InvalidCastException(string.Format("Cannot cast: '{0}' to '{1}'", source.GetType().Name, typeof(ChannelDefintionList).Name)); }
67            //    //if (type != typeof(IChannelDefintionList)) { throw new InvalidCastException(string.Format("Cannot cast: '{0}' to '{1}'", type.Name, typeof(IChannelDefintionList).Name)); }
68            //    IChannelDefintionList t = (source as IChannelDefintionList);
69            //    return t;
70            //}
71            /// <summary>
72            ///
73            /// </summary>
74            /// <param name="type"></param>
75            /// <returns></returns>
76            public object CreateBindableDataSource(out Type type)
77          {          {
78                type = typeof(IChannelDefintionList);
79              object bindable = new object();              object bindable = new object();
80                ChannelDefintionList list = new ChannelDefintionList();
81                
82                foreach (var t in this)
83                {
84                    try
85                    {
86                        ChannelDefintion definition = new ChannelDefintion();
87                        definition.ChannelId = t.Id;
88                        definition.ChannelName = t.MetaData[XMLTVConstants.Channels.ChannelDisplayName].FirstOrDefault().Value.ToString();
89                        xmltv_logger.Verbose.Debug.WriteLine(definition.ToString());
90                        list.Add(definition);
91                    }
92                    catch (Exception ex) { throw ex; }
93                }
94                list = new ChannelDefintionList(list.OrderBy(s => s.ChannelName).ToList());
95                bindable = list;
96              return bindable;              return bindable;
97          }          }
98          
99      }      }
100      public class ProgramList : List<IXMLTVProgram>, IDataSourceBindable      public class ProgramList : List<IXMLTVProgram>, IDataSourceBindable//, IDataConverter<IProgramDefinitionList>
101      {      {
102          public ProgramList() { }          private class ProgramDefinitionList : List<IProgramDefinition>, IDataSourceSortable, IDataSourceFilterable, IProgramDefinitionList  
103            {
104                public ProgramDefinitionList() { }
105                public ProgramDefinitionList(List<IProgramDefinition> collection) { collection.ForEach(s => this.Add(s)); }
106                #region IDataSourceSortable members
107                public void Sort(ref object source, bool descending, params string[] args)
108                {
109                    IProgramDefinitionList list = null;
110                    IOrderedEnumerable<IProgramDefinition> ordered = null;
111                    try
112                    {
113                        list = (ProgramDefinitionList)source;
114                        var col = args.First().ToString().ToLower();
115                        switch (col)
116                        {
117                            case "channelnumber": ordered = descending ? list.OrderByDescending(s => s.ChannelNumber) : list.OrderBy(s => s.ChannelNumber); break;
118                            case "channelname": ordered = descending ? list.OrderByDescending(s => s.ChannelName) : list.OrderBy(s => s.ChannelName); break;
119                            case "start": ordered = descending ? list.OrderByDescending(s => s.Start) : list.OrderBy(s => s.Start); break;
120                            case "stop": ordered = descending ? list.OrderByDescending(s => s.Stop) : list.OrderBy(s => s.Stop); break;
121                            case "description": ordered = descending ? list.OrderByDescending(s => s.Description) : list.OrderBy(s => s.Description); break;
122                            case "title": ordered = descending ? list.OrderByDescending(s => s.Title) : list.OrderBy(s => s.Title); break;
123                            case "subtitle": ordered = descending ? list.OrderByDescending(s => s.SubTitle) : list.OrderBy(s => s.SubTitle); break;
124                        }
125                        //bool first = true;
126                        foreach (var arg in args.Skip(1))
127                        {
128                            col = arg.ToLower();
129                            switch (col)
130                            {
131                                case "channelnumber": ordered = descending ? ordered.ThenByDescending(s => s.ChannelNumber) : ordered.ThenBy(s => s.ChannelNumber); break;
132                                case "channelname": ordered = descending ? list.OrderByDescending(s => s.ChannelName) : list.OrderBy(s => s.ChannelName); break;
133                                case "start": ordered = descending ? ordered.ThenByDescending(s => s.Start) : ordered.ThenBy(s => s.Start); break;
134                                case "stop": ordered = descending ? ordered.ThenByDescending(s => s.Stop) : ordered.ThenBy(s => s.Stop); break;
135                                case "description": ordered = descending ? ordered.ThenByDescending(s => s.Description) : ordered.ThenBy(s => s.Description); break;
136                                case "title": ordered = descending ? ordered.ThenByDescending(s => s.Title) : ordered.ThenBy(s => s.Title); break;
137                                case "subtitle": ordered = descending ? ordered.ThenByDescending(s => s.SubTitle) : ordered.ThenBy(s => s.SubTitle); break;
138                            }
139                        }
140                        list = new ProgramDefinitionList(ordered.ToList());
141                    }
142                    catch (Exception ex) { throw ex; }
143                    if (list != null) { source = list; }
144                }
145                #endregion
146                #region IDataSourceFilterable members
147                public void Filter(ref object source, params string[] args)
148                {
149                    IProgramDefinitionList list = null;
150                    List<IProgramDefinition> ordered = null;
151                    try
152                    {
153                        list = (ProgramDefinitionList)source;
154                        //var col = args.First().ToString().ToLower();
155                        //var data = args.().ToString().ToLower();
156    
157          public object CreateBindableDataSource()                      if (args.Count() != 2) { throw new ArgumentOutOfRangeException("args", "Excpected 2 aguments: columnname and filtertext"); }
158    
159                        string columnname = args[0].ToLower();
160                        string filtertext = args[1].ToLower();
161    
162                        switch (columnname)
163                        {
164                            case "channelnumber": ordered = list.ToList().FindAll(s => s.ChannelNumber == Convert.ToInt32(filtertext)); break;
165                            case "channelname": ordered = list.ToList().FindAll(s => s.ChannelName.ToLower().Contains(filtertext)); break;
166                            case "start": ordered = list.ToList().FindAll(s => s.Start.ToLower().Contains(filtertext)); break;
167                            case "stop": ordered = list.ToList().FindAll(s => s.Stop.ToLower().Contains(filtertext)); break;
168                            case "description": ordered = list.ToList().FindAll(s => s.Description.ToLower().Contains(filtertext)); break;
169                            case "title": ordered = list.ToList().FindAll(s => s.Title.ToLower().Contains(filtertext)); break;
170                            case "subtitle": ordered = list.ToList().FindAll(s => s.SubTitle.ToLower().Contains(filtertext)); break;
171                        }                  
172                        list = new ProgramDefinitionList(ordered.ToList());
173                        if (list.Count == 0)
174                        {
175                            list = (ProgramDefinitionList)source;
176                            gLog.Warn.WriteLine("Filering by: column='{0}' with filer='{1}' returned no data",columnname, filtertext);
177                        }
178                    }
179                    catch (Exception ex) { throw ex; }
180                    if (list != null) { source = list; }
181                }
182                #endregion
183            }
184            public class ProgramDefintion : IProgramDefinition, IEquatable<IProgramDefinition>
185          {          {
186                public ProgramDefintion()
187                {
188                    //ChannelId = string.Empty;
189                    ChannelNumber = 0;
190                    ChannelName = string.Empty;
191                    Start = new DateTime().ToDateTimeString();
192                    Stop = new DateTime().ToDateTimeString();
193                    Description = string.Empty;
194                    Title = string.Empty;
195                    SubTitle = string.Empty;
196                }
197                //public string ChannelId { get; internal set; }
198                public int ChannelNumber { get; set; }
199                public string ChannelName { get; set; }
200                public string Start { get; set; }
201                public string Stop { get; set; }
202                public string Title { get; set; }
203                public string SubTitle { get; set; }
204                public string Description { get; set; }
205    
206                public override string ToString()
207                {
208                    StringBuilder builder = new StringBuilder();
209                    Type t = typeof(ProgramDefintion);
210                    var props = t.GetProperties();
211                    foreach (var prop in props)
212                    {
213                        string name = prop.Name;
214                        object value = prop.GetValue(this, null);
215                        builder.AppendFormat("\t{0}: '{1}'", name, value == null ? "null" : value.ToString());
216                    }
217                    return builder.ToString();
218                }
219    
220                public bool Equals(IProgramDefinition other)
221                {
222                    return this.ToString() == other.ToString();
223                }
224                public override bool Equals(object obj)
225                {
226                    if (obj == null) { throw new ArgumentNullException("obj", "Object to compare cannot be null"); }
227                    if (obj.GetType().IsAssignableFrom(typeof(IProgramDefinition)))
228                    {
229                        return this.Equals((IProgramDefinition)obj);
230                    }
231                    return base.Equals(obj);
232                }
233                public override int GetHashCode()
234                {
235                    return this.ToString().GetHashCode();
236                }
237            }
238            public ProgramList() { }
239            //public object ConvertObjectData(object source) { return this.ConvertData(source); }
240            //public IProgramDefinitionList ConvertData(object source)
241            //{
242            //    if (source.GetType() != typeof(ProgramDefinitionList)) { throw new InvalidCastException(string.Format("Cannot cast: '{0}' to '{1}'", source.GetType().Name, typeof(ProgramDefinitionList).Name)); }
243            //    //if (type != typeof(IProgramDefinitionList)) { throw new InvalidCastException(string.Format("Cannot cast: '{0}' to '{1}'", type.Name, typeof(IProgramDefinitionList).Name)); }
244            //    IProgramDefinitionList t = (source as IProgramDefinitionList);
245            //    return t;
246            //}
247            /// <summary>
248            ///
249            /// </summary>
250            /// <param name="type"></param>
251            /// <returns></returns>
252            public object CreateBindableDataSource(out Type type)
253            {
254                type = typeof(IProgramDefinitionList);
255              object bindable = new object();              object bindable = new object();
256                ProgramDefinitionList list = new ProgramDefinitionList();
257    
258                foreach (var t in this)
259                {
260                    try
261                    {
262                        ProgramDefintion definition = new ProgramDefintion();
263                        string ChannelId = t.MetaData[XMLTVConstants.Programs.ProgramChannelId].ToString();
264                        //definition.ChannelId = ChannelId;
265    
266                        var channels = XMLTV.GetChannels();
267                        if (channels != null)
268                        {
269                            var channel = channels.Find(p => p.Id == ChannelId);
270                            if (channel != null)
271                            {
272                                var channelname = channel.MetaData[XMLTVConstants.Channels.ChannelDisplayName].FirstOrDefault().Value.ToString();
273                                var split = channelname.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
274                                definition.ChannelNumber = Convert.ToInt32(split.First());
275                                definition.ChannelName = string.IsNullOrEmpty(split.Last()) ? string.Empty : split.Last().ToString();
276    
277                            }
278                            else
279                            {
280                                definition.ChannelNumber = 0;
281                            }
282                        }
283                        else
284                        {
285                            definition.ChannelNumber = 0;
286                        }
287                        definition.Start = ((DateTime)t.MetaData[XMLTVConstants.Programs.ProgramStart]).ToDateTimeString();
288                        definition.Stop = ((DateTime)t.MetaData[XMLTVConstants.Programs.ProgramStop]).ToDateTimeString();
289                        definition.Description = t.MetaData[XMLTVConstants.Programs.ProgramDescription].ToString();
290                        definition.Title = t.MetaData[XMLTVConstants.Programs.ProgramTitle].ToString();
291                        definition.SubTitle = t.MetaData[XMLTVConstants.Programs.ProgramSubTitle].ToString();
292    
293                        xmltv_logger.Verbose.Debug.WriteLine(definition.ToString());
294                        list.Add(definition);
295                    }
296                    catch (Exception ex) { throw ex; }
297                }
298    
299                list = new ProgramDefinitionList(list.OrderBy(s => s.Start).ToList());
300    
301                bindable = list;
302              return bindable;              return bindable;
303          }          }
304      }      }
305      public class ExtraList : List<IExtraMetaData>, IDataSourceBindable      public class ExtraList : List<IExtraMetaData>, IDataSourceBindable
306      {      {
         public ExtraList() { }  
307    
308          public object CreateBindableDataSource()          public ExtraList() { }
309            /// <summary>
310            ///
311            /// </summary>
312            /// <param name="type"></param>
313            /// <returns></returns>
314            public object CreateBindableDataSource(out Type type)
315          {          {
316              object bindable = new object();              type = typeof(object);
317              return bindable;              throw new NotImplementedException("Conversion of Extra MetaData to a bindable datasource has not been implemented.");
318                //object bindable = new object();
319                //return bindable;
320          }          }
321            //public object ConvertObjectData(object source) { return source; }
322            //public object Convert(object source)
323            //{
324            //    throw new NotImplementedException("Conversion of Extra MetaData to a bindable datasource has not been implemented.");
325            //}
326      }      }
327  }  }

Legend:
Removed from v.120  
changed lines
  Added in v.181

  ViewVC Help
Powered by ViewVC 1.1.22