!!! 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 = ""; 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)
hintergrund
Heise-Newsticker
Nachrichten nicht nur aus der Welt der Computer
hintergrund
heise online

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 += "
" + title + "
"; } 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 += "
" + title + "
"; } 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: ???