// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. // @dart = 2.9 part of swarmlib; /** * A simple news reader in Dart. */ class Swarm extends App { /** * Flag to insure the onLoad isn't called when callback from initializeFromUrl * could occur before the document's onload event. */ bool onLoadFired; /** Collections of datafeeds to show per page. */ Sections sections; /** The front page of the app. */ FrontView frontView; /** Observable UI state. */ SwarmState state; Swarm({bool useCannedData: false}) : onLoadFired = false { Sections.initializeFromUrl(useCannedData, (currSections) { sections = currSections; state = new SwarmState(sections); setupApp(); }); // Catch user keypresses and decide whether to use them for the // Streams app or pass them on to the browser. document.onKeyUp.listen((e) { if (frontView != null) { frontView.processKeyEvent(e); } }); } /** * Tells each data source to check the server for the latest data. */ void refresh() { sections.refresh(); // Hook up listeners about any data source additions or deletions. We don't // differentiate additions or deletions just the fact that data feeds have // changed. We might want more fidelity later. sections.sectionTitles.forEach((title) { Section section = sections.findSection(title); // TODO(terry): addChangeListener needs to return an id so previous // listener can be removed, otherwise anonymous functions // can't easily be used. See b/5063673 section.feeds.addChangeListener((data) { // TODO(jacobr): implement this. print("Refresh sections not impl yet."); }); }); } /** The page load event handler. */ void onLoad() { onLoadFired = true; super.onLoad(); setupApp(); } /** * Setup the application's world. */ void setupApp() { // TODO(terry): Should be able to spinup the app w/o waiting for data. // If the document is already loaded so we can setup the app anytime. // Otherwise, we'll wait to setup the world until the document is ready // to render. if (onLoadFired && state != null) { render(); // This call loads the initial data. refresh(); eraseSplashScreen(); } } void render() { frontView = new FrontView(this); frontView.addToDocument(document.body); } }