20
|
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 |
}
|