Wikipedia/RssReader.js
changeset 20 918767a9c8d3
equal deleted inserted replaced
19:f3521a11d878 20:918767a9c8d3
       
     1 ///////////////////////////////////////////////////////////////////////////////
       
     2 // RSS Reader from WRTKit examples, modified for Wikipedia widget
       
     3 
       
     4 // RSS reader class
       
     5 
       
     6 function RssReader(aFeedName, aFeedUrl, aFeedPresenter, aParent, aResponseParser){
       
     7 	this.responseParser = aResponseParser;
       
     8 	this.feedUpdateBroker = null;
       
     9 	this.feedUpdateBrokerActive = false;
       
    10 	this.feedName = aFeedName;
       
    11 	this.feedURL = aFeedUrl;
       
    12 	this.feedUpdateForced = false;
       
    13 	this.feedItemControls = [];
       
    14 	this.feedLastModified = 0;
       
    15 	this.feedPresenter = aFeedPresenter;
       
    16 	this.ignoreContent = false;
       
    17 	this.hasData = false;
       
    18 	this.startFromItem = 0;
       
    19 	this.maxItems = 0;
       
    20 	this.feedPresenter = 0;
       
    21 	if ( aFeedName != undefined ) {
       
    22 		this.init(aFeedName, aFeedUrl, aFeedPresenter, aParent, aResponseParser);
       
    23 	}
       
    24 }
       
    25 
       
    26 RssReader.prototype = new ListView(null, null);
       
    27 	
       
    28 RssReader.prototype.init = function (aFeedName, aFeedUrl, aFeedPresenter, aParent, aResponseParser){
       
    29 	this.previousView = aParent;
       
    30 	this.feedPresenter = aFeedPresenter;
       
    31 	this.responseParser = aResponseParser;
       
    32 	this.feedName = aFeedName;
       
    33 	this.feedURL = aFeedUrl;
       
    34 	if (aFeedPresenter != null) {
       
    35 		this.feedPresenter = aFeedPresenter;
       
    36 		this.feedPresenter.init(this);
       
    37 	} else {
       
    38 		this.feedPresenter = new HtmlFeedPresenter(this);
       
    39 	}
       
    40 	ListView.prototype.init.call(this, null, null);
       
    41 	
       
    42 	var caption = new NavigationButton(1, "titlebar.png", aFeedName, true);
       
    43 	caption.addEventListener("ActionPerformed", function(){wikiHomeView.show();});
       
    44 	this.addControl(caption);
       
    45 	// add pre-amble items (latest posts, new thread, reply etc)
       
    46 	this.feedPresenter.addPreambleItems();
       
    47 }	
       
    48 
       
    49 	
       
    50 // Callback function that gets called when a feed update has completed.
       
    51 RssReader.prototype.feedUpdateCompleted = function(event){
       
    52 	// remove cancel button
       
    53 	this.setupSoftKeys();
       
    54 	if (event.status == "ok") {
       
    55 		// if there aren't any feed items yet, we'll hide the progress dialog
       
    56 		
       
    57 		// check if the feed has updated
       
    58 		if (event.lastModified != this.feedLastModified) {
       
    59 			// remember the last modified timestamp
       
    60 			this.feedLastModified = event.lastModified;
       
    61 			
       
    62 			// feed fetched and parsed successfully
       
    63 			this.setFeedItems(event.items);			
       
    64 			this.feedPresenter.addFooterItems();
       
    65 			this.focusFirst();
       
    66 		}
       
    67 		uiManager.hideNotification();
       
    68 	}
       
    69 	else if (event.status != "cancelled") {
       
    70 		// show error message
       
    71 		uiManager.showNotification(3000, "warning", "Error loading page!");
       
    72 	}
       
    73 	
       
    74 	// reset the broker 
       
    75 	this.feedUpdateBroker = null;
       
    76 	this.feedUpdateBrokerActive = false;
       
    77 	
       
    78 	// reset commanded feed update flag
       
    79 	this.feedUpdateForced = false;
       
    80 }
       
    81 	
       
    82 RssReader.prototype.focusFirst = function(){
       
    83 	// focus the first feed item control
       
    84 	// (but only if we are in the main view)
       
    85 	if (this.feedItemControls.length > 0) {
       
    86 		this.feedItemControls[0].setFocused(true);
       
    87 	}
       
    88 }
       
    89 	
       
    90 // Removes feed items.
       
    91 RssReader.prototype.removeFeedItems = function (){
       
    92 	// remove all current feed items from the main view
       
    93 	for (var i = 0; i < this.feedItemControls.length; i++) {
       
    94 		this.removeControl(this.feedItemControls[i]);
       
    95 	}
       
    96 	
       
    97 	// reset feed item control array
       
    98 	this.feedItemControls = [];
       
    99 }
       
   100 	
       
   101 // Sets feed items.
       
   102 RssReader.prototype.addFeedItemControl = function(c){
       
   103 	this.feedItemControls.push(c);
       
   104 	this.addControl(c);
       
   105 }
       
   106 
       
   107 // Sets feed items.
       
   108 RssReader.prototype.setFeedItems = function (items){
       
   109 	// start by removing all current feed items
       
   110 	this.removeFeedItems();
       
   111 	
       
   112 	if (items.length == 0) {
       
   113 		this.feedPresenter.showNoItems();
       
   114 	}
       
   115 	else {
       
   116 		// create new feed items and add them to the main view
       
   117 		// use feed item pool to recycle controls
       
   118 		for (var i = 0; i < items.length; i++) {
       
   119 			var item = items[i];
       
   120 			this.feedPresenter.show(item);
       
   121 		}
       
   122 		
       
   123 	}
       
   124 	this.hasData = true;
       
   125 }
       
   126 	
       
   127 	
       
   128 // Update feed
       
   129 RssReader.prototype.update = function(forceFeedUpdate, notification){
       
   130 	if ( this.hasData && !forceFeedUpdate ) {
       
   131 		return;
       
   132 	}		
       
   133 	this.feedUpdateForced = forceFeedUpdate;
       
   134 	
       
   135 	if ( notification == undefined ) {
       
   136 		notification = true;
       
   137 	}
       
   138 	
       
   139 	// check if a feed update has been scheduled, if it's time to update now,
       
   140 	// and if there's no update currently in progress and if we're in the main view
       
   141 	if ((this.feedURL != null) && (!this.feedUpdateBrokerActive) ) { //&& (uiManager.getView() == this) ) {
       
   142 		// fetch the feed from the specified URL
       
   143 		this.feedUpdateBrokerActive = true;
       
   144 		this.feedUpdateBroker = new FeedUpdateBroker();
       
   145 		this.feedUpdateBroker.startFromItem = this.startFromItem;
       
   146 		this.feedUpdateBroker.maxItems = this.maxItems;
       
   147 		
       
   148 		if ( this.responseParser != null ) {
       
   149 			this.feedUpdateBroker.responseParser = this.responseParser;
       
   150 		}
       
   151 		this.feedUpdateBroker.ignoreContent = this.ignoreContent;
       
   152 		this.feedUpdateBroker.fetchFeed(this.feedURL, this);
       
   153 		// allow cancelling
       
   154 	    if (window.widget) {
       
   155 			var self = this;
       
   156 			menu.setRightSoftkeyLabel("Cancel", function(){
       
   157 				self.feedUpdateBroker.cancel(); self.setupSoftKeys();
       
   158 				uiManager.hideNotification();
       
   159 				});
       
   160 	    }
       
   161 		if (notification) {
       
   162 			uiManager.showNotification(-1, "wait", "Loading...", -1);
       
   163 		}
       
   164 	}
       
   165 }