--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Wikipedia/RssReader.js Tue Mar 09 10:34:58 2010 +0000
@@ -0,0 +1,165 @@
+///////////////////////////////////////////////////////////////////////////////
+// RSS Reader from WRTKit examples, modified for Wikipedia widget
+
+// RSS reader class
+
+function RssReader(aFeedName, aFeedUrl, aFeedPresenter, aParent, aResponseParser){
+ this.responseParser = aResponseParser;
+ this.feedUpdateBroker = null;
+ this.feedUpdateBrokerActive = false;
+ this.feedName = aFeedName;
+ this.feedURL = aFeedUrl;
+ this.feedUpdateForced = false;
+ this.feedItemControls = [];
+ this.feedLastModified = 0;
+ this.feedPresenter = aFeedPresenter;
+ this.ignoreContent = false;
+ this.hasData = false;
+ this.startFromItem = 0;
+ this.maxItems = 0;
+ this.feedPresenter = 0;
+ if ( aFeedName != undefined ) {
+ this.init(aFeedName, aFeedUrl, aFeedPresenter, aParent, aResponseParser);
+ }
+}
+
+RssReader.prototype = new ListView(null, null);
+
+RssReader.prototype.init = function (aFeedName, aFeedUrl, aFeedPresenter, aParent, aResponseParser){
+ this.previousView = aParent;
+ this.feedPresenter = aFeedPresenter;
+ this.responseParser = aResponseParser;
+ this.feedName = aFeedName;
+ this.feedURL = aFeedUrl;
+ if (aFeedPresenter != null) {
+ this.feedPresenter = aFeedPresenter;
+ this.feedPresenter.init(this);
+ } else {
+ this.feedPresenter = new HtmlFeedPresenter(this);
+ }
+ ListView.prototype.init.call(this, null, null);
+
+ var caption = new NavigationButton(1, "titlebar.png", aFeedName, true);
+ caption.addEventListener("ActionPerformed", function(){wikiHomeView.show();});
+ this.addControl(caption);
+ // add pre-amble items (latest posts, new thread, reply etc)
+ this.feedPresenter.addPreambleItems();
+}
+
+
+// Callback function that gets called when a feed update has completed.
+RssReader.prototype.feedUpdateCompleted = function(event){
+ // remove cancel button
+ this.setupSoftKeys();
+ if (event.status == "ok") {
+ // if there aren't any feed items yet, we'll hide the progress dialog
+
+ // check if the feed has updated
+ if (event.lastModified != this.feedLastModified) {
+ // remember the last modified timestamp
+ this.feedLastModified = event.lastModified;
+
+ // feed fetched and parsed successfully
+ this.setFeedItems(event.items);
+ this.feedPresenter.addFooterItems();
+ this.focusFirst();
+ }
+ uiManager.hideNotification();
+ }
+ else if (event.status != "cancelled") {
+ // show error message
+ uiManager.showNotification(3000, "warning", "Error loading page!");
+ }
+
+ // reset the broker
+ this.feedUpdateBroker = null;
+ this.feedUpdateBrokerActive = false;
+
+ // reset commanded feed update flag
+ this.feedUpdateForced = false;
+}
+
+RssReader.prototype.focusFirst = function(){
+ // focus the first feed item control
+ // (but only if we are in the main view)
+ if (this.feedItemControls.length > 0) {
+ this.feedItemControls[0].setFocused(true);
+ }
+}
+
+// Removes feed items.
+RssReader.prototype.removeFeedItems = function (){
+ // remove all current feed items from the main view
+ for (var i = 0; i < this.feedItemControls.length; i++) {
+ this.removeControl(this.feedItemControls[i]);
+ }
+
+ // reset feed item control array
+ this.feedItemControls = [];
+}
+
+// Sets feed items.
+RssReader.prototype.addFeedItemControl = function(c){
+ this.feedItemControls.push(c);
+ this.addControl(c);
+}
+
+// Sets feed items.
+RssReader.prototype.setFeedItems = function (items){
+ // start by removing all current feed items
+ this.removeFeedItems();
+
+ if (items.length == 0) {
+ this.feedPresenter.showNoItems();
+ }
+ else {
+ // create new feed items and add them to the main view
+ // use feed item pool to recycle controls
+ for (var i = 0; i < items.length; i++) {
+ var item = items[i];
+ this.feedPresenter.show(item);
+ }
+
+ }
+ this.hasData = true;
+}
+
+
+// Update feed
+RssReader.prototype.update = function(forceFeedUpdate, notification){
+ if ( this.hasData && !forceFeedUpdate ) {
+ return;
+ }
+ this.feedUpdateForced = forceFeedUpdate;
+
+ if ( notification == undefined ) {
+ notification = true;
+ }
+
+ // check if a feed update has been scheduled, if it's time to update now,
+ // and if there's no update currently in progress and if we're in the main view
+ if ((this.feedURL != null) && (!this.feedUpdateBrokerActive) ) { //&& (uiManager.getView() == this) ) {
+ // fetch the feed from the specified URL
+ this.feedUpdateBrokerActive = true;
+ this.feedUpdateBroker = new FeedUpdateBroker();
+ this.feedUpdateBroker.startFromItem = this.startFromItem;
+ this.feedUpdateBroker.maxItems = this.maxItems;
+
+ if ( this.responseParser != null ) {
+ this.feedUpdateBroker.responseParser = this.responseParser;
+ }
+ this.feedUpdateBroker.ignoreContent = this.ignoreContent;
+ this.feedUpdateBroker.fetchFeed(this.feedURL, this);
+ // allow cancelling
+ if (window.widget) {
+ var self = this;
+ menu.setRightSoftkeyLabel("Cancel", function(){
+ self.feedUpdateBroker.cancel(); self.setupSoftKeys();
+ uiManager.hideNotification();
+ });
+ }
+ if (notification) {
+ uiManager.showNotification(-1, "wait", "Loading...", -1);
+ }
+ }
+}