!!! Listings zum Artikel
!!! "Auftritt der Helfer" von Markus Eisele,
!!! Stefan Mintert und Henning Behme
!!! iX 11/07, S.138
!!! Im Unterverzeichnis "widgets" liegt die
!!! Software für die drei Varianten
!!! Listing 1: heiseTicker.html
Heise-Newsticker
!!! Listing 2: heiseRSS.js
// Definition of Constants
var loadFeedIntervalDefault = 1800;
var numberOfDisplayItems = 5;
var loadFeedErrorDelay = 600000;
var loadFeedTimeoutDelay = 30000;
function init() {
System.Gadget.settingsUI = "settings.html";
System.Gadget.onSettingsClosed = settingsClosedFunctionGenerator();
loadFeed();
}
function loadFeed(pageTurnIntervalId) {
// page turning active? If yes, turn it off
if (pageTurnIntervalId) {
clearInterval(pageTurnIntervalId);
}
// user settings? If yes, load them
var updateInterval = loadFeedIntervalDefault;
var currentSetting = System.Gadget.Settings.read("loadFeedInterval");
if (currentSetting != "") {
updateInterval = currentSetting;
}
// load feed Ajax-style
Lokris.AjaxCall("http://www.heise.de/newsticker/heise.rdf", processRSSFunctionGenerator(updateInterval),
{errorHandler: rssErrorHandler,
timeout: loadFeedTimeoutDelay,
timeoutHandler: rssErrorHandler});
}
function processRSSFunctionGenerator(loadFeedInterval) {
return function (xmlDocument) {
var newsItems = xmlDocument.getElementsByTagName("item");
var numberOfPages = Math.ceil(newsItems.length / numberOfDisplayItems);
var showItemsInterval = Math.floor((loadFeedInterval*1000) / (numberOfPages + 1));
var showNewsItems = showNewsItemsFunctionGenerator(newsItems);
showNewsItems();
var pageTurnIntervalId = setInterval(showNewsItems,showItemsInterval);
var loadFeedTimeoutId = setTimeout("loadFeed(" + pageTurnIntervalId + ")", loadFeedInterval*1000);
var onClosed = settingsClosedFunctionGenerator(loadFeedTimeoutId,pageTurnIntervalId);
System.Gadget.onSettingsClosed = onClosed;
}
}
function rssErrorHandler(xhr) { // ...
}
function showNewsItemsFunctionGenerator(items) {
var offset = 0;
return function () {
if (offset > items.length-2) {
offset = 0;
} else {
var newsList = "";
for ( var i = offset; (i < items.length && i-offset < numberOfDisplayItems ); i++ ) {
var title = String(items[i].getElementsByTagName("title")[0].firstChild.nodeValue).substr(0,20) + " ...";
var link = items[i].getElementsByTagName("link")[0].firstChild.nodeValue;
newsList += "- " + (i+1) + ") " + title + "
";
}
offset = i;
newsList += "
";
document.getElementById("ticker").innerHTML = newsList;
}
};
}
function settingsClosedFunctionGenerator(loadFeedTimeoutId, pageTurnIntervalId) {
return function (event) {
if (event.closeAction == event.Action.commit) {
if (loadFeedTimeoutId) {
clearTimeout(loadFeedTimeoutId);
}
loadFeed(pageTurnIntervalId);
}
}
}
function loadSettings() {
var currentSetting = System.Gadget.Settings.read("loadFeedInterval");
if (currentSetting != "") {
loadIntervalInput.innerText = currentSetting;
} else {
loadIntervalInput.innerText = loadFeedIntervalDefault;
}
System.Gadget.onSettingsClosing = settingsClosing;
}
function settingsClosing(event) {
// on closing the settings dialog, save settings if action was "commit"
if (event.closeAction == event.Action.commit) {
System.Gadget.Settings.write("loadFeedInterval", loadIntervalInput.value);
}
}
!!! Listing 3: HTML für Dashboard (Mac OS X)
Heise-Newsticker
Nachrichten nicht nur aus der Welt der Computer
This could include your commercial ;-)
!!! Listing 4: Javascript für Dashboard (Mac OS X)
var feed = { title: "Heise-Nachrichten", myurl: "http://www.heise.de/newsticker/heise.rdf" };
var scrollArea, scrollbar, gDoneButton, gInfoButton;
function init () {
scrollbar = new AppleVerticalScrollbar(document.getElementById("myScrollBar"));
scrollArea = new AppleScrollArea(document.getElementById("contents"), scrollbar);
scrollArea.scrollsHorizontally = false;
scrollArea.singlepressScrollPixels = 15;
gDoneButton = new AppleGlassButton(document.getElementById("doneButton"), "Done", hidePrefs);
gInfoButton = new AppleInfoButton(document.getElementById("infoButton"), document.getElementById("front"), "white", "white", showPrefs);
scrollArea.focus();
window.onfocus = function () { scrollArea.focus(); }
window.onblur = function () { scrollArea.blur(); }
if (!window.widget) { loadFeed(); }
}
var last_updated = 0;
// Ladefunktion fuer D. Carls Ajax-Bibliothek
function loadFeed () {
var now = (new Date).getTime();
// wenn 15 Minuten seit letztem Check vorbei
if ((now - last_updated) > 900000) {
with (new Ajax()) {
url = feed.myurl;
onSuccess = xml_got;
onError = myError;
doRequest();
}
}
}
// Ladefunktion fuer S. Minterts/C. Leisegangs Lokris-Bibliothek
function loadFeed_lokris () {
var now = (new Date).getTime();
// wenn 15 Minuten seit letztem Check vorbei
if ((now - last_updated) > 900000) {
Lokris.AjaxCall(feed.url, xml_loaded());
}
}
if (window.widget) { widget.onshow = loadFeed; }
// Verarbeitung des Lokris-Ergebnisses
function xml_loaded () {
return function (xmlDocument) {
var items = xmlDocument.getElementsByTagNameNS("http://my.netscape.com/rdf/simple/0.9/", "item");
var row = "";
for ( var i = 0; i < items.length; i++ ) {
var title = String(items[i].getElementsByTagNameNS("http://my.netscape.com/rdf/simple/0.9/", "title")[0].firstChild.nodeValue).substr(0,60) + " ...";
var link = items[i].getElementsByTagNameNS("http://my.netscape.com/rdf/simple/0.9/", "link")[0].firstChild.nodeValue;
row += "";
}
document.getElementById("contents").innerHTML = row;
scrollArea.refresh();
last_updated = (new Date).getTime();
}
}
// Verarbeitung des Ajax-Aufrufs von Carl
function xml_got (txtresp, xmlresp) {
var items = xmlresp.getElementsByTagNameNS("http://my.netscape.com/rdf/simple/0.9/", "item");
var row = "";
for ( var i = 0; i < items.length; i++ ) {
var title = String(items[i].getElementsByTagNameNS("http://my.netscape.com/rdf/simple/0.9/", "title")[0].firstChild.nodeValue).substr(0,60) + " ...";
var link = items[i].getElementsByTagNameNS("http://my.netscape.com/rdf/simple/0.9/", "link")[0].firstChild.nodeValue;
row += "";
}
document.getElementById("contents").innerHTML = row;
scrollArea.refresh();
last_updated = (new Date).getTime();
}
function clickOnTitle (event, link) {
if (window.widget) {
widget.openURL (link);
} else document.location = link;
}
function clickOnFeedTitle(event) {
if (window.widget) {
widget.openURL (feed.myurl);
} else document.location = feed.myurl;
}
function myError (mymsg) {
alert(mymsg);
}
function showPrefs() {
var front = document.getElementById("front");
var back = document.getElementById("back");
if (window.widget) widget.prepareForTransition("ToBack");
front.style.display = "none";
back.style.display = "block";
if (window.widget) setTimeout('widget.performTransition();', 0);
}
function hidePrefs() { // analog zu showPrefs() - nur
// mit "ToFront" als Parameter bei prepareForTransition()
}
!!! Listing 5:
???
!!! Listing 6:
???