author | ivanl |
Tue, 21 Jul 2009 12:22:37 +0100 | |
changeset 11 | aaba47256eea |
parent 10 | 07ac2f6a36a9 |
child 13 | 3a1db8573f1e |
permissions | -rw-r--r-- |
0 | 1 |
/////////////////////////////////////////////////////////////////////////////// |
2 |
// RSS Reader from WRTKit examples, modified for Symbian.org |
|
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.ignoreContent = false; |
|
16 |
this.hasData = false; |
|
17 |
this.startFromItem = 0; |
|
18 |
this.maxItems = 0; |
|
10
07ac2f6a36a9
1.0rc10 Fixes annoyances and buglets in reading forums and blog.
ivanl
parents:
2
diff
changeset
|
19 |
this.escapeLtGt = true; |
0 | 20 |
|
21 |
var caption = createCaption(aFeedName); |
|
22 |
||
23 |
ListView.prototype.init.call(this, null, caption); |
|
24 |
this.previousView = aParent; |
|
25 |
if (aFeedPresenter != null) { |
|
26 |
this.feedPresenter = aFeedPresenter; |
|
27 |
this.feedPresenter.init(this); |
|
28 |
} else { |
|
29 |
this.feedPresenter = new HtmlFeedPresenter(this); |
|
30 |
} |
|
31 |
||
32 |
// add pre-amble items (latest posts, new thread, reply etc) |
|
33 |
this.feedPresenter.addPreambleItems(); |
|
34 |
} |
|
35 |
||
36 |
RssReader.prototype = new ListView(null, null); |
|
37 |
||
38 |
// Callback function that gets called when a feed update has completed. |
|
39 |
RssReader.prototype.feedUpdateCompleted = function(event){ |
|
40 |
// remove cancel button |
|
41 |
this.setupSoftKeys(); |
|
42 |
if (event.status == "ok") { |
|
43 |
// if there aren't any feed items yet, we'll hide the progress dialog |
|
44 |
||
45 |
// check if the feed has updated |
|
46 |
if (event.lastModified != this.feedLastModified) { |
|
47 |
// remember the last modified timestamp |
|
48 |
this.feedLastModified = event.lastModified; |
|
49 |
||
50 |
// feed fetched and parsed successfully |
|
51 |
this.setFeedItems(event.items); |
|
52 |
||
53 |
// focus the first feed item control |
|
54 |
// (but only if we are in the main view) |
|
55 |
if (this.feedItemControls.length > 0 ) { |
|
56 |
this.feedItemControls[0].setFocused(true); |
|
57 |
} |
|
58 |
} |
|
59 |
uiManager.hideNotification(); |
|
60 |
} |
|
61 |
else if (event.status != "cancelled") { |
|
62 |
// show error message |
|
2 | 63 |
uiManager.showNotification(3000, "warning", "Error while updating feed!"); |
0 | 64 |
} |
65 |
||
66 |
// reset the broker |
|
67 |
this.feedUpdateBroker = null; |
|
68 |
this.feedUpdateBrokerActive = false; |
|
69 |
||
70 |
// reset commanded feed update flag |
|
71 |
this.feedUpdateForced = false; |
|
72 |
} |
|
73 |
||
74 |
// Removes feed items. |
|
75 |
RssReader.prototype.removeFeedItems = function (){ |
|
76 |
// remove all current feed items from the main view |
|
77 |
for (var i = 0; i < this.feedItemControls.length; i++) { |
|
78 |
this.removeControl(this.feedItemControls[i]); |
|
79 |
} |
|
80 |
||
81 |
// reset feed item control array |
|
82 |
this.feedItemControls = []; |
|
83 |
} |
|
84 |
||
85 |
||
86 |
// Sets feed items. |
|
87 |
RssReader.prototype.setFeedItems = function (items){ |
|
88 |
// start by removing all current feed items |
|
89 |
this.removeFeedItems(); |
|
90 |
||
91 |
if (items.length == 0) { |
|
92 |
this.feedPresenter.showNoItems(); |
|
93 |
} |
|
94 |
else { |
|
95 |
// create new feed items and add them to the main view |
|
96 |
// use feed item pool to recycle controls |
|
97 |
for (var i = 0; i < items.length; i++) { |
|
98 |
var item = items[i]; |
|
99 |
this.feedPresenter.show(item); |
|
100 |
} |
|
101 |
||
102 |
} |
|
103 |
this.hasData = true; |
|
104 |
} |
|
105 |
||
106 |
||
107 |
// Update feed |
|
108 |
RssReader.prototype.update = function(forceFeedUpdate){ |
|
109 |
if ( this.hasData && !forceFeedUpdate ) { |
|
110 |
return; |
|
111 |
} |
|
112 |
this.feedUpdateForced = forceFeedUpdate; |
|
113 |
||
114 |
// check if a feed update has been scheduled, if it's time to update now, |
|
115 |
// and if there's no update currently in progress and if we're in the main view |
|
116 |
if ((this.feedURL != null) && (!this.feedUpdateBrokerActive) ) { //&& (uiManager.getView() == this) ) { |
|
117 |
// fetch the feed from the specified URL |
|
118 |
this.feedUpdateBrokerActive = true; |
|
119 |
this.feedUpdateBroker = new FeedUpdateBroker(); |
|
10
07ac2f6a36a9
1.0rc10 Fixes annoyances and buglets in reading forums and blog.
ivanl
parents:
2
diff
changeset
|
120 |
this.feedUpdateBroker.escapeLtGt = this.escapeLtGt; |
0 | 121 |
this.feedUpdateBroker.startFromItem = this.startFromItem; |
122 |
this.feedUpdateBroker.maxItems = this.maxItems; |
|
123 |
||
124 |
if ( this.responseParser != null ) { |
|
125 |
this.feedUpdateBroker.responseParser = this.responseParser; |
|
126 |
} |
|
127 |
this.feedUpdateBroker.ignoreContent = this.ignoreContent; |
|
128 |
this.feedUpdateBroker.fetchFeed(this.feedURL, this); |
|
129 |
// allow cancelling |
|
130 |
if (window.widget) { |
|
131 |
var self = this; |
|
132 |
menu.setRightSoftkeyLabel("Cancel", function(){ |
|
133 |
self.feedUpdateBroker.cancel(); self.setupSoftKeys(); |
|
134 |
uiManager.hideNotification(); |
|
135 |
}); |
|
136 |
} |
|
137 |
uiManager.showNotification(-1, "wait", "Loading feed...", -1); |
|
138 |
} |
|
139 |
} |