From 13c2e96867e4508874b45acacb9f79f8dad74fdb Mon Sep 17 00:00:00 2001 From: Christian Fiedler Date: Mon, 10 Jun 2013 18:50:28 +0200 Subject: [PATCH] events and news page changed and commited --- CampusAppWP8/CampusAppWP8/CampusAppWP8.csproj | 30 ++- .../CampusAppWP8/Properties/WMAppManifest.xml | 2 +- .../Resources/AppResources.Designer.cs | 5 +- .../CampusAppWP8/Resources/AppResources.resx | 15 +- .../model/departments/DepartmentViewModel.cs | 13 -- .../model/events_news/RSSChannelModel.cs | 49 +++++ .../model/events_news/RSSModel.cs | 203 ++++++++++++++++++ .../model/events_news/RSSViewModel.cs | 51 +++++ CampusAppWP8/CampusAppWP8/pages/RSSItem.cs | 112 ---------- .../pages/departments/DepartmentPage.xaml | 14 +- .../pages/departments/DepartmentPage.xaml.cs | 53 ++++- .../CampusAppWP8/pages/events/EventFeed.cs | 24 +++ .../pages/events/EventIndexPage.xaml | 32 +++ .../pages/events/EventIndexPage.xaml.cs | 107 +++++++++ .../CampusAppWP8/pages/events/EventPage.xaml | 37 +++- .../pages/events/EventPage.xaml.cs | 131 +++++------ .../CampusAppWP8/pages/news/NewsFeed.cs | 24 +++ .../pages/news/NewsIndexPage.xaml | 33 +++ .../pages/news/NewsIndexPage.xaml.cs | 107 +++++++++ .../CampusAppWP8/pages/news/NewsPage.xaml | 97 +++++---- .../CampusAppWP8/pages/news/NewsPage.xaml.cs | 154 ++++++------- .../pages/news/RSSNewsTemplate.xaml | 60 ------ .../pages/news/RSSNewsTemplate.xaml.cs | 22 -- CampusAppWP8/CampusAppWP8/utility/URLList.cs | 2 + 24 files changed, 917 insertions(+), 460 deletions(-) create mode 100644 CampusAppWP8/CampusAppWP8/model/events_news/RSSChannelModel.cs create mode 100644 CampusAppWP8/CampusAppWP8/model/events_news/RSSModel.cs create mode 100644 CampusAppWP8/CampusAppWP8/model/events_news/RSSViewModel.cs delete mode 100644 CampusAppWP8/CampusAppWP8/pages/RSSItem.cs create mode 100644 CampusAppWP8/CampusAppWP8/pages/events/EventFeed.cs create mode 100644 CampusAppWP8/CampusAppWP8/pages/events/EventIndexPage.xaml create mode 100644 CampusAppWP8/CampusAppWP8/pages/events/EventIndexPage.xaml.cs create mode 100644 CampusAppWP8/CampusAppWP8/pages/news/NewsFeed.cs create mode 100644 CampusAppWP8/CampusAppWP8/pages/news/NewsIndexPage.xaml create mode 100644 CampusAppWP8/CampusAppWP8/pages/news/NewsIndexPage.xaml.cs delete mode 100644 CampusAppWP8/CampusAppWP8/pages/news/RSSNewsTemplate.xaml delete mode 100644 CampusAppWP8/CampusAppWP8/pages/news/RSSNewsTemplate.xaml.cs diff --git a/CampusAppWP8/CampusAppWP8/CampusAppWP8.csproj b/CampusAppWP8/CampusAppWP8/CampusAppWP8.csproj index 000fbfcb..40d62a03 100644 --- a/CampusAppWP8/CampusAppWP8/CampusAppWP8.csproj +++ b/CampusAppWP8/CampusAppWP8/CampusAppWP8.csproj @@ -102,6 +102,8 @@ + + @@ -111,6 +113,13 @@ DepartmentPage.xaml + + + EventIndexPage.xaml + + + EventPage.xaml + LecturePage.xaml @@ -120,13 +129,14 @@ MensaPage.xaml + + + NewsIndexPage.xaml + NewsPage.xaml - - - RSSNewsTemplate.xaml - + StartPage.xaml @@ -177,6 +187,14 @@ Designer MSBuild:Compile + + Designer + MSBuild:Compile + + + MSBuild:Compile + Designer + Designer MSBuild:Compile @@ -185,11 +203,11 @@ MSBuild:Compile Designer - + Designer MSBuild:Compile - + Designer MSBuild:Compile diff --git a/CampusAppWP8/CampusAppWP8/Properties/WMAppManifest.xml b/CampusAppWP8/CampusAppWP8/Properties/WMAppManifest.xml index cd52e133..cd51949e 100644 --- a/CampusAppWP8/CampusAppWP8/Properties/WMAppManifest.xml +++ b/CampusAppWP8/CampusAppWP8/Properties/WMAppManifest.xml @@ -13,7 +13,7 @@ - + diff --git a/CampusAppWP8/CampusAppWP8/Resources/AppResources.Designer.cs b/CampusAppWP8/CampusAppWP8/Resources/AppResources.Designer.cs index 259a25eb..8ae30501 100644 --- a/CampusAppWP8/CampusAppWP8/Resources/AppResources.Designer.cs +++ b/CampusAppWP8/CampusAppWP8/Resources/AppResources.Designer.cs @@ -1,5 +1,4 @@ -<<<<<<< HEAD -//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ // // Dieser Code wurde von einem Tool generiert. // Laufzeitversion:4.0.30319.18046 @@ -422,5 +421,3 @@ namespace CampusAppWP8.Resources { } } } - - diff --git a/CampusAppWP8/CampusAppWP8/Resources/AppResources.resx b/CampusAppWP8/CampusAppWP8/Resources/AppResources.resx index 9eab1638..a8be2df5 100644 --- a/CampusAppWP8/CampusAppWP8/Resources/AppResources.resx +++ b/CampusAppWP8/CampusAppWP8/Resources/AppResources.resx @@ -230,10 +230,13 @@ zur Übersicht - - Fakultät - - - Lehrstühle - + + Fakultät + + + Lehrstühle + + + Link + \ No newline at end of file diff --git a/CampusAppWP8/CampusAppWP8/model/departments/DepartmentViewModel.cs b/CampusAppWP8/CampusAppWP8/model/departments/DepartmentViewModel.cs index eb2863be..d9d242b0 100644 --- a/CampusAppWP8/CampusAppWP8/model/departments/DepartmentViewModel.cs +++ b/CampusAppWP8/CampusAppWP8/model/departments/DepartmentViewModel.cs @@ -18,19 +18,6 @@ namespace CampusAppWP8.model.departments public DepartmentViewModel() { this.Faculties = new ObservableCollection(); - this.LoadData(); - } - - public void LoadData() - { - - /* - this.Faculties.Add(new FacultyModel("Fakultät 1")); - this.Faculties.Add(new FacultyModel("Fakultät 2")); - this.Faculties.Add(new FacultyModel("Fakultät 3")); - this.Faculties.Add(new FacultyModel("Fakultät 4")); - this.Faculties.Add(new FacultyModel("Favoriten")); - /**/ } public ObservableCollection Faculties diff --git a/CampusAppWP8/CampusAppWP8/model/events_news/RSSChannelModel.cs b/CampusAppWP8/CampusAppWP8/model/events_news/RSSChannelModel.cs new file mode 100644 index 00000000..f9d4d42d --- /dev/null +++ b/CampusAppWP8/CampusAppWP8/model/events_news/RSSChannelModel.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Xml.Serialization; +using System.Collections.ObjectModel; + +namespace CampusAppWP8.model.events_news +{ + /// + /// Channel Model, which contains the rss feed item list. + /// + public class RSSChannelModel : BaseModel + { + /// + /// RssFeed information item list. + /// + [XmlElement("item")] + public ObservableCollection item { get; set; } + + /// + /// Default constructor. + /// + public RSSChannelModel() + { + this.item = new ObservableCollection(); + } + + /// + /// Set/Get the rss feed item list. + /// + public ObservableCollection Item + { + get + { + return this.item; + } + set + { + if (value != this.item) + { + this.item = value; + NotifyPropertyChanged("item"); + } + } + } + } +} diff --git a/CampusAppWP8/CampusAppWP8/model/events_news/RSSModel.cs b/CampusAppWP8/CampusAppWP8/model/events_news/RSSModel.cs new file mode 100644 index 00000000..6da3af44 --- /dev/null +++ b/CampusAppWP8/CampusAppWP8/model/events_news/RSSModel.cs @@ -0,0 +1,203 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Xml.Serialization; + +namespace CampusAppWP8.model.events_news +{ + /// + /// Contains the rss feed informations. + /// + public class RSSModel : BaseModel + { + /// + /// Title of the fees + /// + private string title; + /// + /// Description text of the feed. + /// + private string text; + /// + /// Timestamp (publication date) of the event or news. + /// + private DateTime timestamp; + /// + /// Url of the feed. + /// + private string link; + + /// + /// Set/Get the title of the feed. + /// + [XmlElement("title")] + public string Title + { + get { return this.title; } + set + { + if (this.title != value) + { + this.title = value; + NotifyPropertyChanged("rss"); + } + } + } + + /// + /// Set/Get the text of the feed. + /// + [XmlElement("description")] + public string Text + { + get { return this.text; } + set + { + if (this.text != HTMLUnicodeToString(value)) + { + this.text = HTMLUnicodeToString(value); + NotifyPropertyChanged("rss"); + } + } + } + + /// + /// Set/Get the timestamp of the feed as string. + /// + [XmlElement("pubDate")] + public string Timestamp + { + get { return this.timestamp.ToString("R"); } + set + { + if (this.timestamp != DateTime.Parse(value)) + { + this.timestamp = DateTime.Parse(value); + NotifyPropertyChanged("rss"); + } + } + } + + /// + /// Set/Get the timestamp of the feed as DateTime object. + /// + public DateTime DTTimestamp + { + get { return this.timestamp; } + set { this.timestamp = value; } + } + + /// + /// Return the date of the timestamp as string. + /// example: Mon, 25.06.2013. + /// + public string Date + { + get { return String.Format("{0:ddd, dd.MM.yyyy}", this.timestamp); } + } + + /// + /// Return the time of the timestamp as string. + /// example: 12:56 Uhr. + /// + public string Time + { + get { return String.Format("{0:h:mm} Uhr", this.timestamp); } + } + + /// + /// Set/Get the link/url of the feed. + /// + [XmlElement("link")] + public string Link + { + get { return this.link; } + set + { + if (this.link != value) + { + this.link = value; + NotifyPropertyChanged("rss"); + } + } + } + + /// + /// Remove or transform html-unicode specific tags into ascii. + /// + /// html string + /// ascii string + private string HTMLUnicodeToString(string htmluni) + { + StringBuilder retValue = new StringBuilder(); + + for(int i = 0; i < htmluni.Length; i++) + { + switch (htmluni[i]) + { + // beginning tag of the unicode + case '&': + { + int startOff = i + 2; + // sear closing tag of the unicode + int endOff = htmluni.IndexOf(';', startOff); + // get and parse value inbetween + string sub = htmluni.Substring(startOff, endOff - startOff); + int cVal = int.Parse(sub); + + switch (cVal) + { + // if the unicode value is 128 (€) + case 128: + retValue.Append('€'); + break; + + default: + retValue.Append((char)cVal); + break; + } + + // set the current index to the end of the unicode tag + i = endOff; + } + break; + case '<': + { + // ignoring <..> html tags + i = htmluni.IndexOf('>', i); + } + break; + case '\t': + // removing tabs + break; + + default: + { + // adding other characters to the return string + retValue.Append(htmluni[i]); + } + break; + } + } + + return retValue.ToString(); + } + + /// + /// Comparing function for Datetime-Timestamps. + /// (currently unused) + /// + /// first item + /// secound item + /// + public static int CompareTimeStamp(RSSModel item1, RSSModel item2) + { + if (item1.DTTimestamp > item2.DTTimestamp) + return -1; + else + return 0; + } + } +} diff --git a/CampusAppWP8/CampusAppWP8/model/events_news/RSSViewModel.cs b/CampusAppWP8/CampusAppWP8/model/events_news/RSSViewModel.cs new file mode 100644 index 00000000..9df6b26f --- /dev/null +++ b/CampusAppWP8/CampusAppWP8/model/events_news/RSSViewModel.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Xml.Serialization; + +namespace CampusAppWP8.model.events_news +{ + /// + /// ViewModel of the rss feed, containing the feed/channel object. + /// + [XmlRoot("root")] + public class RSSViewModel : BaseViewModel + { + /// + /// channel list for the rss feeds. + /// + [XmlArray("rss")] + [XmlArrayItem("channel")] + public ObservableCollection channel { get; set; } + + /// + /// Default constructor. + /// + public RSSViewModel() + { + this.channel = new ObservableCollection(); + } + + /// + /// Set/Get the channel list. + /// + public ObservableCollection Channel + { + get + { + return this.channel; + } + set + { + if (value != this.channel) + { + this.channel = value; + NotifyPropertyChanged("channel"); + } + } + } + } +} diff --git a/CampusAppWP8/CampusAppWP8/pages/RSSItem.cs b/CampusAppWP8/CampusAppWP8/pages/RSSItem.cs deleted file mode 100644 index 0a5b7124..00000000 --- a/CampusAppWP8/CampusAppWP8/pages/RSSItem.cs +++ /dev/null @@ -1,112 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace CampusAppWP8.pages.news -{ - class RSSItem - { - private string title; - private string text; - private DateTime timestamp; - private string link; - - public string Title - { - get { return this.title; } - set { this.title = value; } - } - - public string Text - { - get { return this.text; } - set { this.text = HTMLUnicodeToString(value); } - } - - public string Timestamp - { - get { return this.timestamp.ToString("R"); } - set { this.timestamp = DateTime.Parse(value); } - } - - public DateTime DTTimestamp - { - get { return this.timestamp; } - set { this.timestamp = value; } - } - - public string Date - { - get { return String.Format("{0:ddd, dd.MM.yyyy}", this.timestamp); } - } - - public string Time - { - get { return String.Format("{0:h:mm} Uhr", this.timestamp); } - } - - public string Link - { - get { return this.link; } - set { this.link = value; } - } - - private string HTMLUnicodeToString(string htmluni) - { - StringBuilder retValue = new StringBuilder(); - - for(int i = 0; i < htmluni.Length; i++) - { - switch (htmluni[i]) - { - case '&': - { - int startOff = i + 2; - int endOff = htmluni.IndexOf(';', startOff); - string sub = htmluni.Substring(startOff, endOff - startOff); - int cVal = int.Parse(sub); - - switch (cVal) - { - case 128: - retValue.Append('€'); - break; - - default: - retValue.Append((char)cVal); - break; - } - - i = endOff; - } - break; - case '<': - { - i = htmluni.IndexOf('>', i); - } - break; - case '\t': - break; - - default: - { - retValue.Append(htmluni[i]); - } - break; - } - } - - return retValue.ToString(); - } - - public static int CompareTimeStamp(RSSItem item1, RSSItem item2) - { - if (item1.DTTimestamp > item2.DTTimestamp) - return -1; - else - return 0; - } - } -} diff --git a/CampusAppWP8/CampusAppWP8/pages/departments/DepartmentPage.xaml b/CampusAppWP8/CampusAppWP8/pages/departments/DepartmentPage.xaml index 0b74b2f4..ccf1ad55 100644 --- a/CampusAppWP8/CampusAppWP8/pages/departments/DepartmentPage.xaml +++ b/CampusAppWP8/CampusAppWP8/pages/departments/DepartmentPage.xaml @@ -18,28 +18,22 @@ - + - + + - - + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CampusAppWP8/CampusAppWP8/pages/events/EventIndexPage.xaml.cs b/CampusAppWP8/CampusAppWP8/pages/events/EventIndexPage.xaml.cs new file mode 100644 index 00000000..95bded50 --- /dev/null +++ b/CampusAppWP8/CampusAppWP8/pages/events/EventIndexPage.xaml.cs @@ -0,0 +1,107 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Navigation; +using Microsoft.Phone.Controls; +using Microsoft.Phone.Shell; + +using CampusAppWP8.model.events_news; +using CampusAppWP8.utility; +using CampusAppWP8.Resources; +using System.Collections.ObjectModel; + +namespace CampusAppWP8.pages.events +{ + /// + /// Overview page of all events. + /// + public partial class EventIndexPage : PhoneApplicationPage + { + /// + /// Event Feed object, which contains the rss models and data. + /// + public static EventFeed eventFeed { get; set; } + + /// + /// Default constructor. + /// + public EventIndexPage() + { + InitializeComponent(); + EventIndexPage.eventFeed = new EventFeed(); + } + + /// + /// On navigation to this page, creates a FeedEventHandler and load the rss feed data. + /// + /// event args + protected override void OnNavigatedTo(NavigationEventArgs e) + { + base.OnNavigatedTo(e); + + // Set handler and load the fees informations. + EventIndexPage.eventFeed.EventHandler.FeedIsReadyEvent += new FeedEventHandler.FeedReadyHandler(SetupEventPageList); + EventIndexPage.eventFeed.LoadFeed(); + } + + /// + /// Is called after the rss feeds are loaded into the eventFeed model. + /// If there was no feed informations set to the ui, the feed list + /// will be sorted by timestamp and the buttons will be created. + /// + private void SetupEventPageList() + { + if ((EventIndexPage.eventFeed.Model != null) + && (EventIndexPage.eventFeed.Model.Channel != null) + && (EventIndexPage.eventFeed.Model.Channel.Count() >= 1) + && (this.ButtonPanel.Items.Count() == 0)) + { + // Sort the list of rssfeeds. + IEnumerable tempList = EventIndexPage.eventFeed.Model.Channel[0].item.OrderByDescending(e => e.DTTimestamp); + EventIndexPage.eventFeed.Model.Channel[0].item = new ObservableCollection(tempList); + + // Create the buttons for the fees selection and add it to the buttonpanel. + for (int i = 0; i < EventIndexPage.eventFeed.Model.Channel[0].item.Count(); i++) + { + Button tempBtn = new Button(); + tempBtn.Name = "EventRowAppButton"; + tempBtn.Content = EventIndexPage.eventFeed.Model.Channel[0].item[i].Title; + tempBtn.VerticalContentAlignment = VerticalAlignment.Stretch; + tempBtn.HorizontalContentAlignment = HorizontalAlignment.Stretch; + tempBtn.BorderThickness = new Thickness(0.0); + tempBtn.Padding = new Thickness(0.0); + tempBtn.Click += EventRowAppButton_Click; + tempBtn.Tag = i; + + this.ButtonPanel.Items.Add(tempBtn); + } + } + } + + /// + /// Return the eventFeed object. + /// + static public EventFeed GetEventFeed + { + get { return EventIndexPage.eventFeed; } + set { } + } + + /// + /// Is called on clicking on a feed button. + /// Navigates to the event pivot page with the information of the + /// selected feed index. + /// + /// pressed button object + /// event args + private void EventRowAppButton_Click(object sender, RoutedEventArgs e) + { + FrameworkElement tempElem = sender as FrameworkElement; + + NavigationService.Navigate(new Uri("/pages/events/EventPage.xaml?pivotindex=" + tempElem.Tag, UriKind.Relative)); + } + } +} \ No newline at end of file diff --git a/CampusAppWP8/CampusAppWP8/pages/events/EventPage.xaml b/CampusAppWP8/CampusAppWP8/pages/events/EventPage.xaml index f9fff42c..24b2b652 100644 --- a/CampusAppWP8/CampusAppWP8/pages/events/EventPage.xaml +++ b/CampusAppWP8/CampusAppWP8/pages/events/EventPage.xaml @@ -6,6 +6,7 @@ xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:viewModel="clr-namespace:CampusAppWP8.model.events_news" mc:Ignorable="d" FontFamily="{StaticResource PhoneFontFamilyNormal}" FontSize="{StaticResource PhoneFontSizeNormal}" @@ -13,15 +14,37 @@ SupportedOrientations="Portrait" Orientation="Portrait" shell:SystemTray.IsVisible="True"> - + + + + - + - - - - - + + + + + + + + + + + + + + + + + + + +